1. core文件的簡單介紹
在一個程序崩潰時,它一般會在指定目錄下生成一個core文件。core文件僅僅是一個內存映象(同時加上調試信息),主要是用來調試的。
2. 開啓或關閉core文件的生成
用以下命令來阻止系統生成core文件:
ulimit -c 0
下面的命令可以檢查生成core文件的選項是否打開:
ulimit -a
該命令將顯示所有的用戶定製,其中選項-a代表“all”。
也可以修改系統文件來調整core選項
在/etc/profile通常會有這樣一句話來禁止產生core文件,通常這種設置是合理的:
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在開發過程中有時爲了調試問題,還是需要在特定的用戶環境下打開core文件產生的設置
在用戶的~/.bash_profile里加上ulimit -c unlimited來讓特定的用戶可以產生core文件
如果ulimit -c 0 則也是禁止產生core文件,而ulimit -c 1024則限制產生的core文件的大小不能超過1024kb
3. 設置Core Dump的核心轉儲文件目錄和命名規則
/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作爲擴展,如果添加則文件內容爲1,否則爲0
/proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core-%e
可以這樣修改:
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
將會控制所產生的core文件會存放到/corefile目錄下,產生的文件名爲core-命令名-pid-時間戳
以下是參數列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加當前uid
%g - insert current gid into filename 添加當前gid
%s - insert signal that caused the coredump into the filename 添加導致產生core的信號
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
%h - insert hostname where the coredump happened into filename 添加主機名
%e - insert coredumping executable name into filename 添加命令名
4. 使用core文件
在core文件所在目錄下鍵入:
gdb -c core
它會啓動GNU的調試器,來調試core文件,並且會顯示生成此core文件的程序名,中止此程序的信號等等
如果你已經知道是由什麼程序生成此core文件的,比如MyServer崩潰了生成core.12345,那麼用此指令調試:
gdb -c core MyServer
以下怎麼辦就該去學習gdb的使用了
5. 一個小方法來測試產生core文件
直接輸入指令:
kill -s SIGSEGV $$
6. 爲何有時程序Down了,卻沒生成 Core文件。
Linux下,有一些設置,標明瞭resources available to the shell and to processes。 可以使用
#ulimit -a 來看這些設置。 (ulimit是bash built-in Command)
-a All current limits are reported
-c The maximum size of core files created
-d The maximum size of a process鈥檚 data segment
-e The maximum scheduling priority ("nice")
-f The maximum size of files written by the shell and its children
-i The maximum number of pending signals
-l The maximum size that may be locked into memory
-m The maximum resident set size (has no effect on Linux)
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-q The maximum number of bytes in POSIX message queues
-r The maximum real-time scheduling priority
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell
-x The maximum number of file locks
從這裏可以看出,如果 -c是顯示:core file size (blocks, -c)
如果這個值爲0,則無法生成core文件。所以可以使用:
#ulimit -c 1024 或者 #ulimit -c unlimited 來使能 core文件。
如果程序出錯時生成Core 文件,則會顯示Segmentation fault (core dumped)。
7. Core Dump的核心轉儲文件目錄和命名規則:
/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作爲擴展,如果添加則文件內容爲1,否則爲0
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Core的意思是內存, Dump的意思是扔出來, 堆出來.
開發和使用Unix程序時, 有時程序莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以查看一下有沒有形如core.進程號的文件生成, 這個文件便是操作系統把程序down掉時的內存內容扔出來生成的, 它可以做爲調試程序的參考.
core dump又叫核心轉儲, 當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump.
gdb -c core文件路徑 [應用程序的路徑]
進去後輸入where回車, 就可以顯示程序在哪一行當掉的, 在哪個函數中.
有時候程序down了, 但是core文件卻沒有生成. core文件的生成跟你當前系統的環境設置有關係, 可以用下面的語句設置一下, 然後再運行程序便成生成core文件.
ulimit -c unlimited
core文件生成的位置一般於運行程序的路徑相同, 文件名一般爲core.進程號
可以執行limit命令具體的取值,如下:
<75 sersrv1 [pisac10] :/home/pisac10>limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize unlimited
coredumpsize 4194303 kbytes
memoryuse unlimited
vmemoryuse unlimited
descriptors 1024
memorylocked unlimited
maxproc 69632
如果發現某些選項達不到要求,可以將這些放大
下面我們可以在發生運行時信號引起的錯誤時發生core dump了.
發生core dump之後, 用gdb進行查看core文件的內容, 以定位文件中引發core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進入gdb後, 用bt命令查看backtrace以檢查發生程序運行到哪裏, 來定位core dump的文件->行.
使用file core文件命令就可以了,如下:
<63 sersrv1 [pisac10] :/home/pisac10>file core.3118
core.3118: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, SVR4-style, from 'csser'
SUSE Linux操作系統可以使用kill -7 進程號 命令強制殺掉進程並且產生core文件
致謝!