2008-09-26 75 views
12

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

+0

通过使用集成了GDB的IDE,我的生活变得更轻松;) – Dan 2008-09-26 15:47:52

+0

这是一个很好的选择。我被告知我的工作将在一两年内加入21世纪。不过,了解如何手动执行某些功能以便从所有功能中受益,例如使用代码中当前点的变量来运行自己的功能,总是很有用。 – 2008-09-26 15:52:54

回答

2

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

最明显是最有用的:设置上的功能或行号断点并通过线代码行走。

另一个方便的技巧是对所有的结构/对象显示功能,即使他们从来没有在你的程序中使用,因为你可以从GDB中运行这些功能:

gdb> p show_my_struct(struct) 

My custom display of Foo: 
    ... 

观察点可真方便也可能会减慢你的程序。这些打破流时的变量或地址的变更。:

gdb> watch foo 
Watchpoint4: foo 
gdb> 
+0

为什么不简单地使用“p my_struct”而不是“p show_my_struct(my_struct)”? – sigjuice 2009-03-25 07:28:37

+0

因为您可以解码标志字段,运行验证码等。它不仅仅是结构值的转储,而是可以转储含义,包括指向的相关对象。例如,如果obj1有一个obj2s列表,那么您可以在其中嵌套所有obj2s的显示。 – 2009-04-08 14:02:57

3

一些提示值:

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

使用DDD,视觉前端为GDB。它可以让你只需点击几下鼠标就可以轻松完成任务,并可视化代码的工作方式,并且在调试器控制台中还有一个interdative gdb。

2

一个特别有用的特点是它能够检查多数民众赞成崩溃程序的最终状态的能力。

要检查崩溃转储(或核心文件,因为它更普遍的称呼),启动gdb如下:

GDB <程序名> <核心文件>

例如:

gdb的a.out的核心

一旦银行经营在核心文件荷兰国际集团这个命令,GDB会告诉你该程序如何终止,并显示其中的程序发生错误:

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

在上面的例子中,你可以看到该程序终止分段故障而试图给一个指针赋值。通过在gdb的提示符下键入回溯(或BT其中),您可以查看该程序的完整回溯:

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

在这一点上,你知道main()称为foo()foo()坠毁,机上4号线同时尝试将值分配给*x。很多时候,这提供了足够的信息来让您修复错误。

1

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

我不知道经历了怎样的OP就是这样:

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

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

虽然不是用gdb,它们是相关的: 我个人发现,打破复杂的线条下降到确定哪些语句示数有助于帮助。

此外,Valgrind的(http://valgrind.org/)是非常好的/有用的解决缓冲区溢出等等(我还没有使用gdb的运气这样做

1

基本但非常有用 - 使用text gui与选项-tui