linux下gdb如何處理coredump錯誤
在編寫C++程式中,我們經常會遇到一種錯誤,segment fault, 這種coredump錯誤
會導致程式執行時異常退出或者終止,這種錯誤沒有明顯錯誤提示資訊,該如何定位錯誤呢?
在linux下,這種錯誤會生成的一個叫做core的檔案,這個core檔案會記錄程式在執行時的記憶體,暫存器狀態,記憶體指標和函式堆疊資訊等等。對這個檔案進行分析可以定位到程式異常的時候對應的堆疊呼叫資訊。
但某些情況下,程式異常結束並不會生成這個core檔案,我們需要對linux環境做出一些設定。
1. 檢查core file size 是否被限制為0
輸入指令:
ulimit -a
若core file size 後面是0,我們需要修改為無限制
輸入:
ulimit -c unlimited
修改後為:
2.禁用apport服務
如果第一條操作仍無法生成core檔案,那麼我們需要繼續執行以下操作:
- 設定core 檔案的格式
開啟 /etc/sysctl.conf , 在底部加上如下2行, 設定生成的core檔案格式
sudo vim /etc/sysctl.conf
%e-execute name, %p-process %s-siganl that cause coredump
kernel.core_pattern=core-%e-%p-%s
- 禁用apport 服務, 有這個服務執行還是不能生成core 檔案
sudo systemctl disable apport.service
- 重啟電腦或者虛擬機器
使用GDB進行除錯
gdb [可執行檔名] [core檔名]
執行gdb除錯指令,backtrace(bt)列印當前的函式呼叫棧的所有資訊進行錯誤定位。