作为一名开发人员,您如何使用gdb来追踪代码中的错误?你使用什么技巧来让你的生活更轻松?你如何使用gdb来调试你的代码?
回答
一般来说,你找到的东西,是不应该的,直到你明白为什么向后工作。
最明显是最有用的:设置上的功能或行号断点并通过线代码行走。
另一个方便的技巧是对所有的结构/对象显示功能,即使他们从来没有在你的程序中使用,因为你可以从GDB中运行这些功能:
gdb> p show_my_struct(struct)
My custom display of Foo:
...
观察点可真方便也可能会减慢你的程序。这些打破流时的变量或地址的变更。:
gdb> watch foo
Watchpoint4: foo
gdb>
为什么不简单地使用“p my_struct”而不是“p show_my_struct(my_struct)”? – sigjuice 2009-03-25 07:28:37
因为您可以解码标志字段,运行验证码等。它不仅仅是结构值的转储,而是可以转储含义,包括指向的相关对象。例如,如果obj1有一个obj2s列表,那么您可以在其中嵌套所有obj2s的显示。 – 2009-04-08 14:02:57
一些提示值:
- 使用图形前端(工具KDbg相当不错,DDD至少比命令行更好gdb,kdevelop有一个不错的gdb前端,但有一些bgs,nemiver看起来相当不错,但仍在工作中)
- 确保为所有重要部分提供调试符号和源代码(您自己的代码以及一些系统库)
- 在RedHat上,您可以安装-debuginfo软件包,使符号和源代码神奇地出现在调试器中 - 非常酷,因为您可以查看libc函数调用等。
- 在Debian/Ubuntu上,可以安装 - dbg包来获取符号;安装适当的源文件系统软件包似乎很难,但
- 我倾向于加断言()和中止()调用中不应该达到,或者说我要学的地方的地方(某种重载断点)
- 理想情况下,assert()或abort()调用应该封装在一些只在调试版本中启用它们的方法或宏中,或者甚至更好,只有在设置了某个env变量时才启用它们
- 安装SIGSEGV和SIGABRT的信号处理程序;我亲自检查在安装处理程序之前是否设置了某个env var;并在处理程序中执行通常位于〜/ .local/bin /中的硬编码外部命令;该命令可能会启动kdbg并将其附加到崩溃的应用程序。瞧,调试器会在你的应用程序做坏事的时候弹出。
- 如果您使用单元测试,那么只要测试用例失败,就可以类似地附加一个调试器,然后再检查该应用程序。
使用DDD,视觉前端为GDB。它可以让你只需点击几下鼠标就可以轻松完成任务,并可视化代码的工作方式,并且在调试器控制台中还有一个interdative gdb。
您还可以使用Geany。 GDB的
一个特别有用的特点是它能够检查多数民众赞成崩溃程序的最终状态的能力。
要检查崩溃转储(或核心文件,因为它更普遍的称呼),启动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
。很多时候,这提供了足够的信息来让您修复错误。
我做了很多并行程序开发,所以我发现在python/ruby中使用一个简单的包装,可以让gdb连接到所有节点上的所有进程并与我进行通信非常有帮助我还没有找到更好的办法,如果一个人都知道,不是劫持线程,虽然...)
我不知道经历了怎样的OP就是这样:
的GDB文档是相当不错,包罗万象。第一章是对所有基础知识的一个很好的介绍。
http://www.gnu.org/software/gdb/documentation/
虽然不是用gdb,它们是相关的: 我个人发现,打破复杂的线条下降到确定哪些语句示数有助于帮助。
此外,Valgrind的(http://valgrind.org/)是非常好的/有用的解决缓冲区溢出等等(我还没有使用gdb的运气这样做
基本但非常有用 - 使用text gui与选项-tui
- 1. 你用什么来测试你的C++代码?
- 2. 你打电话使用打印语句来调试代码?
- 3. 你用什么工具编写jQuery代码并调试你的代码?
- 4. 你如何组织你的代码?
- 5. 你如何组织你的Javascript代码?
- 6. 你如何构建你的jQuery代码?
- 7. 你如何修改你的代码?
- 8. 你试图让你的代码的功能如何?
- 9. 你如何用cmake设置GDB调试标志?
- 10. 如何使用gdb调试使用yasm组装的代码?
- 11. 使用依赖注入系统你如何单元测试你的代码
- 12. 你如何让别人相信你的代码并使用它?
- 13. 你如何测试非功能代码?
- 14. 你如何测试CocoaPod代码?
- 15. 你如何测试Java EE代码?
- 16. 你如何使用Android调试器?
- 17. 你如何使用测试代码叉rspec的
- 18. 如何使用GDB调试
- 19. 你如何调试你的Facebook应用程序?
- 20. 如何调试这个代码为什么你是?
- 21. 你可以使用firebug lite来调试IE 8而无需注入代码吗?
- 22. Web代码重用,你如何组织你的脚本片段?
- 23. 你如何使代码加入?
- 24. 你如何使这段代码更pythonic?
- 25. 用gdb调试没有源代码
- 26. 你如何测试你的Cocoa GUI?
- 27. 你如何编写你的QTP测试?
- 28. 你如何测试你的Request.QueryString []变量?
- 29. 你如何测试你的emberjs路线?
- 30. 你如何以不同的用户来提交代码?
通过使用集成了GDB的IDE,我的生活变得更轻松;) – Dan 2008-09-26 15:47:52
这是一个很好的选择。我被告知我的工作将在一两年内加入21世纪。不过,了解如何手动执行某些功能以便从所有功能中受益,例如使用代码中当前点的变量来运行自己的功能,总是很有用。 – 2008-09-26 15:52:54