檢查core檔案

2021-05-23 07:14:09 字數 1963 閱讀 2681

檢查core檔案(核心轉儲檔案)

除了允許程式在偵錯程式的控制下執行外,-g選項乙個非常有用的功能是利用「core dump」檢查程式崩潰的原因。

當乙個程式異常結束時(比如崩潰),作業系統能夠將程式崩潰時記憶體中的狀態資訊寫入乙個core檔案(通常這個檔案命名為core)。這個檔案經常被稱為core dump(核心轉儲).與-g選項產生的符號表資訊結合,這個core dump能用來找到程式在哪一行異常結束了,以及程式執行到這一行時相關變數的值。

這個特性在軟體開發當中和軟體發布後都是非常有用的,這是因為可以從程式崩潰的現場調查有關問題。

下面的簡單程式中包含乙個非法訪存的bug,我們將用這個程式來產生乙個core檔案。

int foo (int *p);

intmain (void)

intfoo (int *p)

這個程式試**引用乙個空指標p,眾所周知,這是乙個非法的操作。在大多數系統上,這將產生異常結束。

為了能找到程式崩潰的原因,我們需用-g選項來編譯這個程式。

$ gcc -wall -g null.c

需要注意的是空指標訪問僅在執行時出現異常,因此選項-wall並不產生任何警告。

在x86 gnu/linux系統上執行這個可執行檔案,將會引起作業系統異常終止這個程式:

$ ./a.out

segmentation fault (core dumped)

只要出現錯誤資訊'core dumped',作業系統就會在當前目錄產生乙個"core"檔案。這個core檔案包含程式結束時的記憶體資訊的副本。術語「段錯誤」有時指程式試圖訪問已分配給它的記憶體之外的乙個受限記憶體「段」。

一些作業系統配置為預設不生成core檔案。這樣做的理由是基於core檔案可能體積很大因而可能會很快佔滿剩餘磁碟空間。在gnu bash shell中,用命令ulimit -c 可以控制core檔案的最大體積。如果用上述命令得到的是0,那麼不產生core檔案。當前的大小限制用下列的命令可以獲知。

$ ulimit -c

0如果結果是0, 如上所示,那麼可以用下面的命令允許生成任意大小的core檔案。

ulimit -c unlimited

注意上面的設定僅在當前shell有效。為了在將來的會話中有效,可以將上面的命令加入乙個登入檔案,比如gnu bash shell的.bash_profile檔案。

core檔案可以用下面的命令裝入gdb中除錯。

gdb executalbe_file core_file

注意原來的可執行檔案和core檔案在除錯中都是必須的。不能在沒有相應的可執行檔案的情況下除錯乙個core檔案。在這個例子中,我們用下面的命令裝入可執行檔案和core檔案:

$ gdb a.out core

偵錯程式立即列印診斷資訊,並顯示程式崩潰的行號(第13行):

$ gdb a.out core

core was generated by `./a.out'.

program terminated with signal 11, segmentation fault.

reading symbols from /lib/libc.so.6...done.

loaded symbols for /lib/libc.so.6

reading symbols from /lib/ld-linux.so.2...done.

loaded symbols for /lib/ld-linux.so.2

#0  0x080483ed in foo (p=0x0) at null.c:13

13        int y = *p;

(gdb)

最後一行(gdb)是gdb的提示符,它提示後面可以繼續輸入命令。

為了弄清楚程式崩潰的原因,我們在偵錯程式中用print命令顯示指標p的值。

(gdb) print p

$1 = (int *) 0x0

這個資訊告訴我們p是乙個整形的空指標(0x0),因此我們知道指標解耦訪問*p導致了程式崩潰。

Linux生成core檔案 core檔案路徑設定

在linux下產生並除錯core檔案 先看看我用的是個什麼機器 uname a linux dev 2.4.21 9.30axsmp 1 smp wed may 26 23 37 09 edt 2004 i686 i686 i386 gnu linux 再看看預設的一些引數,注意core file ...

Linux生成core檔案 core檔案路徑設定

在linux下產生並除錯core檔案 先看看我用的是個什麼機器 uname a linux dev 2.4.21 9.30axsmp 1 smp wed may 26 23 37 09 edt 2004 i686 i686 i386 gnu linux 再看看預設的一些引數,注意core file ...

Linux生成core檔案 core檔案路徑設定

在linux下產生並除錯core檔案 先看看我用的是個什麼機器 uname a linux dev 2.4.21 9.30axsmp 1 smp wed may 26 23 37 09 edt 2004 i686 i686 i386 gnu linux 再看看預設的一些引數,注意core file ...