web-dev-qa-db-ja.com

Linuxのgdbにコアファイルをロードするときに、ライブラリパスのディレクトリを先頭に追加するにはどうすればよいですか?

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

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

例えば:

gdb path/to/executable path/to/corefile

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

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

Gdbでコアファイルを分析するときに、現在のディレクトリからの相対パスからライブラリを最初にロードするように指定するにはどうすればよいですか?

25

実行可能ファイルまたはコアファイルを指定せずに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ソリューションを使用できます。

41
Drew Frezell

これが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
4
bltxd

developer.Apple.com でこの抜粋を見つけました

set solib-search-path path

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

編集:

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

3

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

2
Joseph Garvin

1つの重要な注意:

あなたがクロスコンパイルをしていてgdbでデバッグしようとしているなら、あなたが終わった後
file ECECUTABLE_NAMEあなたはsmthを見た場合。お気に入り :

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

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

0
psihodelia