標籤:訊號 tar include body -bash rpo 過程 jpg tail
使用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定位