我有一个用程序集编写的程序,该程序因分段错误而崩溃。(代码无关紧要,但在这里。)
我的问题是如何用 GDB 调试汇编语言程序?
当我尝试在 GDB 中运行它并执行回溯时,我没有得到任何有意义的信息。(只是十六进制偏移量。)
如何调试程序?
(顺便说一句,如果这有帮助的话,我在 Ubuntu 上使用 NASM。)
我有一个用程序集编写的程序,该程序因分段错误而崩溃。(代码无关紧要,但在这里。)
我的问题是如何用 GDB 调试汇编语言程序?
当我尝试在 GDB 中运行它并执行回溯时,我没有得到任何有意义的信息。(只是十六进制偏移量。)
如何调试程序?
(顺便说一句,如果这有帮助的话,我在 Ubuntu 上使用 NASM。)
我只需将它直接加载到gdb
它并逐条指令执行它,随时监控所有寄存器和内存内容。
我敢肯定我不会告诉你任何你不知道的事情,但该程序似乎很简单,足以保证这种方法。对于更复杂的代码,我会留下花哨的调试技巧,比如回溯(甚至断点)。
至于具体问题(代码解释如下):
extern printf
SECTION .data
format: db "%d",0
SECTION .bss
v_0: resb 4
SECTION .text
global main
main:
push 5
pop eax
mov [v_0], eax
mov eax, v_0
push eax
call printf
您似乎只是将 5 推入堆栈,然后是该 5 在内存中的地址(v_0
)。我很确定如果你想调用printf
. 被给予一个流氓格式字符串是不会友好的。
很可能您的:
mov eax, v_0
应该:
mov eax, format
我假设在调用之后还有更多的代码printf
你只是因为不重要而离开了(否则你会在它返回时永远不会着陆)。
链接代码(使用 gcc)时,您仍然应该能够使用 Stabs 标记进行组装。
我建议使用YASM并使用-dstabs
选项进行组装:
$ yasm -felf64 -mamd64 -dstabs file.asm
这就是我组装我的汇编程序的方式。
NASM 和 YASM 代码在大多数情况下是可互换的(YASM 有一些 NASM 中不可用的扩展,但每个 NASM 代码都与 YASM 很好地组装在一起)。
我使用 gcc 将我组装的目标文件链接在一起,或者在使用 C 或 C++ 代码编译时。使用 gcc 时,我使用-gstabs+
调试标记对其进行编译。