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

标签 debugging assembly gdb freebsd

我目前有一个棘手的错误,它发生在我无法访问源代码或符号的地方,即我可以看到发生崩溃的指令及其地址,但仅此而已。 我想做的是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/

相关文章:

c - 来自 Linux 内核模块的暂停指令不起作用

assembly - arm neon 比较操作生成负一

c++ - 访问未分配的页面

gdb Split View与代码

python - 使用 PyCharm 调试 CKAN 站点

javascript - 如何突出显示Javascript缺少括号的调用函数

gnu-assembler - 汇编语言从0递增到100

linux - 为什么 `pop` 指令不从堆栈中弹出?

c# - 为什么在 UI 自动化客户端中捕获的异常会出现在正在自动化的 UI 中?

java - 如何使用 Mockito 在模拟上显示所有调用