gdbを使用してlibtoolでビルドされたパッケージのテストプログラムをデバッグしようとすると、奇妙な問題が発生します。実行libtool --mode=execute gdb .libs/libfoo.so
して関数のソースをリストするように依頼するとlist Bar::Baz
、期待どおりにソースコードが取得されます。を実行するlibtool --mode=execute gdb binary
と、侵入しBar::Baz()
てスタックトレースでその引数を確認できますが、次のようにソースファイルまたは行番号を取得できません。
#7 0x018348e5 in Bar::Baz(Qux*, Quux*) () from /path/to/libfoo.so
^^^^^^^^^^^ <--- debug symbols are present!
同様にlist Bar::Baz
、実行可能ファイルをデバッグしようとすると、次のようになります。
No line number known for 'Bar::Baz'.
バイナリがとリンクされていることを確認し、-g
その機能を一覧表示できるmain
ので、デバッグ情報の一部が存在することがわかります。
と言うとinfo sources
、ライブラリが構築されているファイルの完全なリストと、正しい絶対パスが表示されます。と言うとinfo shared
、オブジェクトファイルへの正しいパスがリストさYes
れ、Syms
列にが表示されます。
何がうまくいかない可能性があり、それを修正する方法についてのさらなるアイデアはありますか?
編集1:誤っobjdump -g
て、問題のあるライブラリを実行し、次の出力を取得しました。
/path/to/foo.so.0.0.0: file format elf32-i386
objdump: /path/to/foo.so.0.0.0: no recognized debugging information
objdump -h
(私が実行しようとしたもの)にはたくさんの.debug_*
セクションがリストされているので、これは驚くべきことです。objdump
マニュアルreadelf -w
も同様に示唆しており、それは膨大な情報の山を印刷しているようです。ただし、実際に何が提供されるかを確認する必要があります。
編集2:それで、readelf -w
いくつかの悟りを生み出しました。何らかの理由で、共有オブジェクトファイルには、リンクされているオブジェクトの大部分 からのデバッグ情報が含まれていないようです。Makefilesに基づいて、オブジェクトを共有ライブラリに実際に収集するコマンドが渡されず、情報が適切に伝播されない可能性があります。面白いことに、これは(現在のx86に対して)x86_64の同じコンパイラバージョンを含む、他のすべての構成で機能します(完全なデバッグ情報があります)。-g
編集3:実際には、LDFLAGSに-gが追加された変更されたMakefileを使用して完全に再構築されましたが、違いはありませんでした。今、私は元気で本当に困惑しています。