68

質問の短いバージョン: gdbにデバッグシンボルを使用させるにはどうすればよいlibcですか?

長いバージョン: gdbを使用してプログラムをデバッグしていて、によって使用されるfutexに関する情報を確認したいlibc。ただし、デバッグ中のある時点で、次のような出力が得られます。

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
....

info sharedlibraryブレークポイントでgdbを実行すると、次のように表示されます。

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

私はUbuntu10.04を使用していますが、libcデバッグシンボル付きのバージョンはにあると思います/usr/lib/debug/lib。パスの先頭にこれを配置するように変数を設定しようとLD_LIBRARY_PATHしましたが、違いは見られませんでした。

プログラムがロードする共有ライブラリをどのように選択するか、これが実行時に設定されるのかコンパイル時に設定されるのか、完全にはわかりません(私は実行時を想定していますが、今はわかりません)。したがって、gdbにのデバッグバージョンを使用させる方法に関する情報をいただければ幸いlibcです。

4

2 に答える 2

80

デバッグ記号付きのlibcのバージョンは/usr/ lib / debug/libにあると思います。LD_LIBRARY_PATH変数を設定して、これをパスの先頭に配置しようとしましたが、違いは見られませんでした。

これらはあなたが探しているドロイドではありません。

のライブラリは実際/usr/lib/debugのライブラリではありません。むしろ、デバッグ情報のみが含まれ、実際のセクションも含まれていません。個別のdebuginfoファイルについてはここで読むことができます。.text.datalibc.so.6

のファイルはパッケージ/usr/lib/debugからのものであり、インストールされているバージョンと一致する限り、libc6-dbgGDBはそれらを自動的にロードします。とが一致しないlibc6場合は、GDBから警告が表示されます。libc6libc6-dbg

を設定すると、GDBが読み取ろうとしているファイルを確認できますset verbose onlibc6いつ表示され、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".
于 2012-04-04T06:12:55.057 に答える
25

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

sudo apt-get install libc6-dbg

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

sudo apt-get install libc6:i386
sudo apt-get install libc6-dbg:i386
于 2013-11-16T15:13:50.940 に答える