gpt4 book ai didi

debugging - 显示在 gdb 中执行的每条汇编指令

转载 作者:行者123 更新时间:2023-12-04 03:16:37 25 4
gpt4 key购买 nike

我目前有一个棘手的错误,它发生在我无法访问源代码或符号的地方,即我可以看到发生崩溃的指令及其地址,但仅此而已。 我想做的是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() ,让它显示并再次中断(用于下一条指令),然后继续,但是我无法使用 commandscommands块,所以它不会像我想象的那样工作。

万一重要,我正在研究 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com