我正在寻找另一个线程,但没有运气。我的问题可能很简单但令我感到沮丧。 我正在64位Ubuntu 11.04上编译两个文件:
nasm -f elf64 -g file64.asm
gcc -g -o file file.c file64.o
我正在使用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中,它可以工作(就像它应该的那样)。这对我来说只是一种乐趣,但无论如何非常令人沮丧。
答案 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
(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
然后使用stepi
(si
)instread step
和nexti
(ni
)代替next
。
display $pc
/ pc
之后, nexti
也可用于打印当前stepi
。
答案 2 :(得分:1)
对于其他在NASM上遇到破碎事情的人(到目前为止还没有解决这个问题):只需下载NASM git存储库并切换到2.7版,这可能是最后一个工作正常的版本,即支持gdb。从源代码构建这个过时的版本只是一种解决方法(例如,你不支持最后一个ISA),但它对大多数学生来说已经足够了。
答案 3 :(得分:0)
GDB可能不知道在哪里搜索您的源文件。尝试使用directory
明确告诉它。