我有以下test
要调试的程序集文件,
我怎样才能做到这一点?
注意我正在使用 x86-64 和 att 语法,而且我无权访问 c 代码。我想在每一行之后停止并能够看到表中的寄存器(我记得有这样一个选项)。
我试过:
gdb test
r
但我得到:
Starting program:
No executable file specified.
Use the "file" or "exec-file" command.
在可执行文件上运行 GDB 后1:
使用start
或starti
分别在 main 或 _start 中设置断点并运行程序。
或者自己b 12
设置断点以在源代码第 12 行上设置断点(如果您使用足够的调试信息进行构建以使其正常工作),或者b *0x00401007
在您从disas
输出中复制/粘贴的地址上设置断点。
layout asm
/layout reg
将 GDB 置于终端中带有“windows”的文本 UI 模式以进行反汇编和注册。(这可能有点不稳定,您有时需要 control-L 来重绘屏幕,有时当您的进程退出时 GDB 会崩溃,尽管我不确定这是否来自 TUI。)
否则没有 TUI 模式,info reg
并且disas
可能很有用。
有关更多 asm 调试技巧,请参阅https://stackoverflow.com/tags/x86/info的底部。
特别strace ./test
是查看您的程序进行的系统调用,解码为 C 风格非常有用。在您为自己的实验而玩的玩具程序中,这基本上可以作为检查错误返回值的替代方法。
脚注 1:您没有正确执行该部分:
No executable file specified.
这意味着test
您运行的目录中不存在名为的文件gdb 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
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句