gdb
に複数のシンボルファイルをロードする方法。実行可能なfoo.outがあり、モジュールbar.soをロードしています。 foo.symbolとbar.symbolの2つのシンボルファイルを作成しました。両方のファイルをgdbにロードする方法。
# gdb --core core
# (gdb)
# (gdb) symbol-file foo.symbol
2番目のシンボルファイルをロードする方法。または、gdb
のディレクトリのすべてのファイルをロードする方法はありますか
シンボルファイルを含むディレクトリを設定するには
set debug-file-directory <directory>
そして使用する
show debug-file-directory
現在、シンボルファイルを含むディレクトリとして設定されているものを表示します。
デバッグリンクの観点からバイナリによって名前(パスなし)が提供される場合、シンボルファイルはこのディレクトリから自動的に読み取られます。
追加のシンボルを追加するには、add-symbol-file
を使用できます。
( gdb onlinedocs は、ここでこれを引用した時点では利用できないようです)
追加記号ファイルのファイル名アドレス
add-symbol-file filename address [-readnow] [-mapped]
add-symbol-file filename -ssection address ...
Add-symbol-fileコマンドは、ファイルfilenameから追加のシンボルテーブル情報を読み取ります。このコマンドは、実行中のプログラムにfilenameが(他の方法で)動的にロードされたときに使用します。 addressは、ファイルがロードされたメモリアドレスでなければなりません。 gdbはこれを自分で理解することはできません。さらに、任意の数の「-セクションアドレス」ペアを指定して、そのセクションのセクション名とベースアドレスを明示的に指定できます。任意のアドレスを式として指定できます。
ファイルfilenameのシンボルテーブルは、symbol-fileコマンドで最初に読み取られたシンボルテーブルに追加されます。 add-symbol-fileコマンドは何回でも使用できます。こうして読み取られた新しいシンボルデータは、古いシンボルデータに追加され続けます。代わりにすべての古いシンボルデータを破棄するには、引数なしでsymbol-fileコマンドを使用します。
Filenameは通常、共有ライブラリファイル、実行可能ファイル、またはプロセスへの読み込み用に完全に再配置された他のオブジェクトファイルですが、次の条件を満たしていれば、再配置可能な.oファイルからシンボリック情報を読み込むこともできます。
- ファイルのシンボリック情報は、他のオブジェクトファイルで定義されたシンボルではなく、そのファイルで定義されたリンカーシンボルのみを参照します。
- ファイルのシンボリック情報が参照するすべてのセクションは、実際にファイルに表示されるように、下位にロードされています。
- すべてのセクションがロードされたアドレスを特定し、これらをadd-symbol-fileコマンドに提供できます。
Sun ChorusやVxWorksなどの一部の組み込みオペレーティングシステムは、再実行可能なファイルを既に実行中のプログラムにロードできます。このようなシステムでは、通常、上記の要件を簡単に満たすことができます。ただし、多くのネイティブシステムが複雑なリンクプロシージャ(.linkonceセクションファクタリングやC++コンストラクタテーブルアセンブリなど)を使用しているため、要件を満たすのが難しいことを認識することが重要です。一般に、add-symbol-fileを使用して再配置可能オブジェクトファイルのシンボリック情報を読み取ると、通常の方法で再配置可能オブジェクトファイルをプログラムにリンクするのと同じ効果があるとは考えられません。
add-symbol-fileは、使用後にを押すと繰り返されません。
Symbol-fileコマンドと同様に、
-mapped' and
- readnow 'オプションを使用して、gdbがファイル名のシンボルテーブル情報を管理する方法を変更できます。
Alkの回答とそのコメントに加えて、尋ねられるアドレスは.text
セクション。 readelf
コマンドを使用して見つけることができます
ここに、バイナリファイルのreadelf
の使用例があります ファイル名がロードされているアドレスがありません[GDB]
追加のシンボルは、次を使用してgdb
デバッグセッションにロードできます。
add-symbol-file filename address
パラメーターaddress
は、.text
セクションのアドレスです。このアドレスは次の方法で取得できます。
readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'
次のエントリを~/.gdbinit
に追加することで、gdb
でこれを自動化できます。
define add-symbol-file-auto
# Parse .text address to temp file
Shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk '{ print "0x"$5 }') >/tmp/temp_gdb_text_address.txt
# Source .text address
source /tmp/temp_gdb_text_address.txt
# Clean tempfile
Shell rm -f /tmp/temp_gdb_text_address.txt
# Load symbol table
add-symbol-file $arg0 $text_address
end
上記の関数定義の後、add-symbol-file-auto
を使用して追加のシンボルをロードできます。
(gdb) add-symbol-file-auto path/to/1.elf
add symbol table from file "path/to/1.elf" at
.text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/2.elf
add symbol table from file "path/to/2.elf" at
.text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x08006cb0 in main() at ./source/main.cpp:114
1.2 y 0x080106a6 in main() at ./main.cpp:10
(gdb)
シンボルを正しい場所に手動でロードしようとする代わりに、 削除された実行可能ファイルにシンボルをマージする でeu-unstrip
を使用してから、既に存在するシンボルでクラッシュを再現する方が便利です。
このアプローチは、パス解決メカニズム(debug linkおよびbuildに必要な命名スキームに一致するシンボルファイルに依存しません。 debug-file-directory
を設定すると使用されるid)。
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...