在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案(是乙個記憶體映像,同時加上除錯資訊)。使用gdb來檢視core檔案,可以指示出導致程式出錯的**所在檔案和行數。
1.core檔案的生成開關和大小限制
(1)使用ulimit -c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,不會生成core檔案。
(2)使用ulimit -c filesize命令,可以限制core檔案的大小(filesize的單位為kbyte)。若ulimit -c unlimited,則表示core檔案的大小不受限制。如果生成的資訊超過此大小,將會被裁剪,最終生成乙個不完整的core檔案。在除錯此core檔案的時候,gdb會提示錯誤。
2.core檔案的名稱和生成路徑
core檔案生成路徑:
輸入可執行檔案執行命令的同一路徑下。
若系統生成的core檔案不帶其它任何擴充套件名稱,則全部命名為core。新的core檔案生成將覆蓋原來的core檔案。
(1)/proc/sys/kernel/core_uses_pid可以控制core檔案的檔名中是否新增pid作為擴充套件。檔案內容為1,表示新增pid作為副檔名,生成的core檔案格式為core.***x;為0則表示生成的core檔案同一命名為core。
可通過以下命令修改此檔案:
echo "1" > /proc/sys/kernel/core_uses_pid
3.core檔案的檢視
core檔案需要使用gdb來檢視。
gdb ./a.out
core-file core.***x
使用bt命令即可看到程式出錯的地方。
以下兩種命令方式具有相同的效果,但是在有些環境下不生效,所以推薦使用上面的命令。
(1)gdb -core=core.***x
file ./a.out
bt (2)gdb -c core.***x
file ./a.out
bt4.開發板上使用core檔案除錯
如果開發板的作業系統也是linux,core除錯方法依然適用。如果開發板上不支援gdb,可將開發板的環境(依賴庫)、可執行檔案和core檔案拷貝到pc的linux下。
在 pc上除錯開發板上產生的core檔案,需要使用交叉編譯器自帶的gdb,並且需要在gdb中指定solib-absolute-prefix和 solib-search-path兩個變數以保證gdb能夠找到可執行程式的依賴庫路徑。有一種建立配置檔案的方法,不需要每次啟動gdb都配置以上變數,即:在待執行gdb的路徑下建立.gdbinit。
配置檔案內容:
set solib-absolute-prefix your_cross_compile_path
set solib-search-path your_cross_compile_path
set solib-search-path your_developer_tools_lib_path
handle sig32 nostop noprint pass
注意:待除錯的可執行檔案,在編譯的時候需要加-g,core檔案才能正常顯示出錯資訊!有時候core資訊很大,超出了開發板的空間限制,生成的core資訊會殘缺不全而無法使用,可以通過掛載到pc的方式來規避這一點。
摘自《unix
環境高階程式設計》第10
章訊號。
使用core
檔案除錯程式
看下面的例子:
/*core_dump_test.c*/
1 #include 2
3 const char *str = "test"; 4
5 void core_test() 6
910 int main()
11
編譯:
[zhanghua@localhost core_dump]$ gcc –g core_dump_test.c -o core_dump_test
如果需要除錯程式的話,使用gcc編譯時加上-g選項,這樣除錯core檔案的時候比較容易找到錯誤的地方。
執行:
[zhanghua@localhost core_dump]$ ./core_dump_test
段錯誤
執行core_dump_test程式出現了「段錯誤」,但沒有產生core檔案。這是因為系統預設core檔案的大小為0,所以沒有建立。可以用ulimit命令檢視和修改core檔案的大小。
[zhanghua@localhost core_dump]$ ulimit -c 0
[zhanghua@localhost core_dump]$ ulimit -c 1000
[zhanghua@localhost core_dump]$ ulimit -c
1000
-c 指定修改core檔案的大小,1000指定了core檔案大小。也可以對core檔案的大小不做限制,如:
[zhanghua@localhost daemon]# ulimit -c unlimited
[zhanghua@localhost daemon]# ulimit -c
unlimited
如果想讓修改永久生效,則需要修改配置檔案,如.bash_profile、/etc/profile或/etc/security/limits.conf。
再次執行:
[zhanghua@localhost core_dump]$ ./core_dump_test
段錯誤(core dumped)
[zhanghua@localhost core_dump]$ ls core.*
core.6133
可以看到已經建立了乙個core.6133的檔案.6133是core_dump_test程式執行的程序id。
在linux
下可以用gdb
來除錯core
檔案。
[zhanghua@localhost core_dump]$ gdb core_dump_test core.6133
gnu gdb red hat linux (5.3post-0.20021129.18rh)
gdb is free software, covered by the gnu general public license, and you are
welcome to change it and/or distribute copies of it under certain conditions.
type "show copying" to see the conditions.
there is absolutely no warranty for gdb. type "show warranty" for details.
this gdb was configured as "i386-redhat-linux-gnu"...
core was generated by `./core_dump_test'.
program terminated with signal 11, segmentation fault.
reading
symbols from /lib/tls/libc.so.6...done.
loaded symbols for /lib/tls/libc.so.6
reading
symbols from /lib/ld-linux.so.2...done.
loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_dump_test.c:7
7 str[1] = 't';
(gdb) bt
#0 0x080482fd in core_test () at core_dump_test.c:7
#1 0x08048317 in main () at core_dump_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
gdb中鍵入bt,就會看到程式崩潰時堆疊資訊(當前函式之前的所有已呼叫函式的列表(包括當前函式),gdb只顯示最近幾個),我們很容易找到我們的程式在最後崩潰的時候呼叫了core_dump_test.c 第7行的**,導致程式崩潰。注意:在編譯程式的時候要加入選項-g。您也可以試試其他命令,如 fram、list等。更詳細的用法,請查閱gdb文件。
什麼時候不產生core檔案
在下列條件下不產生core檔案:
( a )程序是設定-使用者-id,而且當前使用者並非程式檔案的所有者;
( b )程序是設定-組-id,而且當前使用者並非該程式檔案的組所有者;
( c )使用者沒有寫當前工作目錄的許可權;
( d )檔案太大。core檔案的許可權(假定該檔案在此之前並不存在)通常是使用者讀/寫,組讀和其他讀。
**:
Linux下core檔案除錯方法
在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案 是乙個記憶體映像,同時加上除錯資訊 使用gdb來檢視core檔案,可以指示出導致程式出錯的 所在檔案和行數。1.core檔案的生成開關和大小限制 1 使用ulimit c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,...
Linux下core檔案除錯方法
在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案 是乙個記憶體映像,同時加上除錯資訊 使用gdb來檢視core檔案,可以指示出導致程式出錯的 所在檔案和行數。1.core檔案的生成開關和大小限制 1 使用ulimit c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,...
Linux下core檔案除錯方法
在程式不尋常退出時,核心會在當前工作目錄下生成乙個core檔案 是乙個記憶體映像,同時加上除錯資訊 使用gdb來檢視core檔案,可以指示出導致程式出錯的 所在檔案和行數。1.core檔案的生成開關和大小限制 1 使用ulimit c命令可檢視core檔案的生成開關。若結果為0,則表示關閉了此功能,...