私のアプリケーションでは、セグメンテーション違反をキャッチし、bactrace を出力するようにシグナル ハンドラーをセットアップしました。私のアプリケーションは、プロセスの開始時にいくつかのプラグイン ライブラリを読み込みます。
メインの実行可能バイナリのエラーが原因で、アプリケーションがセグメンテーション違反でクラッシュした場合、次の方法でバックトレースを分析できます。
addr2line -Cif -e ./myapplication 0x4...
関数と source_file:line_no を正確に表示します
しかし、以下のバックトレースのように、プラグインのエラーが原因でクラッシュが発生したかどうかを分析するにはどうすればよいでしょうか?
/opt/myapplication(_Z7sigsegvv+0x15)[0x504245]
/lib64/libpthread.so.0[0x3f1c40f500]
/opt/myapplication/modules/myplugin.so(_ZN11ICAPSection7processEP12CONNECTION_TP7Filebufi+0x6af)[0x7f5588fe4bbf]
/opt/myapplication/modules/myplugin.so(_Z11myplugin_reqmodP12CONNECTION_TP7Filebuf+0x68)[0x7f5588fe51e8]
/opt/myapplication(_ZN10Processors7ExecuteEiP12CONNECTION_TP7Filebuf+0x5b)[0x4e584b]
/opt/myapplication(_Z15process_requestP12CONNECTION_TP7Filebuf+0x462)[0x4efa92]
/opt/myapplication(_Z14handle_requestP12CONNECTION_T+0x1c6d)[0x4d4ded]
/opt/myapplication(_Z13process_entryP12CONNECTION_T+0x240)[0x4d79c0]
/lib64/libpthread.so.0[0x3f1c407851]
/lib64/libc.so.6(clone+0x6d)[0x3f1bce890d]
私のアプリケーション ライブラリとプラグイン ライブラリは両方とも gcc でコンパイルされており、ストリップされていません。アプリケーションを実行すると、dlopen で plugin.so がロードされます 残念ながら、gdb でアプリケーションを実行できないサイトでクラッシュが発生しています。
必死に答えを探し回っていますが、backtrace と addr2line について議論しているすべてのサイトは、障害のあるプラグインの分析が必要になるシナリオを除外しています。心優しいハックがこのジレンマの解決策を知っており、いくつかの洞察を共有できることを願っています. 仲間のプログラマーにとっては非常に貴重です。
事前にたくさんの感謝を。