2008-09-17 7 views
24

上のgdbでコアファイルをロードするときに私は私がへの直接アクセスを持っていないリモートシステムで生成されたコアファイルを持つディレクトリにライブラリパスを付加するにはどうすればよいです。また、リモートシステムからのライブラリファイルのローカルコピーと、クラッシュするプログラムの実行可能ファイルもあります。のLinux

私はgdbの中で、このコア・ダンプを分析したいと思います。例えば

gdb path/to/executable path/to/corefile 

マイライブラリは、現在のディレクトリにあります。私は、デバッガオプションを供給することにより、これを実装見てきた過去には

「-p。」または "-p/=。"ので、私の質問は:

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

答えて

39

スタート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ソリューションを使用することができます。

+0

私はパスが少し間違っていますので、あなたの答えを一致するように更新することができます。この答えは部分的に私の要求に合っているので、私はこの答えをアップヴォートしますが、ライブラリパスを置換するのではなく、ライブラリパスに前置することをもっと明確に述べる必要があります。 –

+0

ありがとう、それは本当に私を助けた! –

+0

私の場合、実行可能ファイルとそのライブラリはNFSマウントされたツリーにあり、デバッグしたいホストはNFSサーバーだったので、ツリーにシンボリックリンクを入れて、solib-absolute-prefix nfs-share-treeを正確な解決策。これが将来の世代に役立つことを願っています。 –

3

私は、この変数が設定されている場合、パスは共有ライブラリの 検索するディレクトリの コロンで区切ったリストです。developer.apple.com

set solib-search-path path 

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

EDIT:

私は上記の設定は、私が追加ディレクトリを付加します使用してはないと思うが、私の現在のシステムから欠落したファイルはパスでピックアップされているので、それらを追加しているように見えるん

追加した。私はsolib-absolute-prefixを何らかの偽のものに設定し、solib-search-pathのディレクトリを必要な順番で追加すると完全な解決策になるかもしれないと思います。

4

私はこれがすべてではgdb内で可能であるか分からないが、その後私は専門家です。

しかし、私はのLinuxダイナミックリンカについてコメントすることができます。解決済みの共有ライブラリと解決されていない共有ライブラリのパスを次のように出力する必要があります。

共有ライブラリが実行可能ファイルとどのようにリンクされているかを知る必要があります。

  • readelf -d path/to/executable | grep RPATH 
    
    がコマンド印刷何も、ダイナミックリンカが共有ライブラリを見つけるために、標準の場所に加えてLD_LIBRARY_PATH環境変数を使用しません必要があります。これを行うには、次のコマンドを使用します。

  • コマンドがいくつかの行を出力する場合、ダイナミックリンカはLD_LIBRARY_PATHを無視し、代わりにハードコードされたrpathsを使用します。

    もし指定されたrpathsが絶対的なものであるならば、私が知っている唯一の解決策は、リストされた場所にあなたのライブラリをコピー(またはシンボリックリンク)することです。

    rpathが相対パスの場合、実行時に実行ファイルのパスに置き換えられる$ ORIGINが含まれます。実行可能ファイルまたは一致するライブラリを移動します。より詳細な情報については

、あなたが始めることができます:

man ld.so 
+0

ありがとう、これはすべての有用な情報です。 –

+0

非常に有用な情報です。 gdbには関係しませんが、ldのパスを見つける私の場合に非常に関連しています –

0

一つの重要な注意事項:

あなたはクロスコンパイルを行うと、GDBでデバッグしようとしている場合は、 後smthが表示された場合は
file ECECUTABLE_NAMEを完了しています。 like:

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

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

2

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

+0

コマンドLD_LIBRARY_PATH = "。" gdb executableName.binは正常に動作しました。ありがとうございました。 – user2431763