Linux(64位),nasm和gdb

时间:2011-09-18 19:53:42

标签: linux gdb nasm

我正在寻找另一个线程,但没有运气。我的问题可能很简单但令我感到沮丧。 我正在64位Ubuntu 11.04上编译两个文件:

  1. nasm -f elf64 -g file64.asm
  2. gcc -g -o file file.c file64.o
  3. 我正在使用gdb调试生成的可执行文件。使用C部分一切正常,但汇编语言源代码对调试器“不可见”。我得到的输出如下:

    (gdb) step
    Single stepping until exit from function line,
    which has no line number information.
    0x0000000000400962 in convert ()
    

    我的快速调查:

    objdump --source file64.o
    

    显示汇编源代码(和行信息)包含在文件中。

    为什么我在调试会话中看不到它?我做错了什么? 我必须说这些问题在转移到64位Ubuntu之后出现了。在32位Linux中,它可以工作(就像它应该的那样)。这对我来说只是一种乐趣,但无论如何非常令人沮丧。

4 个答案:

答案 0 :(得分:2)

使用NASM,在使用矮人调试格式时,我在gdb方面有了更好的经验。然后gdb将汇编源视为任何其他语言(即,不需要反汇编命令)

nasm -f elf64 -g -F dwarf file64.asm

(如果指定了-g,版本2.03.01及更高版本会自动启用-F。)

我正在使用NASM版本2.10.07。我不确定这是否有所作为。

答案 1 :(得分:1)

GDB是一个源级(或符号)调试器,这意味着它假定使用'高级编程语言'......这不是你的情况!

但是等一下,因为从调试器的角度来看,调试ASM程序比更高级别的语言更容易:几乎无所事事!程序二进制文件总是包含汇编指令,只是用它们的机器格式编写,而不是ascii格式。

GDB有能力为您转换它。不要执行list来查看代码,而是使用disassemble查看功能代码:

(gdb) disassemble <your symbol>
Dump of assembler code for function <your symbol>:
   0x000000000040051e <+0>: push   %rbp
   0x000000000040051f <+1>: mov    %rsp,%rbp
=> 0x0000000000400522 <+4>: mov    0x20042f(%rip),%rax        
   0x0000000000400529 <+11>:    mov    %rax,%rdx
   0x000000000040052c <+14>:    mov    $0x400678,%eax
   0x0000000000400531 <+19>:    mov    %rdx,%rcx

x/5i $pc $ pc

之后看 5 i nstruction
(gdb) x/5i $pc
=> 0x400522 <main+4>:   mov    0x20042f(%rip),%rax
   0x400529 <main+11>:  mov    %rax,%rdx
   0x40052c <main+14>:  mov    $0x400678,%eax
   0x400531 <main+19>:  mov    %rdx,%rcx
   0x400534 <main+22>:  mov    $0xc,%edx

然后使用stepisi)instread stepnextini)代替next

每当下级停止时(即每次display $pc / pc之后,

nexti也可用于打印当前stepi

答案 2 :(得分:1)

对于其他在NASM上遇到破碎事情的人(到目前为止还没有解决这个问题):只需下载NASM git存储库并切换到2.7版,这可能是最后一个工作正常的版本,即支持gdb。从源代码构建这个过时的版本只是一种解决方法(例如,你不支持最后一个ISA),但它对大多数学生来说已经足够了。

答案 3 :(得分:0)

GDB可能不知道在哪里搜索您的源文件。尝试使用directory明确告诉它。