3

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)?

4

2 に答える 2

1

バックトレース コードは、dladdr とほぼ同じメカニズムを使用して関数名を決定します。

ライブラリがリンカー マップ ファイル (エクスポートされるものを定義し、他のすべてのアイテムの可視性を制限するために使用できます) を使用して構築されている場合、または-fvisibility=hidden明示的に可視シンボルを使用して構築されている場合、シンボルが隠されないようにします。バックトレース出力に表示されます。

回避策は、ライブラリ内のすべてのシンボルの可視性を制限するマップ ファイルを使用せずにコンパイルするか、-fvisibility=default. これにより、あなたに代わって何の努力もせずにバックトレースが機能します。

これを行わずに動作させるには、.so からローカル シンボル テーブルをロードし、addr2line と同様のメカニズムを使用してシンボルの位置を決定する必要があります。これを行うメカニズムは、を利用することですlibelf1。ローカルシンボルテーブルを読み取ります。

... もちろん、これにはテーブルがファイルから削除されていないことが必要です。その場合、 .so には単に情報が含まれていないため、これらのトリックは問題になりません。

于 2012-05-04T17:11:02.310 に答える
1

シグナルハンドラに /proc/self/maps を読み取らせることができます。

または、関数の絶対アドレスを出力して、比較のポイントとして使用してライブラリのオフセットを見つけることができます。

しかし、ベース アドレスを提供する動的リンカ関数が存在しても驚かないでしょう。それについてはドキュメントを確認してください。

于 2012-05-04T17:22:40.817 に答える