28

直接アクセスできないリモート システムで生成されたコア ファイルがあります。リモート システムからのライブラリ ファイルのローカル コピーと、クラッシュしたプログラムの実行可能ファイルもあります。

このコア ダンプを gdb で分析したいと思います。

例えば:

gdb path/to/executable path/to/corefile

私のライブラリは現在のディレクトリにあります。

過去に、デバッガーがオプション "-p" を指定してこれを実装しているのを見てきました。または "-p /=."; だから私の質問は:

gdb でコアファイルを分析するときに、ライブラリが現在のディレクトリに関連するパスから最初に読み込まれるように指定するにはどうすればよいですか?

4

5 に答える 5

47

実行可能ファイルまたはコア ファイルを指定せずに gdb を起動し、次のコマンドを入力します。

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

ライブラリ パスをターゲット システムから正確にミラーリングする必要があります。上記は、ホストに一致しないターゲットをデバッグするためのものです。そのため、ライブラリを含むルート ファイルシステム構造を複製することが重要です。

ホストと同じアーキテクチャおよび Linux/glibc バージョンのサーバーをリモート デバッグしている場合は、fdが提案したとおりに実行できます。

set solib-search-path <path>

すべてではなく一部のライブラリをオーバーライドしようとしている場合は、ターゲット ライブラリのディレクトリ構造を一時的な場所にコピーして、solib-absolute-prefix上記の解決策を使用できます。

于 2008-09-17T15:32:51.207 に答える
4

これがgdb内でまったく可能かどうかはわかりませんが、私は専門家ではありません。

ただし、 Linux動的リンカーについてはコメントできます。以下は、解決されたすべての共有ライブラリと未解決の共有ライブラリのパスを出力する必要があります。

ldd path/to/executable

共有ライブラリが実行可能ファイルにどのようにリンクされているかを知る必要があります。これを行うには、次のコマンドを使用します。

readelf -d path/to/executable | grep RPATH
  • コマンドが何も出力しない場合、ダイナミック リンカーは標準の場所と LD_LIBRARY_PATH 環境変数を使用して共有ライブラリを検索します。

  • コマンドがいくつかの行を出力する場合、動的リンカーは LD_LIBRARY_PATH を無視し、代わりにハードコーディングされた rpath を使用します。

    リストされた rpath が絶対パスである場合、私が知っている唯一の解決策は、ライブラリをリストされた場所にコピー (またはシンボリック リンク) することです。

    リストされた rpath が相対パスである場合は、実行時に実行可能ファイルのパスに置き換えられる $ORIGIN が含まれます。実行可能ファイルまたはライブラリを一致するように移動します。

詳細については、次から始めることができます。

man ld.so
于 2008-09-17T15:56:45.750 に答える
3

私はdeveloper.apple.comでこの抜粋を見つけました

set solib-search-path path

この変数が設定されている場合、pathは、共有ライブラリを検索するためのコロンで区切られたディレクトリのリストです。 solib-search-path' is used after solib-absolute-prefix'はライブラリの検索に失敗するか、ライブラリへのパスが絶対ではなく相対である場合。solib-absolute-prefix'を使用する場合は solib-search-path' instead of 、GDBがホストのライブラリを見つけられないように、必ず`solib-absolute-prefix'を存在しないディレクトリに設定してください。

編集:

上記の設定を使用すると、追加したディレクトリが追加されるとは思いませんが、追加されているように見えるため、現在のシステムにないファイルは、追加したパスで取得されます。solib-absolute-prefixを偽の何かに設定し、必要な順序でsolib-search-pathにディレクトリを追加することは、完全な解決策になると思います。

于 2008-09-17T15:48:36.240 に答える
2

gdb を呼び出すときに、LD_PRELOAD を各ライブラリに設定するか、LD_LIBRARY_PATH を現在のディレクトリに設定することもできます。これは、gdb 自体がプリロードしているライブラリのいずれかを使用しようとした場合にのみ問題を引き起こします。

于 2012-10-02T15:09:11.877 に答える
0

重要な注意事項:

クロス コンパイルを行っており、gdb でデバッグしようとしている
file ECECUTABLE_NAME場合は、完了後に smth が表示されます。お気に入り :

Using host libthread_db library "/lib/libthread_db.so.1"

次に、ターゲット システムに libthread_db があるかどうかを確認します。同様の問題をWeb上でたくさん見つけました。このような問題は、「set solib-」を使用するだけでは解決できません。クロスコンパイラを使用して libthread_db をビルドする必要があります。

于 2010-07-20T18:30:21.110 に答える