如何使用gdb来探索堆栈/堆?
有谁能请给我一个快速概述/指向我检查C程序的堆栈(和堆?)的方法的文档? 我认为这应该用GDB来完成,但是如果还有其他更直接的选择,那么这应该没问题。
谢谢。
我使用GDB进行调试的第一种方法是设置断点。 这样做就像这样 –
prompt> gdb ./x_bstree.c (gdb) #prompt (gdb) b 123 #break at line 123 (gdb) r #start program
现在你的程序在程序的第123行停止了。 现在,您可以使用print
检查堆栈或堆中的变量。 对于堆栈变量,只需使用print
。 对于堆变量(指针),使用print <*varname>
。 不确定检查堆栈/堆变量有什么特别之处吗?
当然,要调试multithreading应用程序,您需要使其以单线程模式运行,然后再调整,否则很难预测正在发生的事情。
对于其他任何东西,有大量的gdb文档,许多网站也提供gdb备忘单
您可以使用’x’命令转储原始内存
所以,如果你想查看堆栈或堆的位,请尝试类似的东西
x/10b &stackvar x/200b &heapvar-20
最后一个将显示从heapvar之前的20个字节开始的200个字节。 所以如果你只是malloced你也可以看到堆头
尝试使用ddd
。 ddd手册
好。 也许我详细说明一下。 我这样用它。
使用调试符号编译我的程序:
gcc -g program.c -o program
运行ddd
:
ddd program
在gui你可以做各种事情,查看机器代码,查看内存等。 环视四周。 在手册中还有一段检查堆栈。 ddd
为您提供了良好的界面来检查C程序。
查看堆栈: gdb> backtrace
查看当前堆栈帧: gdb> info frame
查看当前堆栈帧的参数: gdb> info args
查看当前堆栈帧的局部变量: gdb> info locals
导航到父堆栈框架: gdb> frame 1
检查堆栈