【问题标题】:How to debug assembly?如何调试程序集?
【发布时间】:2021-05-24 09:12:22
【问题描述】:

我有以下汇编文件test 想要调试,

我该怎么做?

注意我正在使用 x86-64 和 att 语法,而且我无法访问 c 代码。 我想在每一行之后停下来并能够看到表格中的寄存器(我记得有这样一个选项)。

我试过了:

gdb test
r

但我明白了:

Starting program:  
No executable file specified.
Use the "file" or "exec-file" command.

【问题讨论】:

  • 如果您正在寻找一个成熟的调试器,GDB 绝对是一个不错的选择,但是我发现大多数时候它是矫枉过正的,但是一旦您放下控件,它仍然很棒。不过,我建议您看一下 GNU Binutils 软件包。您可以使用 objdump 进行反汇编,使用 .TEXT 段的 -d 选项或所有段的 -D 选项。

标签: linux shell assembly gdb


【解决方案1】:

在可执行文件上运行 GDB 后1
使用startstarti分别在main或_start中设置断点并运行程序。

或使用b 12 自己设置断点以在源代码第 12 行设置断点(如果您构建了足够的调试信息以使其工作),或 b *0x00401007 在您从 @ 复制/粘贴的地址上设置断点987654326@输出。

layout asm / layout reg 将 GDB 置于文本 UI 模式,在终端中使用“windows”进行反汇编和注册。 (这可能有点不稳定,您有时需要 control-L 来重绘屏幕,有时 GDB 会在您的进程退出时崩溃,尽管我不确定这是否专门来自 TUI。)
否则,如果没有 TUI 模式,info regdisas 会很有用。

更多asm调试技巧见https://stackoverflow.com/tags/x86/info底部。

特别是 strace ./test 对于查看您的程序进行的系统调用、解码为 C 风格非常有用。在您为自己的实验而玩的玩具程序中,这基本上可以作为检查错误返回值的替代方法。


脚注 1:您没有正确执行该部分:

No executable file specified.

这意味着在您运行 gdb test 的目录中不存在名为 test 的文件。

您必须先将 test.S 组装 + 链接到名为 test 的可执行文件中,然后才能在该文件上运行 GDB。如果ls -l test 显示它,那么gdb test 可以调试它。 (并且./test 可以运行它。)


gcc -no-pie foo.S 通常是使调试更容易的好选择:地址将在链接时固定,因此objdump -drwC -Mintel test 输出将匹配您在运行时看到的地址。而且地址在数字上会更小,因此更容易在视觉上发现代码(.text)地址与 .rodata(现代ld 将其放在单独的页面中,因此可以避免 exec 权限)与 .data / .bss .

无论哪种方式,堆栈地址仍然很容易与代码区分开来,0x55​​5... 或0x0000...XXXXXX 在可执行文件中,0x7fffff... 在堆栈中,来自 mmap 的其他地址是随机的。 (但 libc 也被映射到堆栈附近的高地址,有或没有 PIE。)

(或者如果你写的是_start 而不是maingcc -nostdlib -static foo.S 意味着-no-pie

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多