__builtin_return_address(0)
で取得したアドレスがあるとします。 いつか私はそれを対応する関数名に変換したいと思っています。アドレスを関数名に変換する
There's dladdr(3)
動的ライブラリでのみ機能します。 シンボル(多分libunwind、backrace_symbol()など)の機能を受け取る方法はありますか?
__builtin_return_address(0)
で取得したアドレスがあるとします。 いつか私はそれを対応する関数名に変換したいと思っています。アドレスを関数名に変換する
There's dladdr(3)
動的ライブラリでのみ機能します。 シンボル(多分libunwind、backrace_symbol()など)の機能を受け取る方法はありますか?
デバッグ情報(-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
ファンクションattributeとpragmaにも注意してください。
実行ファイルが削除されても失敗した場合は気になりますか? – Barmar
いいえ、私の場合実行ファイルは削除されません – dimba
なぜそれが必要ですか? –