2016-04-18 5 views
3

関数のアドレスを取得していますが、これらのアドレスをシンボルに変換する方法がわかりません。 (関数名)。助けてくださいlinuxのリンクレジスタ(backtrace_symbolなど)を使用して関数アドレスから関数名を取得する方法

+4

を使用することをお勧めします。したがって、実行可能ファイルの形式を説明するドキュメントを入手する必要があります。 – user3386109

+1

私はこれを一度試しました。私はスタック上のアドレスをロギングし、手動でアセンブラ出力で検索しました。非常に遅い手順。私はバグを見つけました。 – Andreas

+0

addr2lineをチェックアウトすると、それはあなたが望むのと同様のことをします。 – fluter

答えて

1

最初の答えは、シンボル処理が隠された内部のABIだということです。いくつかのOSはカーネル空間でもこの魔法を実行します。しかし、明らかにARM + Linuxが必要です。

最初に必要な情報は、アドレスを元に戻すことです。このマッピングはここから取得できます:/ proc/self/stat

次の部分は、それらのファイルからそれらのオフセットをシンボルに逆順にするのが難しいです。そのためには、ELFファイルを解析する必要があります。あなたがバイナリデータを解析したくない場合は、代わりに

http://man7.org/linux/man-pages/man5/elf.5.html
objdumpの-t -T -r -R/libに/ x86_64の-linuxの-GNU/libnss_filesをカンニングしてobjdumpを使用し、ASCII形式のデータを解析することができます-2.19.so

これ以上の詳細情報が必要な場合は、デバッグ情報が含まれているセクションを解析する必要があります。また、別のファイルに移動して、 dbgパッケージを使用することができますが、これはおそらく多くの作業に役立ち、gdbをハックするかvalgrindのようなプロジェクトからコードを抽出する方が簡単です。

PS:物事がうまくいかないとき、あなたのユースケースは、デバッグ/診断を実行する場合、私は実行可能ファイルのデバッグバージョンは、その中にシンボル名を持つvalgrindの

+0

あなたが運が良ければ、あなたのlibcにbacktraceとbacktrace_symbolsの呼び出しがあります。あなたのマンページを確認する –

関連する問題