linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault(段錯誤),此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。
使用ulimit -a可以檢視系統core檔案的大小限制;使用ulimit -c [kbytes]可以設定系統允許生成的core檔案大小,例如
ulimit -c 0 不產生core檔案
ulimit -c 100 設定core檔案最大為100k
ulimit -c unlimited 不限制core檔案大小
先看一段會造成段錯誤的程式:
#include
int main()
編譯執行後結果如下:
[leconte@localhost test]$ gcc -g -o test a.c
[leconte@localhost test]$ ./test
段錯誤此時並沒有產生core檔案,接下來使用ulimit -c設定core檔案大小為無限制,再執行./test程式,結果如下:
[leconte@localhost ~]$ ulimit -a
core file size (blocks, -c) 0
[leconte@localhost test]$ ulimit -c unlimited
[leconte@localhost test]$ ulimit -a
core file size (blocks, -c) unlimited
[leconte@localhost test]$ ./test
段錯誤 (core dumped)
[leconte@localhost test]$ ls -al core.*
-rw------- 1 leconte leconte 139264 01-06 22:31 core.2065
可見core檔案已經生成,接下來可以用gdb分析,檢視堆疊情況:
[leconte@localhost test]$ gdb ./test core.2065
gnu gdb fedora (6.8-27.el5)
license gplv3+: gnu gpl version 3 or later <>
this is free software: you are free to change and redistribute it.
there is no warranty, to the extent permitted by law. type "show copying"
and "show warranty" for details.
this gdb was configured as "i386-redhat-linux-gnu"...
warning: exec file is newer than core file.
warning: can't read pathname for load map: input/output error.
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
core was generated by `./test'.
program terminated with signal 11, segmentation fault.
[new process 2065]
#0 0x0804836f in main () at a.c:6
6 *ptr=0;
從上述輸出可以清楚的看到,段錯誤出現在a.c的第6行,問題已經清晰地定位到了。
很多系統預設的core檔案大小都是0,我們可以通過在shell的啟動指令碼/etc/bashrc或者~/.bashrc等地方來加入 ulimit -c 命令來指定core檔案大小,從而確保core檔案能夠生成。
除此之外,還可以在/proc/sys/kernel/core_pattern裡設定core檔案的檔名模板,詳情請看core的官方man手冊
Linux下發生段錯誤時如何產生core檔案
linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...
Linux下發生段錯誤時如何產生core檔案
linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...
Linux下發生段錯誤時如何產生core檔案
linux下的c程式常常會因為記憶體訪問錯誤等原因造成segment fault 段錯誤 此時如果系統core dump功能是開啟的,那麼將會有記憶體映像轉儲到硬碟上來,之後可以用gdb對core檔案進行分析,還原系統發生段錯誤時刻的堆疊情況。這對於我們發現程式bug很有幫助。使用ulimit a可...