共有ライブラリ内でSEGSEGV
を取得した後、スタックトレースを取得してファイルに保存しようとしています。共有ライブラリは、クローズドソース製品用のプラグインです。これらはすべて本番環境で動作し、私はそれに直接アクセスすることはできません。共有ライブラリ内のバックトレース機能
私のコードはSIGSEGV
シグナルをキャッチし、スタックトレースを出力して終了します。
[0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] は/ opt/ecelerity/libexecに/opt/ecelerity/libexec/site/ec_attachextensions.so:私はこのような何かを持っています【0x2aecc201a587]
/OPT/ecelerity/sbinに/ ecelerity [0x5]
/OPT/ecelerity/sbinに/opt/ecelerity/libexec/site/ec_attachextensions.so /site/ec_attachextensions.so [0x2aecc2019fee] /ecelerity(sieve_seng_execute + 0x82)[0x506d32] /opt/ecelerity/libexec/validate/sieve.so [ 0x2aecc2862c9e] /OPT/ecelerity/sbinに/ ecelerity(VALIDATE_DATA + 0xA5の)0x4a90d5] /OPT/ecelerity/sbinに/ ecelerity(esmtp_message_factory + 0x154e)0x46eace] /OPT/ecelerity/sbinに/ ecelerity(schedule_event_and_dispatch + 0x6a) [0x49c59a]
問題は、共有された ライブラリでは、関数名とオフセットの名前を持つことができないということです。私が理解するように、/proc/$PID/maps
にライブラリオフセットが見つかると、 addr2lineユーティリティの助けを借りて、指定されたアドレスの関数名/ファイル名を見つけることができます。
その後、私はそのような何かを実行しています:
0x2aecc2019f11
は、上記のスタックトレースからのアドレスである
addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11)
。私はマップファイルに触れることなくスタックトレースで関数名を得ることができる方法があるのだろうか?言い換えれば、私はどのようにプログラムすることができますか? dladdr
こちら(dladdr
私の場合はbacktrace
が提供するアドレスから関数名を取得できません)