来源 :本文是针对《 GDB 完全手册》的学习笔记
说明 : 1. 在使用 gdb 时,需要对要编译调试的源文件加 –g 参数进行编译。也可以在 makefile 中定义 CFLAGS 变量: CFLAGS = -g 。
2. 命令后,括号里的内容表示对这个命令的缩写。
3. 调试程序中直接回车表示重复执行上一条命令。
4. gdb 的功能很强大,这里只是列举出使用频率较高的一些命令。
5. 学习笔记定位于完全不懂 gdb 的人,如果想知道 gdb 更多的用法,参考《 GDB 完全手册》或者 Linux 中自带的 gdb 帮助文档。
gdb 可以完成如下的任务:
1. 设置断点; 2. 监视程序变量的值; 3. 程序的单步执行; 4 修改变量的值。
使用总结 :
1. 启动 gdb 调试生成的可执行文件: gdb ./ 可执行文件名。
2. 指定运行程序的参数: set args 运行时的参数。
显示运行程序的参数: show args 。
3. 列出源代码命令: list ( l )
list : 显示当前行后的源代码。
list- : 显示当前行前的源代码。
list 行号: 显示行号附近的源代码。
list 函数名字: 显示函数附近的源代码。
list 起始行号,终止行号: 显示这个范围内源代码。
list +offset : 显示当前行号正偏移量的源代码。
list -offset : 显示当前行号负偏移量的源代码。
4. 运行程序: run ( r )
5. 暂停程序的运行(主要分为三个部分):
info 被调试程序 :产看程序是否在运行,进程号,被暂停原因。
5.1 设置断点: 程序停下时并未执行当前语句。
break ( b ) 行号;
break ( b ) 函数名;
break ( b ) +offset :在当前行号正偏移量设置断点。
break ( b ) -offset :在当前行号负偏移量设置断点。
break ( b ) if 条件语句:当满足条件语句的时候程序停。
查看断点信息: info break 。
删除断点: delete ( d ) 断点号。
使断点有效或者无效: disable /enable 断点号。
5.2 设置观察点:观察某个表达式的值是否有变化,如果有程序暂停执行。
watch 表达式:当表达式程序有变化时,程序暂停执行。
rwatch 表达式:当表达式被读时,程序暂停执行。
awatch 表达式:当表达式被写时,程序暂停执行。
察看观察点信息: info watch
5.3 设置捕捉点:捕捉程序运行时的一些事件,例如 载入共享库(动态链接库), C++ 异常等
catch 表达式 或 tcatch 表达式
5.4 维护停止点:
clear : 清除所有已设置的停止点。
clear 函数名 : 清除设置在该函数上的停止点。
clear 行号 : 清除该行号上的停止点。
6. 恢复程序的运行:
continue ( c 或 fg )忽略断点的次数
7. 单步调试:
step < 执行的行数 > :如果有函数调用,则会进入该函数。
stepi ( si ) :单步跟踪一条机器指令。
next ( n ) :如果有函数调用,不会进入该函数。
nexti ( ni ) :单步跟踪一条机器指令。
8. 自动显示变量:
display
9. 察看寄存器:
info registers
10. 打印变量的值(这个命令也可以设置一个变量的值)
print ( p )变量名
11. 显示变量对应的类型:
whatis var :var 代表变量名字,可以显示变量对应的类型。
12. 察看函数堆栈:
backtrace ( bt ) +offset :栈顶 offset 层的信息。
backtrace ( bt ) -offset :栈底 offset 层的信息。
13. 察看函数执行到哪里:
where :显示目前执行的代码,会给出内存地址。
14. 退出函数:
finish : 返回当前函数返回时堆栈地址,返回值,参数值等信息。
15. 动态改变程序的执行顺序:
jump 或者 call 命令。
16. 退出 gdb :
quit ( q )
总结:
写程序时一门艺术,调试程序更是一门艺术。