在我的应用程序中,我设置了信号处理程序来捕获 Segfaults 并打印 bactraces。当进程启动时,我的应用程序会加载一些插件库。
如果由于主可执行二进制文件中的错误,我的应用程序因段错误而崩溃,我可以使用以下方法分析回溯:
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 下运行应用程序的站点上。
疯狂地在谷歌上搜索答案,但所有讨论回溯和 addr2line 的网站都排除了可能需要分析错误插件的场景。我希望一些好心的黑客知道解决这个困境的方法,并可以分享一些见解。对于其他程序员来说,这将是非常宝贵的。
提前致谢。