對應的英文引自
5.1 檢查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導致了程式崩潰。
core dump檔案及應用
在寫 linux 程式時,經常會遇到 段錯誤 segmentation fault 這樣的問題。如果程式比較大,那麼如果用 gdb 除錯可能顯得比較吃力。這時可以用 core dump 檔案來進行分析。那什麼是 core dump 檔案呢?core dump 檔案就是在程式發生錯誤時,由作業系統把程...
GDB除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...
gdb除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...