作为开发人员,您如何使用gdb来跟踪代码中的错误?你用什么技巧来让你的生活更轻松?
答案 0 :(得分:3)
一些提示:
答案 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。