你如何使用gdb?

时间:2009-06-08 19:09:54

标签: 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程序名称=>设置断点==>运行[参数列表](我这样做是为了在程序启动前设置断点)
  4. l - 列出周围的源代码。
  5. 附加processID 6休息[位置]
  6. gdb programName corefile.core(检查app崩溃的原因)
  7. 我有时也会在退出函数(break exit)中设置断点来检查程序堆栈
  8. info b检查所有断点
  9. 清除[断点列表]
  10. 你如何使用它?

10 个答案:

答案 0 :(得分:12)

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

  • STL容器的.gdbinit文件
  • signal SIGNAL noprint nostop查看调试时没有真正意义的自定义信号
  • C-Casts取消引用指针
  • 抓点(抓住抓住,抓住抓住)
  • 条件中断点和观察点的
  • 条件
  • 很少 gdbserver 进行远程调试
  • gdb 程序 coredump ,对于那些令人尴尬的段错误;)
PS:我个人喜欢gdb btw的一个原因。它支持几乎所有东西的标签完成(gdb命令,符号表中的符号,函数,成员函数等)。在我看来,这是一个相当好的生产力提升。

答案 1 :(得分:10)

脚本是一个不错的GDB功能。

  1. 首先设置断点,例如:b someFunction \ n。
  2. 然后运行command:commands \ n。 GDB将要求为该断点发出命令。
  3. 常见情况是打印一些值然后继续,所以你将输入:p someVar \ n continue \ n。
  4. 要结束脚本,请按:Ctrl-D
  5. 运行程序后,您会看到在发生断点时偶尔执行脚本。

答案 2 :(得分:5)

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

  • 信息主题 - 有关主题的信息
  • 主题 N - 切换到主题 N
  • 抓住 - 打破任何抛出的异常。当你在堆栈解开后才发现错误时很有用。
  • printf 打印 - 检查所有和所有表达式,printf接受C样式格式说明符

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

答案 3 :(得分:4)

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

  • bt列出一个堆栈
  • updown在堆栈中移动
  • until继续,直到达到数字大于当前数量的行 - 用于退出循环
  • watch [expr]在expr更改时中断程序

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

前段时间我找到了cgdb:

http://cgdb.sourceforge.net/

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

答案 6 :(得分:1)

答案 7 :(得分:1)

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

(gdb) printf "%lu\n", (unsigned long)(-3L)
4294967293

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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