簡體   English   中英

如何使用gdb調試使用yasm匯編的代碼?

[英]How can I use gdb to debug code assembled using yasm?

我已經使用yasm進行代碼匯編,並鏈接到我的C ++程序,但是我無法在匯編語言文件中的符號上設置gdb中的斷點。

命令行可能不是非常有啟發性,但我們在這里:

"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顯示我在哪里調用它,在main中的某個地方:

(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 。)

我的程序包含在.text部分之外的代碼,因為我在某種程度上設法拼錯了asm文件中的“text”(正如你在上面的objdump輸出中看到的那樣)。 yasm允許你根據自己的喜好命名你的部分,顯然它們最終被標記為可執行,但很明顯很多工具都不期待這個...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM