1

我有一个用程序集编写的程序,该程序因分段错误而崩溃。(代码无关紧要,但在这里。)

我的问题是如何用 GDB 调试汇编语言程序?

当我尝试在 GDB 中运行它并执行回溯时,我没有得到任何有意义的信息。(只是十六进制偏移量。)

如何调试程序?

(顺便说一句,如果这有帮助的话,我在 Ubuntu 上使用 NASM。)

4

2 回答 2

2

我只需将它直接加载到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你只是因为不重要而离开了(否则你会在它返回时永远不会着陆)。

于 2010-09-09T04:01:53.100 回答
1

链接代码(使用 gcc)时,您仍然应该能够使用 Stabs 标记进行组装。

我建议使用YASM并使用-dstabs选项进行组装:

$ yasm -felf64 -mamd64 -dstabs file.asm

这就是我组装我的汇编程序的方式。

NASM 和 YASM 代码在大多数情况下是可互换的(YASM 有一些 NASM 中不可用的扩展,但每个 NASM 代码都与 YASM 很好地组装在一起)。

我使用 gcc 将我组装的目标文件链接在一起,或者在使用 C 或 C++ 代码编译时。使用 gcc 时,我使用-gstabs+调试标记对其进行编译。

于 2010-09-09T04:04:30.777 回答