你如何使用gdb?
我决定了解我们的C / C + * nix从业者如何使用gdb调试器。
这是我通常使用的:
- b – break filename.c:line#,function,filename.cpp:function,className :: Member
- n,c,s – 下一步继续
- gdb program name => set breakpoints ==> run [parameter list](我这样做是为了在程序启动前设置断点)
- l – 列出周围的源代码。
- 附加processID 6 break [location]
- gdb programName corefile.core(检查app崩溃的原因)
- 我有时也会在退出函数(break exit)中设置断点来检查程序堆栈
- info b检查所有断点
- 清除[断点列表]
你如何使用它?
我认为最有用的gdb命令(除了已经列出的所有命令):
- info threads – 有关线程的信息
- 线程N – 切换到线程N.
- 抓住 – 抛出任何抛出的exception。 当你在堆栈解开后才发现错误时很有用。
- printf , print – 检查任何和所有表达式,printf接受C样式格式说明符
最后,如果通过慢速链接进行调试,则可能会使用文本UI。 要使用它,请使用--tui
命令行开关启动gdb。
除了已发布的内容我还使用:
- STL容器的.gdbinit文件
-
signal SIGNAL noprint nostop
用于调试时没有真正感兴趣的一些自定义信号 - C-Casts取消引用指针
- 捕获点(捕获投掷,捕获捕获)
- 条件断点和观察点的条件
- 很少用gdbserver进行远程调试
- gdb 程序 coredump ,用于那些令人尴尬的段错误;)
PS:我个人喜欢gdb btw的一个原因。 它支持几乎所有东西的标签完成(gdb命令,符号表中的符号,函数,成员函数等)。 在我看来,这是一个相当好的生产力提升。
脚本是一个很好的GDBfunction。
- 首先设置一个断点,如:b someFunction \ n。
- 然后运行command:commands \ n。 GDB将要求该断点的命令。
- 常见的情况是打印一些值然后继续,所以你将输入:p someVar \ n continue \ n。
- 要结束脚本,请按:Ctrl-D
运行程序后,您将看到在发生断点时偶尔执行脚本。
gdb不是我的专长,但这是我使用的:
-
bt
列出一个堆栈 -
up
,down
移动堆栈 -
until
达到一个数字大于电流的行 – 用于退出循环 -
watch [expr]
在expr更改时中断程序
…但主要是我使用ddd作为gdb的前端
键入Ctrl-X Ctrl-A以打开包含源预览的简单窗口。
请参阅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部分将是代码。 你可以选择学习和理解命令和流程