7

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は次のとおりです。

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

4

1 に答える 1

2

私のプログラムにはセクション外のコードが含まれていました.text。これは、どうにかして asm ファイルの「text」のスペルを間違えたためです (上記の objdump 出力で確認できます)。yasm を使用すると、セクションに好きな名前を付けることができ、明らかにそれらは実行可能としてマークされますが、明らかに多くのツールがこれを予期していません...

これにより、 から得ていたいくつかの奇妙な結果も修正されperfました。

于 2014-10-29T00:00:22.727 に答える