檢查core dump檔案

2021-08-25 00:13:25 字數 1975 閱讀 9415

對應的英文引自

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檔案,使用如下命令 使用時注意,我在測...