linux下gdb如何處理coredump錯誤

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文件,那麼我們需要繼續執行以下操作:

  1. 設置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
  1. 禁用apport 服務, 有這個服務運行還是不能生成core 文件

sudo systemctl disable apport.service

  1. 重啟電腦或者虛擬機

使用GDB進行調試

gdb [可執行文件名] [core文件名]

執行gdb調試指令,backtrace(bt)列印當前的函數調用棧的所有資訊進行錯誤定位。

Tags: