代码之家  ›  专栏  ›  技术社区  ›  Nathan Osman

如何调试汇编程序?

  •  1
  • Nathan Osman  · 技术社区  · 14 年前

    我有一个用汇编语言编写的程序,它会因分段错误而崩溃。(代码不相关,但是 here .)

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

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

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   paxdiablo    14 年前

    我会直接把它装进 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
    

    假设 在调用之后还有更多的代码 打印F 你只是把它当作不重要的东西(否则它回来的时候你就永远不会着陆)。

        2
  •  1
  •   polemon    14 年前

    我建议使用 YASM 装配 -dstabs

    $ yasm -felf64 -mamd64 -dstabs file.asm
    

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

    NASM和YASM代码在很大程度上是可交换的(YASM有一些在NASM中不可用的扩展,但是每个NASM代码都与YASM很好地组装在一起)。

    我使用GCC将我的组合对象文件链接到一起,或者用C或C++代码编译。当使用gcc时,我使用 -gstabs+ 用调试标记编译它。