web-dev-qa-db-ja.com

gdbに複数のシンボルファイルを読み込む方法

gdbに複数のシンボルファイルをロードする方法。実行可能なfoo.outがあり、モジュールbar.soをロードしています。 foo.symbolとbar.symbolの2つのシンボルファイルを作成しました。両方のファイルをgdbにロードする方法。

# gdb --core core
# (gdb) 
# (gdb) symbol-file foo.symbol

2番目のシンボルファイルをロードする方法。または、gdbのディレクトリのすべてのファイルをロードする方法はありますか

28
Ibrar Ahmed

シンボルファイルを含むディレクトリを設定するには

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がファイル名のシンボルテーブル情報を管理する方法を変更できます。

18
alk

Alkの回答とそのコメントに加えて、尋ねられるアドレスは.text セクション。 readelfコマンドを使用して見つけることができます

ここに、バイナリファイルのreadelfの使用例があります ファイル名がロードされているアドレスがありません[GDB]

10
Olivier

追加のシンボルは、次を使用して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)
7
Jaakko

シンボルを正しい場所に手動でロードしようとする代わりに、 削除された実行可能ファイルにシンボルをマージするeu-unstripを使用してから、既に存在するシンボルでクラッシュを再現する方が便利です。

このアプローチは、パス解決メカニズム(debug linkおよびbuildに必要な命名スキームに一致するシンボルファイルに依存しません。 debug-file-directoryを設定すると使用されるid)。

1
the8472
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...

http://www.delorie.com/gnu/docs/gdb/gdb_125.html を参照してください

0
Frank Ren