你如何使用gdb?

Posted

技术标签:

【中文标题】你如何使用gdb?【英文标题】:How do you use gdb? 【发布时间】:2009-06-08 19:09:54 【问题描述】:

我决定了解我们的 C/C+ *nix 实践者如何使用 gdb 调试器。

这是我通常使用的:

    b - 中断 filename.c:line #, function, filename.cpp:function, className::Member n, c, s -- 下一步继续 gdb 程序名 => 设置断点 ==> 运行[参数列表](我这样做是为了在程序启动前设置断点) l - 列出周围的源代码。 附加进程ID 6 休息 [地点] gdb programName corefile.core(检查应用崩溃的原因) 我有时也会在退出函数(break exit)处设置断点来检查程序堆栈 info b 检查所有断点 清除[断点列表]

你如何使用它?

【问题讨论】:

这很有帮助。为什么不至少让它成为一个社区维基? 【参考方案1】:

除了已经发布的东西我还使用:

用于 STL 容器的 .gdbinit 文件 signal SIGNAL noprint nostop 用于调试时不感兴趣的一些自定义信号 C-Cast 以取消引用指针 捕捉点(接球,接球) condition 用于条件断点和观察点 很少gdbserver用于远程调试 gdb program coredump,对于那些令人尴尬的段错误;)

PS:顺便说一句,我个人喜欢 gdb 的原因之一。是它支持几乎所有东西的制表符补全(gdb 命令、符号表中的符号、函数、成员函数等)。在我看来,这是一个相当不错的生产力提升。

【讨论】:

【参考方案2】:

Scripting 是一个不错的 GDB 功能。

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

运行程序后你会看到你的脚本偶尔会在断点发生时执行。

【讨论】:

要获得更好的 gdb 和更好的脚本支持,请参阅 PythonGdb - gdb scritable in python【参考方案3】:

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

线程信息 - 关于线程的信息 线程N - 切换到线程N catch throw - 中断任何抛出的异常。当您仅在堆栈展开后发现错误时很有用。 printf,print - 检查所有表达式,printf 接受 C 风格的格式说明符

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

【讨论】:

【参考方案4】:

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

bt列出一个堆栈 up, down 在堆栈中移动 until 继续直到到达数量大于当前的行——用于退出循环 watch [expr] expr 变化时中断程序

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

【讨论】:

我也使用 ddd :)...欢迎和鼓励任何有关 ddd 的提示...谢谢【参考方案5】:

键入 Ctrl-X Ctrl-A 打开一个带有源代码预览的简单窗口。

【讨论】:

【参考方案6】:

前段时间我发现了cgdb:

http://cgdb.sourceforge.net/

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

【讨论】:

【参考方案7】:

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

【讨论】:

您会推荐用户指南中的具体提示吗?谢谢【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我使用gdb -tui 开关来实现出色的“文本用户界面”(一种文本模式下的 gui)。它支持多个窗口,通常比使用“列表”命令更友好(因为它在 sep 窗口中显示源代码)

【讨论】:

也就是说,当我不在 emacs 中使用 gdb 时,我使用 tui 模式(这是我通常做的:)【参考方案10】:

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

【讨论】:

以上是关于你如何使用gdb?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GDB 在内存空间中查找引用某个地址的所有指针?

linux下如何使用gdb调试

如何使用 gdb 探索堆栈/堆?

如何使用 GDB 检查堆栈帧?

如何在 Eclipse CDT 中使用 GDB 控制台?

如何将 gdb 与 LD_PRELOAD 一起使用