web-dev-qa-db-ja.com

libcのデバッグバージョンの使用方法

質問の短いバージョン: 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を取得する方法に関する情報は高く評価されています。

54

デバッグシンボルを含む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".
_
69

Libcのデバッグシンボルがインストールされていることを確認してください。

Sudo apt-get install libc6-dbg

また、x86コードをデバッグするx64システムを使用している場合:

Sudo apt-get install libc6:i386
Sudo apt-get install libc6-dbg:i386
16
mtlynch