GDB调试技巧

1 预备工作

1.1 添加编译参数

1
gcc -g

只有在编译的时候添加了-g这个参数,才能够使用gdb进行调试。可以使用-O0,避免某些变量被优化

2 调试过程

2.1 调试新进程

gdb 程序名称

2.2 调试已有进程

使用命令 gdb attach pid,跟踪现有进程,也可使用gdb -p pid, 输入bt,直接查看当前进程运行到哪里

2.3 常用命令

  1. 单步调式 s,全称step,意味着每个函数都会进入
  2. 单步调试 n, 全称next,不会进入函数
  3. 打印变量 p, 全称print,可以打印各种变量的值,打印二进制 p/t xxx
  4. 继续进程 c, 全称continue,设置好断点后,继续运行,直到发生断点
  5. 设置断点 b, 全称breakpoint,可设置函数断点也可以设置代码行号断点
  6. 打印堆栈 bt, 全称backtrace, 打印当前函数调用栈
  7. 退出当前函数栈 finish, 当使用s命令进入到某个函数后,可以使用finish指令退出当前函数
  8. 设置命令行参数 set args, 若函数需要argv,args,可以使用此命令设置
  9. 跳转到指定调用栈 f (0…N), 后面跟随栈层,伴随bt命令使用,首先使用bt参看当前函数调用栈,然后使用f命令查看对应栈的信息
  10. 显示隐藏字符串set print elements 0,字符串过长的情况下使用p打印会以…结束,无法完整显示,使用此命令可以显示完全
  11. 条件断点 b point if condition,条件满足才会触发中断
  12. 监控某个值 watch,值改变就会触发中断,也可监控某个内存地址,watch *(内存地址),适用于跟踪一些全局的结构体指针。
  13. 跳转到指定行 until 行号,对于跳出循环很有用
  14. 格式化打印printf fmt, var,类似于C语言的库函数 printf “%s”, str
  15. 打印错误号: p errno
  16. 设置变量set $a
  17. while循环以end结束
  18. layout src, 加载源码
  19. info local, 打印当前帧所有局部变量
  20. p ‘a.c’::xx,打印其他文件的全局变量
  21. p *a@123, 打印以a开始的123字节,需要配合10使用
  22. info args,打印函数入参
  23. r,运行程序

3 总结

以上就是gdb调试常用命令,大多数场景都能应用。