在可执行文件上运行 GDB 后1:
使用start或starti分别在main或_start中设置断点并运行程序。
或使用b 12 自己设置断点以在源代码第 12 行设置断点(如果您构建了足够的调试信息以使其工作),或 b *0x00401007 在您从 @ 复制/粘贴的地址上设置断点987654326@输出。
layout asm / layout reg 将 GDB 置于文本 UI 模式,在终端中使用“windows”进行反汇编和注册。 (这可能有点不稳定,您有时需要 control-L 来重绘屏幕,有时 GDB 会在您的进程退出时崩溃,尽管我不确定这是否专门来自 TUI。)
否则,如果没有 TUI 模式,info reg 和 disas 会很有用。
更多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 .
无论哪种方式,堆栈地址仍然很容易与代码区分开来,0x555... 或0x0000...XXXXXX 在可执行文件中,0x7fffff... 在堆栈中,来自 mmap 的其他地址是随机的。 (但 libc 也被映射到堆栈附近的高地址,有或没有 PIE。)
(或者如果你写的是_start 而不是main,gcc -nostdlib -static foo.S 意味着-no-pie)