2010-09-09 63 views
1

我有一個用程序集編寫的程序,發生分段錯誤時崩潰。 (代碼是無關的,但是是here。)如何調試彙編程序?

我的問題是如何用GDB調試彙編語言程序?

當我嘗試在GDB中運行它並執行回溯時,我沒有收到任何有意義的信息。 (只有十六進制偏移量。)

如何調試程序?

(我使用NASM在Ubuntu上,如果通過以某種方式幫助的方式。)

回答

2

我只想直接載入到gdb和指令通過它一步指令,監控所有的寄存器和存儲器的內容爲你走。

我確定我沒有告訴你任何你不知道的東西,但程序似乎很簡單,可以保證這種方法。我會留下一些奇怪的調試技巧,比如回溯(甚至是斷點)以獲得更復雜的代碼。

至於具體問題(以下轉述碼):

 extern printf 

     SECTION .data 
format: db  "%d",0 

     SECTION .bss 
v_0: resb  4 

     SECTION .text 
     global main 
main: 
     push  5 
     pop  eax 
     mov  [v_0], eax 
     mov  eax, v_0 
     push  eax 
     call  printf 

你似乎到堆中,其後是5的內存(v_0)地址只是推5。我很確定,如果你想撥打printf,你需要在某個時候推送格式字符串的地址。這不會被認爲是一種流氓格式字符串。

這可能是因爲你的:

mov eax, v_0 

應該是:

mov eax, format 

,我假設有這麼調用printf後,更多的代碼,你只是離開不重要(否則,當它返回時,你將永遠不會着陸)。

+0

確切的問題 - 我剛剛發現!謝謝! – 2010-09-09 04:05:20

1

鏈接代碼(使用gcc)時,您仍應該能夠使用Stabs標記進行組裝。

我建議使用YASM-dstabs選擇組裝:

$ yasm -felf64 -mamd64 -dstabs file.asm 

這是我組裝我的彙編程序。 NASM和YASM代碼大部分是可互換的(YASM有一些在NASM中不可用的擴展,但是每個NASM代碼都與YASM很好地組裝在一起)。

我使用gcc將我的彙編對象文件鏈接在一起,或與C或C++代碼編譯時。使用gcc時,我使用-gstabs+用調試標記進行編譯。