2017-02-07 4 views
0

__builtin_return_address(0)で取得したアドレスがあるとします。 いつか私はそれを対応する関数名に変換したいと思っています。アドレスを関数名に変換する

There's dladdr(3)動的ライブラリでのみ機能します。 シンボル(多分libunwind、backrace_symbol()など)の機能を受け取る方法はありますか?

+1

実行ファイルが削除されても失敗した場合は気になりますか? – Barmar

+0

いいえ、私の場合実行ファイルは削除されません – dimba

+1

なぜそれが必要ですか? –

答えて

1

デバッグ情報(-g)を使用して、すべてのコード(および使用している共有ライブラリを含む)をすべてコンパイルします。 GCCは、の両方を-gと、-O2のようないくつかの最適化フラグ(もちろんその場合、デバッグ情報は「おおよそ」です)を使用できるようにします。したがって、gcc -Wall -g -O2などでコードをコンパイルすることができます。

次に、最近のバージョンのGCCに含まれているおそらくIan Taylorのlibbacktraceを使用してください。

ところで、dladdrまたはbacktrace_symbolもうまくいくかもしれない(それはDWARF情報を解析しているので、私はlibbacktraceの使用を推奨します)。そして、dladdr(3)は、実行可能ファイル自体からのシンボルで動作します。実行ファイルを-rdynamicフラグでリンクする必要があるかもしれません。

注意してくださいまた、そのstaticシンボル(特にstatic関数)ELF実行可能ファイルに「実際には存在しない」(のみグローバルシンボルは、それに保管されている)ので、dladdrは、それらを与えることはできません。また、visibilityファンクションattributepragmaにも注意してください。

+0

backtrace.hを見ると、APIがバックトレースを受信して​​ビジー状態になっています。 私はバックトレースは必要ありませんが、むしろ離散したアドレスを変換する必要があります。 libtraceでこれを行うことはできますか? – dimba

+0

'dladdr'を試しましたか(' -g -O2'でコンパイルされた実行可能ファイル)? –

+0

-ggdb3 -O2なし。 – dimba

関連する問題