你如何使用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. 清除[断点列表]

你如何使用它?

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

  • info threads – 有关线程的信息
  • 线程N – 切换到线程N.
  • 抓住 – 抛出任何抛出的exception。 当你在堆栈解开后才发现错误时很有用。
  • printfprint – 检查任何和所有表达式,printf接受C样式格式说明符

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

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

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

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

脚本是一个很好的GDBfunction。

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

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

gdb不是我的专长,但这是我使用的:

  • bt列出一个堆栈
  • updown移动堆栈
  • until达到一个数字大于电流的行 – 用于退出循环
  • watch [expr]在expr更改时中断程序

…但主要是我使用ddd作为gdb的前端

键入Ctrl-X Ctrl-A以打开包含源预览的简单窗口。

前段时间我找到了cgdb:

http://cgdb.sourceforge.net/

这是一个基于curses(颜色控制台)的gdb前端,当我被限制在控制台窗口中进行调试时,这让我的生活更加快乐。

请参阅http://sources.redhat.com/gdb/current/onlinedocs/gdb_toc.html上的用户指南。

还有一些与调试没有直接关系的用途。 例如,它可用于C表达式评估:

 (gdb)printf“%lu \ n”,(无符号长)( -  3L)
 4294967293

我使用gdb -tui开关来获得一个很棒的“文本用户界面”(文本模式中的一种gui)。 它支持多个窗口,并且通常比使用’list’命令更友好(因为它在sep窗口中显示源)

使用gdb的初学者会感觉很难。 但是有基于GUI的工具DDD(数据显示调试器),它与gdb相同。 你有一个控制台在底部运行gdb命令和顶部3/4部分将是代码。 你可以选择学习和理解命令和流程