2012-12-25 78 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

嗯。我應該進行哪些測試來縮小問題的範圍? –