質問の短いバージョン: libcのデバッグシンボルをgdbで使用するにはどうすればよいですか?
長いバージョン: gdbでプログラムをデバッグしていて、libcで使用されるfutexに関する情報を見たい。ただし、デバッグ中のある時点で、次のような出力が得られます。
Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0 0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1 0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2 0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3 0x00007ffff768565a in printf () from /lib/libc.so.6
....
ブレークポイントでgdbでinfo sharedlibrary
を実行すると、次のように表示されます。
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
0x00007ffff7dddaf0 0x00007ffff7df6704 Yes (*) /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0 0x00007ffff7bd1388 Yes (*) /lib/libpthread.so.0
0x00007ffff79ba190 0x00007ffff79bd7d8 Yes (*) /lib/librt.so.1
0x00007ffff76538c0 0x00007ffff7766c60 Yes (*) /lib/libc.so.6
0x00007ffff6c1fd80 0x00007ffff6c303c8 Yes (*) /lib/libgcc_s.so.1
(*): Shared library is missing debugging information.
ldd
を実行すると、次のように表示されます。
linux-vdso.so.1 => (0x00007ffff7fde000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000)
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000)
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000)
Ubuntu 10.04を使用していますが、デバッグシンボル付きのlibcのバージョンは/usr/lib/debug/lib
にあると思います。 LD_LIBRARY_PATH
変数を設定してパスの先頭に配置しようとしましたが、違いはないようです。
プログラムがどの共有ライブラリをロードするかを選択する方法については、これが実行時またはコンパイル時に設定されているかどうかについて完全には明確ではありません(ランタイムを想定していますが、今はわかりません)。したがって、libcのデバッグバージョンを使用するためにgdbを取得する方法に関する情報は高く評価されています。
デバッグシンボルを含むlibcのバージョンは/ usr/lib/debug/libにあると思います。 LD_LIBRARY_PATH変数を設定してパスの先頭に配置しようとしましたが、違いは見られませんでした。
これらはnot探しているドロイドです。
/ usr/lib/debugのライブラリはrealライブラリではありません。むしろ、onlyデバッグ情報を含みますが、実際の_.text
_の_.data
_も_libc.so.6
_セクションも含みません。個別のdebuginfoファイルについて読むことができます here 。
_/usr/lib/debug
_のファイルは_libc6-dbg
_パッケージから取得され、GDBはインストールされている_libc6
_バージョンと一致する限り、それらを自動的にからロードします。 _libc6
_と_libc6-dbg
_が一致しない場合、GDBから警告が表示されます。
_set verbose on
_を設定すると、GDBが読み取ろうとしているファイルを確認できます。 _libc6
_と_libc6-dbg
_が一致する場合に表示される内容は次のとおりです。
_(gdb) set verbose on
(gdb) run
thread_db_load_search returning 0
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done.
thread_db_load_search returning 0
done.
thread_db_load_search returning 0
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done.
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000.
thread_db_load_search returning 0
Reading in symbols for dl-debug.c...done.
Reading in symbols for rtld.c...done.
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done.
thread_db_load_search returning 0
... etc ...
_
更新:
たとえば、私は見ます
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done
これは、GDBが_/usr/lib/debug
_を検索していないことを意味します。発生する可能性のある1つの方法は、_debug-file-directory
_に_.gdbinit
_を誤って設定した場合です。
デフォルト設定は次のとおりです。
_(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".
_
Libcのデバッグシンボルがインストールされていることを確認してください。
Sudo apt-get install libc6-dbg
また、x86コードをデバッグするx64システムを使用している場合:
Sudo apt-get install libc6:i386
Sudo apt-get install libc6-dbg:i386