【Z】段錯誤Segment Fault定位,即core dump文件與gdb定位
使用C++開發系統有時會出現段錯誤,即Segment Fault。此類錯誤程序直接崩潰,通常沒有任何有用信息輸出,很難定位bug,因而無從解決問題。今天我們介紹core dump文件,並使用gdb進行調試,以此來定位段錯誤問題。此文同時用以備忘。
一、core dump
Core dump也稱核心轉儲, 當程序運行過程中異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 稱之為core dump文件。
系統默認不生成core dump文件,可以使用ulimit命令進行查看和設置。
查看。使用ulimit -c 或 ulimit -a命令查看core dump文件大小,如果core file size為0,則表示此時系統不會自動生成core dump文件,具體情況如圖1所示。
圖1
設置。我們可以通過ulimit-c unlimited命令,將core file size設置為不受限制unlimited,以此配置系統,使之可以自動生成coredump文件,具體操作如圖2所示。
圖2
二、段錯誤程序
我們編寫一段簡單的段錯誤程序,將之命名為core_test.cpp,代碼如下。編譯運行,系統自動產生了core文件,如圖3所示。
#include<assert.h>
int main() {
assert(0);
return 0;
}
圖3
三、core文件命名
在生產環境中,一臺服務器上運行的程序較多,如果所有程序的core dump文件都自動命名為core,則可能造成一定的混亂。為此,我們可以通過設置,使得系統在為core dump文件命名時註明更多信息。
進程號。通過以下設置,可以使core dump文件名為core.pid形式。如圖4所示,系統自動生成了core.3430文件。
echo "1" >/proc/sys/kernel/core_uses_pid
圖4
更多信息。通過以下設置,可以使core dump文件名為core-exe-pid-time形式。如圖4所示,系統自動生成了core-core_test-3465-1416037828文件。
echo “/coredir/core-%e-%p-%t” > /proc/sys/kernel/core_pattern/
圖5
如果我們想進一步訂制core文件的名稱,可以根據表1的信息,進行設置。
表1
%% 單個%字符 %p 進程ID %u 進程實際用戶ID %g 進程的實際組ID %s 導致本次core dump的信號 %t core dump的時間戳 (由1970年1月1日計起的秒數) %h 主機名 %e 程序文件名 |
四、使用gdb定位core dump錯誤
部分博友的博客中提到使用gdb –c core與where命令定位錯誤。或許是因為配置不同,我實際操作後發現如果使用gdb –c core,則獲得的定位信息不具有可讀性,具體如圖6所示。
圖6
最終,我使用gdb core_test core命令(其中core_test是發生dump的可執行程序,core是core file),進入gdb後,再使用where命令,可以定位到發生dump的代碼位置,並且具有良好的可讀性,具體如圖7所示。
圖7
參考
http://blog.csdn.net/ithomer/article/details/5945152
【Z】段錯誤Segment Fault定位,即core dump文件與gdb定位