你如何使用gdb来调试你的代码?

时间:2008-09-26 15:27:40

标签: debugging gdb

作为开发人员,您如何使用gdb来跟踪代码中的错误?你用什么技巧来让你的生活更轻松?

7 个答案:

答案 0 :(得分:3)

一些提示:

  • 使用图形前端(kdbg相当不错,ddd至少比命令行gdb好,kdevelop有一个不错的gdb前端但是有一些bgs,nemiver看起来还不错,但仍在开发中)
  • 确保所有重要部分(您自己的代码以及一些系统库)都有调试符号和源代码
    • 在RedHat上,您可以安装-debuginfo包,使符号和源代码神奇地出现在调试器中 - 真的很酷,因为您可以查看libc函数调用等。
    • 在Debian / Ubuntu上,你可以安装-dbg包来获取符号;虽然
    • ,但为系统软件包安装适当的源文件似乎很困难
  • 我倾向于在不应该到达的地方或者我想要学习的地方(某种重量级的断点)添加assert()和abort()调用。
  • 理想情况下,assert()或abort()调用应该包含在某些只在调试版本中启用它们的方法或宏中,或者更好的是只在设置了某个env var时启用它们
  • 为SIGSEGV和SIGABRT安装信号处理程序;我个人在安装处理程序之前检查是否设置了某个env var;在处理程序中,我执行一个硬编码的外部命令,该命令通常位于〜/ .local / bin /中;然后该命令可以启动kdbg并将其附加到崩溃的应用程序。瞧,调试器弹出你的应用程序做坏事的那一刻。
  • 如果您使用单元测试,则可以在测试用例失败时附加调试器,然后检查应用程序。

答案 1 :(得分:2)

一般来说,你会找到一些不应该是的东西,然后向后工作直到你明白为什么。

最明显的是最有用的:在函数或行号上设置断点并逐行遍历代码。

另一个方便的提示是为所有结构/对象提供show函数,即使它们从未在程序中使用过,因为你可以在gdb中运行这些函数:

gdb> p show_my_struct(struct)

My custom display of Foo:
   ...

观察点也非常方便,但可能会大大减慢您的程序速度。当变量或地址的值发生变化时,这些会中断流程:

gdb> watch foo
Watchpoint4: foo
gdb>

答案 2 :(得分:2)

gdb的一个特别有用的功能是能够检查崩溃的程序的最终状态。

要检查崩溃转储(或核心文件,因为它通常被称为),请按如下所示启动gdb:

gdb< program-name> <核 - 文件>

例如:

gdb a.out core

在核心文件上运行此命令后,gdb将告诉您程序如何终止并显示程序中发生错误的位置:

Program terminated with signal 11, Segmentation fault.
#0  0x08048364 in foo () at foo.c:4
4         *x = 100;

在上面的示例中,您可以看到程序在尝试为指针赋值时终止了分段错误。通过在gdb的提示符下键入 backtrace (或 bt where ),您可以查看程序的完整回溯:

(gdb) backtrace
#0  0x08048364 in foo () at foo.c:4
#1  0x0804837f in main () at foo.c:9

此时,您知道在尝试为main()分配值时,foo() foo()*x在第4行崩溃了。很多时候,这提供了足够的信息来帮助您修复错误。

答案 3 :(得分:1)

您也可以使用Geany

答案 4 :(得分:1)

我做了很多并行程序开发,所以我发现在python / ruby​​中使用一个简单的包装器,允许我将gdb连接到所有节点上的所有进程并与我通信是非常有帮助的(我没有找到更好的方法,如果有人知道一个,而不是劫持线程,虽然......)

我不确定OP的经验是多少,所以:

GDB文档非常好,包罗万象。第一章是对所有基础知识的一个很好的介绍。

http://www.gnu.org/software/gdb/documentation/

虽然不是gdb,但它们是相关的: 我个人发现,打破复杂的行以帮助确定哪些语句错误有帮助。

另外,Valgrind(http://valgrind.org/)对于解决缓冲区溢出等问题非常好/有用(我没有幸运地使用gdb来做这件事。

答案 5 :(得分:1)

基本但非常有用 - 使用text gui和-tui。

选项

答案 6 :(得分:0)

使用ddd,gdb的可视前端。它让您只需点击几下鼠标即可轻松完成任务,并可视化代码的工作方式,另外在调试器控制台中还可以使用intercative gdb。