2012-12-25 80 views
7

我在Ubuntu 12.10 64bit上运行。GDB抱怨没有源代码可用

我试图调试GDB一个简单的汇编程序。但是GDB的gui模式(-tui)似乎无法找到我的程序集文件的源代码。我已经在当前目录中重建了该项目,并且无法搜索到谷歌,请在这里帮助我。

我的命令:

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

gcc -g hello.o -o hello 

gdb -tui hello 

调试信息似乎是装的,我可以设置在主断点(),但上半部分的屏幕仍然说“[没有源代码可用]”。

这里是hello.asm如果你有兴趣:

; hello.asm a first program for nasm for Linux, Intel, gcc 
; 
; assemble: nasm -f elf -l hello.lst hello.asm 
; link:  gcc -o hello hello.o 
; run:   hello 
; output is: Hello World 

    SECTION .data  ; data section 
msg: db "Hello World",10 ; the string to print, 10=cr 
len: equ $-msg  ; "$" means "here" 
       ; len is a value, not an address 

    SECTION .text  ; code section 
     global main  ; make label available to linker 
main:    ; standard gcc entry point 

    mov edx,len  ; arg3, length of string to print 
    mov ecx,msg  ; arg2, pointer to string 
    mov ebx,1  ; arg1, where to write, screen 
    mov eax,4  ; write command to int 80 hex 
    int 0x80  ; interrupt 80 hex, call kernel 

    mov ebx,0  ; exit code, 0=normal 
    mov eax,1  ; exit command to kernel 
    int 0x80  ; interrupt 80 hex, call kernel 
+0

删除请参阅下面的答案为理由。 –

+1

汇编程序生成的程序没有调试信息。编译器(例如'gcc -g')正在生成调试信息作为汇编指令或构造。所以你的问题没有真正意义。但是,'gdb'能够一步一步地运行一次机器指令。 –

+0

你有什么解决方案吗? –

回答

4

在这种情况下的问题是,汇编器没有为调试行号信息。因此,虽然源代码在那里(如果您在gdb中执行“列表”,它会显示源列表的列表 - 至少当我按照您的步骤执行时),但调试器需要从文件中获取行号信息以了解什么行对应于什么地址。它不能用所给的信息做到这一点。

据我所知,没有办法让NASM发布as使用的.loc指令,例如使用gcc时。但是as无法在不产生大量错误的情况下获取源文件[即使使用-msyntax = intel -mmnemonic = intel - 你也认为应该工作]。

因此,除非有人更聪明才能想出一种方法来生成可以给出调试器行号信息的.loc条目,但我并不完全确定我们如何能够以一种令您满意的方式回答您的问题用。

+1

谢谢。我正在向NASM提交一份错误报告。 –

+0

好笑。我有一个与c程序和gdb文本ui相同的问题。我打到列表中,当我敲击输入的'list'命令时,一切似乎都起作用。 – gideon

+0

@IrresponsibleNewb是否提交了错误报告?链接? – BeeOnRope

4

这种说法是错误的。

汇编器确实产生行号信息(注意-g-F矮行)位。

另一方面,他组装显然是32位代码为64位,这可能会或可能不会工作。

现在,如果NASM调试输出中存在错误,我们需要知道这一点。

一对夫妇的快速实验表明,addr2line(但不是gdb进行!)不正确使用刺,但不使用侏儒解码NASM生成的行号信息,所以有可能是错误的东西在NASM产生侏儒方式.. 。但也有一些奇怪的gdb。

GNU addr2line version 2.22.52.0.1-10.fc17 20120131,GNU gdb(GDB)Fedora(7.4.50.20120120-52.fc17))。

+0

嗯。我应该进行哪些测试来缩小问题的范围? –