學會用core dump除錯程式錯誤

工程師WWW發表於2013-11-07

前言 

  最近在專案中遇到大型程式出現SIGSEGV ,一直不知道用core dump工具來除錯程式,花了近一週的時間,才定位問題,老大很生氣,後果很嚴重,呵呵,事後仔細學習了這塊的知識,瞭解一點core dump的知識。

  在使用半導體作為記憶體的材料前,人類是利用線圈當作記憶體的材料(發明者為王安),線圈就叫作core ,用線圈做的記憶體就叫作“core memory”。(線圈的單詞應該是coil,呵呵)如今,半導體工業澎勃發展,已經沒有人用線圈當記憶體了,不過,在許多情況下,人們還是把記憶體叫作“core”。 所以注意了:這裡的core不是核心,而是記憶體。不過結合實際來看,好像也有點“核心所佔記憶體”的意思。

  core dump又是什麼東東? 我們在開發(或使用)一個程式時,最怕的就是程式莫明其妙地掛掉。雖然系統沒事,但我們下次仍可能遇到相同的問題。於是,這時作業系統就會把程式掛掉時的 記憶體內容寫入一個叫做core的檔案裡(這個寫入的動作就叫dump,dump的英語意思是垃圾、傾倒。從這裡來看,這些記憶體的內容是程式錯誤執行的結果,所以算是垃圾,把他弄出來就好比從大的記憶體池裡“傾倒”。),以便於我們除錯。這個過程,因此叫做core dump.在嵌入式系統中,有時core dump直接從串列埠列印出來,結合objdump查詢ra和epa地址,運用棧回溯,可以找到程式出錯的地方。

 

如何產生core dump檔案

  在一般Linux系統中,預設是不會產生core dump檔案的,通過ulimit -c來檢視core dump檔案的大小,一般開始是0,可以設定core檔案大小,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited。

core dump檔案輸出設定

  一般預設是當前目錄,可以在/proc/sys/kernel中找到core-user-pid,通過

1.使core檔名加上pid號

echo "1" > /proc/sys/kernel/core-user-pid

2.控制core檔案儲存位置和檔名格式

mkdir -p /root/corefile
echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

 

  以下是引數列表:
    %p - insert pid into filename 新增pid
    %u - insert current uid into filename 新增當前uid
    %g - insert current gid into filename 新增當前gid
    %s - insert signal that caused the coredump into the filename 新增導致產生core的訊號
    %t - insert UNIX time that the coredump occurred into filename 新增core檔案生成時的unix時間
    %h - insert hostname where the coredump happened into filename 新增主機名
    %e - insert coredumping executable name into filename 新增命令名

用gdb檢視core檔案


下面我們可以在發生執行時訊號引起的錯誤時發生core dump了.編譯時加上-g
發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.

gdb [exec file] [core file]

如:

gdb ./test test.core

在進入gdb後, 用bt命令檢視backtrace以檢查發生程式執行到哪裡, 來定位core dump的檔案行.

例項講解

複製程式碼
//test.c

void a()
{
   char *p = NULL;
   printf("%d/n", *p);
}

 
int main()
{
    a();
    return 0;
}
複製程式碼

編譯 

gcc -g -o test test.c

執行 ./test

報segmentation fault(core dump)

如果生成的是test.core.

gdb ./test test.core

相關文章