1. 程式人生 > >【Z】段錯誤Segment Fault定位,即core dump文件與gdb定位

【Z】段錯誤Segment Fault定位,即core dump文件與gdb定位

rect fun 發生 toolbar ulimit top wid title 沒有

使用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定位