GDB一些命令的简单介绍

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

1. 主要功能:

启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;
可让被调试的程序在你所指定的调置的断点处停住;
当程序被停住时,可以检查此时你的程序中所发生的事;
动态的改变你程序的执行环境;
更详细的大家可以百度、谷歌一下

2. 我们先讲一下gdb的暂停机制:

跟断点相关的point主要有三种:
断点:通知GDB在程序中的特定位置暂停执行
监视点:通知GDB当特定内存的值发生变化时暂停执行
捕获点:通知GDB当特定事件发生时暂停执行
其中断点(breakpoint)和监视点(watchpoint)是需要用户手动加的,捕获点是GDB根据加的断点或是监视点去捕获的。


2.1 如何加断点

break ——在当前文件的当前位置加断点
break line_num ——在当前文件的第line_num行加断点
break filename:line_num ——在指定的文件filename中的第line_num行加断点
break function_name ——在函数function_nam的位置上加断点
break filename:function_name ——在指定的文件filename中的函数function_name加断点

查看断点信息:
info break

2.2 其他类型的断点

2.2.1 条件断点:满足某个条件程序才会暂停执行

有两种方式加条件断点:
break 10
condition 1 i==20
等价于 
break 10 if i==20

2.2.2 临时断点:断点最多只能被捕获一次

加临时断点的命令是tbreak,命令格式和break一样。


2.3 失效或删除断点

2.3.1 生、失效断点

失效命令是disable,具体格式:
disable ——表示使所有的断点失效
disable  breakpoint_list ——表示使指定的断点失效
生效命令是enable,具体格式:
enable ——表示使所有的断点生效
enable breakpoint_list ——表示使指定的断点失效


2.3.2 删除断点

删除断点有两个命令,delete和clear,具体格式如下:
delete:
delete ——表示删除断点
delete breakpoint_list ——表示删除指定的断点
clear:
clear ——删除将执行的下一个指令处的断点
clear line_num /function_name ——删除指定位置的断点

2.4 恢复断点

总共以下几种:
单步执行:可以用next或是step命令,具体区别可以查一下;
使用continue恢复程序运行;
使用finish恢复程序执行:直接将当前函数执行到返回为止;
使用until恢复程序的执行:与for循环相关,直接执行完for循环


2.5 断点编程

断点命令列表:
commands breakpoint_num
>print n
>…
>end
定义一个命令:
define cmd_name
>…
>end


2.6 监视点:监视点可以监视某段内存的情况

具体命令格式为:
watch i ——当i的值有变动的时候,程序会暂停执行
watch (i>10) ——当i的值大于10的时候,程序会暂停执行


3. 检查和设置变量

print var_name ——打印变量var_name,查看该变量的值
set var_name ——设置变量var_name的值
display var_name ——在断点处显示变量var_name的值


刚才忘了说这2个命令,有兴趣的可以看下

info reg ——查看当线程的寄存器信息
disassemble function_name ——查看某函数的汇编实现


以上是一些gdb调试的简单命令,如果需要用GDB调试core文件,或是多线程,请参看下面两篇博客:

GDB调试core文件

GDB调试多线程程序

### 定义和使用 GDB 自定义命令GDB 中,可以通过 `.gdbinit` 文件或者交互式会话来定义自定义命令。以下是关于如何定义、查看以及操作这些自定义命令的具体方法。 #### 创建自定义命令 通过 `define` 关键字可以创建一个新的自定义命令。其基本语法如下: ```plaintext define <command> <code> end ``` 其中 `<command>` 是新命令的名字,而 `<code>` 则是该命令要执行的一系列指令[^2]。 例如,如果想创建一个名为 `hello` 的简单命令,可以在 `.gdbinit` 文件中写入以下内容: ```plaintext define hello echo Hello, world!\n end ``` 这样,在启动 GDB 后就可以运行 `hello` 命令并打印出 “Hello, world!”。 #### 获取自定义命令的参数 当需要让自定义命令接受外部输入作为参数时,可利用 `$argc` 和 `$argX` 这些特殊变量。具体来说: - `$argc`: 表示传递给当前命令的实际参数数量。 - `$arg0`, `$arg1`, ..., `$argN`: 对应于传入的各个位置上的参数值[^3]。 下面是一个例子,展示了一个带有两个参数的加法器实现方式: ```plaintext define add if $argc != 2 echo Usage: add number1 number2\n else set var result = ($arg0 + $arg1) printf "Result is %d\n", result end end ``` 此脚本检查是否有恰好两个参数被提供;如果没有,则显示帮助信息。如果有,则计算它们之和并将结果显示出来。 #### 条件分支与循环控制 为了增强灵活性,还可以引入简单的逻辑判断语句到我们的宏里去。比如上面提到过的 `if...else...endif` 结构就是一种典型的条件测试形式。另外还有支持有限次迭代处理的小型循环机制可用 —— 即所谓的 `while` 循环 (注意这里的 while 并不像高级语言那样强大)[^2]: ```plaintext set count=5 while $count > 0 printf "%d ", $count set count=$count-1 end printf "\n" ``` 这段代码将会倒序输出从 5 开始直到 1 的整数值序列。 #### 执行存储于文件内的批量命令 有时候可能希望把多个复杂步骤封装起来保存成单独的一个文本文档供以后重复调用。这时就需要借助 source 指令加载指定路径下的额外配置项了: ```bash source /path/to/your_script.gdb ``` 这允许我们将所有的个性化设置集中管理在一个地方而不是每次都手动敲一遍相同的初始化过程[^2]。 --- ### 总结 综上所述,GDB 提供了一套非常方便易用的方法让用户能够快速构建起属于自己的专属调试工具集。无论是基础功能扩展还是高级特性集成都可以轻松达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值