你如何使用gdb?

16 c c++ gdb

我决定了解我们的C/C +*nix从业者如何使用gdb调试器.

这是我通常使用的:

  1. b - break filename.c:line#,function,filename.cpp:function,className :: Member
  2. n,c,s - 下一步继续
  3. gdb program name => set breakpoints ==> run [parameter list](我这样做是为了在程序启动前设置断点)
  4. l - 列出周围的源代码.
  5. 附加processID 6 break [location]
  6. gdb programName corefile.core(检查app崩溃的原因)
  7. 我有时也会在退出函数(break exit)中设置断点来检查程序堆栈
  8. info b检查所有断点
  9. 清除[断点列表]

你如何使用它?

tr9*_*9sh 12

除了已发布的内容我还使用:

  • STL容器的.gdbinit文件
  • signal SIGNAL noprint nostop 对于一些在调试时没有实际意义的自定义信号
  • C-Casts取消引用指针
  • 捕获点(捕获投掷,捕获捕获)
  • 条件有条件BREAK-和观察点
  • 很少用gdbserver进行远程调试
  • gdb 程序 coredump,用于那些令人尴尬的段错误;)

PS:我个人喜欢gdb btw的一个原因.它支持几乎所有东西的标签完成(gdb命令,符号表中的符号,函数,成员函数等).在我看来,这是一个相当好的生产力提升.


小智 10

脚本是一个很好的GDB功能.

  1. 首先设置一个断点,如:b someFunction \n.
  2. 然后运行command:commands \n.GDB将要求该断点的命令.
  3. 常见的情况是打印一些值然后继续,所以你将输入:p someVar \n continue \n.
  4. 要结束脚本,请按:Ctrl-D

运行程序后,您将看到在发生断点时偶尔执行脚本.

  • 对于具有更好脚本支持的更好的gdb,请参阅python中的PythonGdb - gdb scritable (2认同)

ASk*_*ASk 5

我认为最有用的gdb命令(除了已经列出的所有命令):

  • info threads - 有关线程的信息
  • 线程N - 切换到线程N.
  • 抓住 - 抛出任何抛出的异常.当你在堆栈解开后才捕获到bug时很有用.
  • printf,print - 检查任何和所有表达式,printf接受C风格的格式说明符

最后,如果通过慢速链接进行调试,则可能会使用文本UI.要使用它,请使用--tui命令行开关启动gdb .