你如何使用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?的主要内容,如果未能解决你的问题,请参考以下文章