在Linux下程序不尋常退出時,內核會在當前工作目錄下生成一個core文件(是一個內存映像,同時加上調試信息,編譯時需要加上 -g -Wall)。
使用gdb來查看core文件,可以指示出導致程序出錯的代碼所在文件和行數。
1. core文件的生成開關和大小限制
1.1使用ulimit -c命令可查看core文件的生成開關。
若結果為0,則表示關閉了此功能,不會生成core文件。
1.2 使用ulimit -c filesize命令,可以限制core文件的大小(filesize的單位為kbyte)。
如果生成的信息超過此大小,將會被裁剪,最終生成一個不完整的core文件或者根本就不生成。
如果生成被裁減的core文件,調試此core文件的時候,gdb也會提示錯誤。
用以下命令來表示core文件的大小不受限制。
$ ulimit -c unlimited
用以下命令來阻止系統生成core文件:
$ ulimit -c 0
備注:ulimit命令設置后只對一個終端有效,所以另起終端后需要重新設置。
2. 設置 Core Dump 的核心轉儲文件目錄和命名規則
2.1 /proc/sys/kernel/core_uses_pid 可以控制產生的 core 文件的文件名中是否添加 pid 作為擴展 ,文件內容為1,表示添加pid作為擴展名,生成的core文件格式為core.xxxx;為0則表示生成的core文件同一命名為core。
示例:
$ echo "1" > /proc/sys/kernel/core_uses_pid
2.2 /proc/sys/kernel/core_pattern 可以設置格式化的 core 文件保存位置或文件名
示例:
$ 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 添加命令名
2.3 注意點
2.3.1 目錄proc文件系統是一個偽文件系統,以文件系統的方式為訪問系統內核數據的操作提供接口。/proc目錄的內容為系統啟動時自動生成的,某些文件可改,某些文件不可改。
比如可以通過修改proc的文件微調內核參數。使用vi可能無法成功編輯proc/sys/kernel/core_pattern,只能使用echo命令修改或者命令sysctl修改。
有時候echo命令沒有效果,就必須使用 sysctl 命令
示例:
$ sysctl -w "kernel.core_pattern=/corefile/core_%e_%t" >/dev/null $ sysctl -w "kernel.core_uses_pid=0" >/dev/null
說明:關於core存儲目錄說明,如果不想指定目錄,語法如下
$ sysctl -w "kernel.core_pattern=core-%e-%p-%t" >/dev/null
2.3.2 修改/etc/sysctl.conf(備用方案)
添加需要保存的路徑 "kernel.core_pattern = /tmp/corefile/core.%e.%t",需要注意的是該路徑必須應用有寫的權限,
不然core文件是不會生成的。再執行命令"sysctl -p"即可生效。
關於core_users_pid默認在sysctl文件里面已經存在,不需要更改,pid還是很重要的信息。
2.3.3 確保設置的 Core Dump 目錄是事先存在