2011-09-18 92 views
3

我在尋找另一個線程,但沒有運氣。我的問題可能很簡單,但令我感到沮喪。 我編譯兩個文件在64位的Ubuntu 11.04:Linux(64位),nasm和gdb

  1. nasm -f elf64 -g file64.asm
  2. 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 

顯示THET彙編源代碼(和行信息)包含在文件中。

爲什麼我在調試會話中看不到它?我做錯了什麼? 我必須說,移動到64位Ubuntu後出現這些問題。在32位的Linux中,它的工作原理就像它應該的那樣。這對我來說只是一種樂趣,但無論如何非常令人沮喪。

+0

不知道它是否會有所幫助,但是您是否曾嘗試明確指定nasm的調試格式?例如。 'nasm -f elf64 -F stabs -g file64.asm' – Dmitri

+0

不,德米特里,不幸的是它沒有幫助。還是一樣的情況,但是謝謝你的回覆 – Bogdan

+0

我做了一個實驗。我在32位版本的Ubuntu下創建了64位目標文件(file64.o)(我也是這樣),並將它連接到64位系統下,現在它可以工作(!)但是nasm的調用總是相同的:'nasm -f elf64 -g file64.asm',我總是以同樣的方式使用gdb。看起來問題在於64位版本的nasm(我猜) – Bogdan

回答

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後 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)未讀stepnextini)而不是next

display $pc也可以打印當前pc實用,只要下停止(即,在每個nexti/stepi

+1

不。如果代碼是用程序集編寫的,那麼這個簡單代碼就是要顯示的源代碼。 GDB不關心相關語言是否被認爲是高層次的。 – Fabel

+0

@Fabel我不知道你的評論是否理解,你說什麼「不」? 「反彙編」和「stepi」將不起作用? – Kevin

+0

我認爲答案給人的印象是反彙編/ stepi是調試用匯編編寫的代碼的唯一(或至少是首選)方法。這是我不同意的。如果源代碼可用,GDB可以像使用高級語言的源代碼一樣使用它,這是一種更簡單的方法。 – Fabel

0

GDB可能不知道到哪裏尋找你的源文件。嘗試使用directory明確告訴它。

1

隨着NASM,我採用dwarf調試格式時,已經在GDB更好的體驗。用gdb然後把組裝源就好像它是任何其他語言(即沒有拆機命令必要)

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

(版本2.03。01和更高版本自動啓用-g如果指定了-F。)

我使用NASM版本2.10.07。我不確定這是否有所作爲。

1

對於那些在NASM上遇到問題的人(該bug目前尚未修復):只需下載NASM git存儲庫並切換到版本2.7,這可能是最後一個正常工作的版本,即支持gdb。從源代碼構建這個過時的版本只是一種解決方法(例如,您不支持最後的ISA),但對大多數學生來說這已經足夠了。