我目前有一个棘手的错误,它发生在我无法访问源代码或符号的地方,即我可以看到发生崩溃的指令及其地址,但仅此而已。 我想做的是gdb
无需交互即可运行并按原样显示每条指令 ,但我还没有找到一种方法来做到这一点。
我希望实现的是这样的:
(gdb) /* some command */
0x2818a7c0: push %ebp
0x2818a7c1: mov %esp,%ebp
0x2818a7c3: push %ebx
0x2818a7c4: sub $0x4,%esp
...
0x28563622: mov %esi,0x0(%eax)
Program received signal SIGSEGV, Segmentation fault.
我一直在做的是为程序计数器设置显示,如下所示:
(gdb) display/i $pc
然后用
stepi
运行代码:(gdb) stepi
1: x/i $pc 0x2818a7c0: push %ebp
然而,崩溃是成百上千的指令,我想要一种方法来查看每个指令(如果需要的话,可以一起查看),而不必多次点击“输入”。此外,如果我手动执行此操作,我会看到
(gdb)
每条指令之间的提示,这是不太理想的。我简要研究过的一条路线是 scripting ,但我唯一的想法是设置在
main()
,让它显示并再次中断(用于下一条指令),然后继续,但是我无法使用 commands
内commands
块,所以它不会像我想象的那样工作。万一重要,我正在研究 FreeBSD。
最佳答案
以下应该做你要求的:
# not strictly required, but you'll likely want the log anyway
(gdb) set logging on
# ask gdb to not stop every screen-full
(gdb) set height 0
(gdb) while 1
> x/i $pc
> stepi
> end
然而,这种调试方法可能会被证明是徒劳的:即使在最琐碎的程序中,也有太多的指令被执行。
更好的方法可能是运行程序直到崩溃,尝试了解当前函数在做什么以及谁调用它,并适本地设置断点。
在 x86 上,即使在完全剥离的可执行文件中,您也经常可以推断出函数边界。
您要查看的另一件事是
strace/truss
输出,因此您可以查看紧接在崩溃点之前的系统调用。
关于debugging - 显示在 gdb 中执行的每条汇编指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8841373/