1. 程式人生 > >通過backtrace_symbols輸出資訊定位coredump位置

通過backtrace_symbols輸出資訊定位coredump位置

有時我們會在程式中檢測: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,進而快速完成任務!