【发布时间】:2011-04-10 01:48:09
【问题描述】:
我有一个用程序集编写的程序,它因分段错误而崩溃。 (代码无关紧要,而是here。)
我的问题是如何使用 GDB 调试汇编语言程序?
当我尝试在 GDB 中运行它并执行回溯时,我没有得到任何有意义的信息。 (只是十六进制偏移量。)
如何调试程序?
(顺便说一句,我在 Ubuntu 上使用 NASM,如果这有帮助的话。)
【问题讨论】:
标签: debugging gdb segmentation-fault nasm
我有一个用程序集编写的程序,它因分段错误而崩溃。 (代码无关紧要,而是here。)
我的问题是如何使用 GDB 调试汇编语言程序?
当我尝试在 GDB 中运行它并执行回溯时,我没有得到任何有意义的信息。 (只是十六进制偏移量。)
如何调试程序?
(顺便说一句,我在 Ubuntu 上使用 NASM,如果这有帮助的话。)
【问题讨论】:
标签: debugging gdb segmentation-fault 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+ 来编译它并带有调试标记。
【讨论】: