2014-10-26 93 views
7

我使用yasm進行代碼組裝,並鏈接到我的C++程序中,但是我無法在彙編語言文件中的符號中設置gdb中的斷點。如何使用gdb調試使用yasm組裝的代碼?

的命令行可能不是非常具有啓發性,但在這裏我們去:

"g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -std=c++11 -I"$HOME/usr/include" -c -o "bin/gcc-4.7/debug/main.o" "main.cpp" 
yasm -g dwarf2 -f elf64 -o bin/gcc-4.7/debug/mandel.o mandel.yasm 
"g++" -L"$HOME/usr/lib" -Wl,-R -Wl,"$HOME/usr/lib" -Wl,-rpath-link -Wl,"$HOME/usr/lib" -o "bin/gcc-4.7/debug/mandel" -Wl,--start-group "bin/gcc-4.7/debug/main.o" "bin/gcc-4.7/debug/mandel.o" -Wl,-Bstatic -Wl,-Bdynamic -lboost_system -lboost_thread -Wl,--end-group -g 

這一切都建立無事,而程序運行。但是當我嘗試將它加載到gdb中進行調試時,我似乎無法在yasm文件中的任何函數上放置斷點。例如,我在那裏有一個名爲MandelRect的函數。下面是GDB顯示我在哪裏,它是從所謂的某處主:

(gdb) disassemble 0x404ada,0x404af0 
Dump of assembler code from 0x404ada to 0x404af0: 
    0x0000000000404ada <main()+474>:  mov %rax,%rdi 
    0x0000000000404add <main()+477>:  callq 0x409980 <MandelRect> 
    0x0000000000404ae2 <main()+482>:  movq $0x0,-0x18(%rbp) 
    0x0000000000404aea <main()+490>:  jmp 0x404b1c <main()+540> 
    0x0000000000404aec <main()+492>:  mov -0x18(%rbp),%rdx 
End of assembler dump. 

這裏的GDB向我展示它的地址是:

(gdb) info address MandelRect 
Symbol "MandelRect" is at 0x409980 in a file compiled without debugging. 

這裏的GDB暫時無法將斷點就可以了:

(gdb) break MandelRect 
Function "MandelRect" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) n 

如果我在正確的地址放置一個斷點,當執行到達函數時,我不能按指令逐步執行它。它只是從標籤到標籤,盡我所能(煩惱)告訴。

顯然 - 也許吧? - 這與gdb堅持認爲該文件是在沒有調試的情況下編譯有關。但似乎有相關的.o文件和二進制文件中的符號:

~/tests/mandel/bin/gcc-4.7/debug% nm mandel.o | grep MandelRectAsm 
0000000000000000 R MandelRectAsm 
~/tests/mandel/bin/gcc-4.7/debug% nm mandel | grep MandelRectAsm 
000000000040a340 R MandelRectAsm 
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel.o | grep -i MandelRectAsm 
0000000000000000 g  .txt 0000000000000000 MandelRectAsm 
~/tests/mandel/bin/gcc-4.7/debug% objdump -t mandel | grep -i MandelRectAsm 
000000000040a340 g  .txt 0000000000000000    MandelRectAsm 

那麼我該如何解決這個問題?我誤解了一些東西,還是yasm -g壞了?有沒有人設法讓yasm的調試信息與gdb一起工作?

(系統是Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

+0

我會嘗試mandel.o&madel上的nm&objdump -g,以查看調試信息丟失/損壞的位置。 – dbrank0 2014-10-27 08:35:48

+0

感謝您的建議。我已經更新了這個問題。 'objdump -g'沒有爲我打印任何文件,因爲我試過它的任何文件(比如,除了說文件是elf64-x86-64),所以我使用了'objdump -t'代替。 – 2014-10-28 23:41:22

回答

2

我的程序包含的代碼,是.text節之外,因爲我總算拼錯該ASM文件「文本」(你可以在objdump的輸出上面看到)。 yasm讓你隨心所欲地命名你的部分,顯然他們最終被標記爲可執行文件,但顯然很多工具並不期待這個...

這也修復了我從perf得到的一些奇怪結果。