web-dev-qa-db-ja.com

GDBリモートデバッグ、シンボルが見つからないようです

アドレス192.168.98.64のマシンで実行されているアプリケーションをリモートデバッグしようとしています。そのマシンで私は実行します:

 gdbserver serveripaddr:4444 progname 

次に、サーバーから「gdb」を実行し、次にgdbプロンプトで次のコマンドを実行します。

(gdb)target remote192.168.98.64:4444
192.168.98.64:4444を使用したリモートデバッグ
 [新しいスレッド28432] 
警告:vsyscallページを読み込めませんでした実行可能ファイルが指定されていないため
最初に「file」コマンドを使用してみてください。
 0xb775e810 in ?? ()
(gdb)break internal [TAB] 

ブレークポイントを設定してinternalで始まる対応する関数のリストを表示しようとしたときに、Tabキーを押すことを期待していましたが、何も表示されません。コードは、-gを使用してデバッグをオンにしてコンパイルされています。私は何が間違っているのですか?

14
fred basset

「gdb」を実行します

デバッグしている実行可能ファイル(できれば、ストリップされていないバージョン)をGDBに提供することになっています。

gdb /path/to/progname
(gdb) target remote 192.168.98.64:4444
11

クロスコンパイルされたgdbを使用したときに、この問題に自分で遭遇しました(リモートホストのアーキテクチャが異なる場合は、通常、これが必要になります)。この場合、シンボルはリモートホストでコンパイルされたバイナリから読み取る必要があります。私は次のことが私のために働くことを理解しました(ホストのアーキテクチャが同じである場合も):

リモートホスト上:

gdbserver [Host]:[port] [remote-path-to-binary-from-gdbserver-workdir]

次に、(クロスコンパイルされた)gdbのローカルホストで:

Shell sleep 5
target remote [Host]:[port]
symbol-file remote:[remote-path-to-binary-from-gdbserver-workdir]
directory [local-root-directory-for-source-files]
continue

[*]をデータに置き換えます。これをgdbスクリプトとして使用するか(したがって、最初の行のsleep)、gdbコマンドラインに入力することができます。オプションのディレクトリ行は、ソースの検索パスにローカルソースディレクトリを追加するように指示します。これは、ソースコードを指すフロントエンドを使用する場合に役立ちます。

6
highsciguy

リモートでデバッグする場合、gdbクライアントはシンボルをどこからロードするかを知りません。 2つのオプションがあります。

1. specify executable when starting gdb

gdb <executable>
(gdb) target remote <IP>:<port>
(gdb) load <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

2. use file command to tell about the symbols.

gdb
(gdb) target remote <IP>:<port>
(gdb) load <executable>
(gdb) file <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

PS:デバッグシンボルを使用して実行可能ファイルをコンパイルしたことを確認してください-g -O0

5
Mohammad Azim