1 预备工作
1.1 添加编译参数
1 | gcc -g |
只有在编译的时候添加了-g这个参数,才能够使用gdb进行调试。可以使用-O0,避免某些变量被优化
2 调试过程
2.1 调试新进程
gdb 程序名称
2.2 调试已有进程
使用命令 gdb attach pid,跟踪现有进程,也可使用gdb -p pid, 输入bt,直接查看当前进程运行到哪里
2.3 常用命令
- 单步调式 s,全称step,意味着每个函数都会进入
- 单步调试 n, 全称next,不会进入函数
- 打印变量 p, 全称print,可以打印各种变量的值,打印二进制 p/t xxx
- 继续进程 c, 全称continue,设置好断点后,继续运行,直到发生断点
- 设置断点 b, 全称breakpoint,可设置函数断点也可以设置代码行号断点
- 打印堆栈 bt, 全称backtrace, 打印当前函数调用栈
- 退出当前函数栈 finish, 当使用s命令进入到某个函数后,可以使用finish指令退出当前函数
- 设置命令行参数 set args, 若函数需要argv,args,可以使用此命令设置
- 跳转到指定调用栈 f (0…N), 后面跟随栈层,伴随bt命令使用,首先使用bt参看当前函数调用栈,然后使用f命令查看对应栈的信息
- 显示隐藏字符串set print elements 0,字符串过长的情况下使用p打印会以…结束,无法完整显示,使用此命令可以显示完全
- 条件断点 b point if condition,条件满足才会触发中断
- 监控某个值 watch,值改变就会触发中断,也可监控某个内存地址,watch *(内存地址),适用于跟踪一些全局的结构体指针。
- 跳转到指定行 until 行号,对于跳出循环很有用
- 格式化打印printf fmt, var,类似于C语言的库函数 printf “%s”, str
- 打印错误号: p errno
- 设置变量set $a
- while循环以end结束
- layout src, 加载源码
- info local, 打印当前帧所有局部变量
- p ‘a.c’::xx,打印其他文件的全局变量
- p *a@123, 打印以a开始的123字节,需要配合10使用
- info args,打印函数入参
- r,运行程序
3 总结
以上就是gdb调试常用命令,大多数场景都能应用。