【问题标题】:How to debug an assembled program?如何调试汇编程序?
【发布时间】:2011-04-10 01:48:09
【问题描述】:

我有一个用程序集编写的程序,它因分段错误而崩溃。 (代码无关紧要,而是here。)

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

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

如何调试程序?

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

【问题讨论】:

    标签: debugging gdb segmentation-fault nasm


    【解决方案1】:

    我只需将其直接加载到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 之后还有更多代码你只是因为不重要而忽略了(否则当它返回时你将永远不会着陆) .

    【讨论】:

    • 正是问题所在——我刚刚发现了!谢谢!
    【解决方案2】:

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

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

    $ yasm -felf64 -mamd64 -dstabs file.asm
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多