SEGSEGV
共有ライブラリに入った後、スタック トレースを取得してファイルに保存しようとしています。共有ライブラリは、クローズド ソース製品のプラグインです。これはすべて本番環境で機能し、直接アクセスすることはできません。
私のコードはシグナルをキャッチしSIGSEGV
、スタックトレースを出力して終了します。私はこのようなものを持っています:
/opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019f11] /opt/ecelerity/libexec/site/ec_attachextensions.so [0x2aecc2019fee] /opt/ecelerity/ libexec/site/ec_attachextensions.so [0x2aecc201a587]
/opt/ecelerity/sbin/ecelerity [0x501235]
/opt/ecelerity/sbin/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]
問題は、共有ライブラリの関数名とオフセットを内部に持つことができないことです。私が理解しているように、でライブラリオフセットを見つけた後、 addr2line ユーティリティを使用して、特定のアドレスの関数名/ファイル名を見つけることができます/proc/$PID/maps
。
その後、私はそのようなことを実行しています:
addr2line -e /opt/ecelerity/libexec/site/ec_attachextensions.so (LIBRARY_OFFSET_FROM_MAPS_FILE - 0x2aecc2019f11)
0x2aecc2019f11
上記のスタック トレースのアドレスはどこにありますか。マップファイルに触れずにスタックトレースで関数名を取得する方法はありますか? 言い換えれば、どのようにプログラムできますか?dladdr
ここで役立ちますか(私の場合、関数dladdr
によって提供されるアドレスから関数名を取得できませんbacktrace
)?