檢查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 ...