通过backtrace_symbols输出信息定位coredump位置
程序员文章站
2022-03-23 12:54:49
...
有时我们会在程序中检测:SIGSEGV信号,收到信号后,打印出当前的堆栈信息,进而方便我们定位出错的地方。
方法如下:
近期在线上环境中出现coredump后,打印如下的堆栈信息:
/var/ytt/mod_se/lib/libqsrch.so(_ZN14ImplSrchWorker8OnSignalEi+0x6a) [0x2aabd5e80aca]
03-29 09:36:15 ERROR [10277,11336,if_worker.cpp,268] /lib64/libc.so.6 [0x30f04302d0]
03-29 09:36:15 ERROR [10277,11336,if_worker.cpp,268] /var/ytt/mod_se/lib/libqsum.so(_ZN8Searcher6SearchEP11QsumContext+0x16e) [0x2aaaab6402fe]
03-29 09:36:15 ERROR [10277,11336,if_worker.cpp,268] /var/ytt/mod_se/module/libmod_se.so(_ZN15SumSearcherImpl6SearchEP11QsumContext+0x3f) [0x2b99c197796f]
那怎样解析上面的信息呢?其中的:_ZN8Searcher6SearchEP11QsumContext+0x16e表示是的什么含义呢?
_ZN8Searcher6SearchEP11QsumContext是c++中的name mangle机制的表示形式(可用c++filt进行demangle),后面的0x16e表示偏移地址。可以利用nm或者objdump等工具找到相应函数或者语句的虚拟地址,即nm libqsum.so |grep _ZN8Searcher6SearchEP11QsumContext找到虚拟地址,之后加上偏移地址,得到最终的虚拟地址。之后再利用objdump -dj .text libqsum.so 找到对应的虚拟地址。再根据源码以及汇编信息就可以定位coredump的可疑地址:
从上面的分析过程中我们获得了利用backtrace_symbols获取堆栈调试coredump的方法。
同时也给我下面的启发:
1、尽量不要自己手动管理内存,利用智能指针等RAII手段管理内存。当然也要了解智能指针相关的知识:如避免出现cycle reference,还有尽量别通过传值的方式传递智能指针等等注意的事项。关于智能指针的使用可以参加herbsutter的博客: https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/
2、多了解底层的知识,快速debug,进而快速完成任务!