1. 程式人生 > >ubuntu下core file文件生成及調試

ubuntu下core file文件生成及調試

conf pat 操作 pid sys 文件 配置 路徑 ulimit

1.簡介:
corefile 是Linux下程序崩潰時生成的文件,可以用來分析程序崩潰的原因,因為它內部包含了程序崩潰時的堆棧信息。

2.corefile的設置

默認情況下,程序崩潰是不會生成corefile的,因為被操作系統限制。可以通過命令: ulimit -c 來查看,如果值為0則表示被限制了,所以不能生成corefile文件.

如果要使用corefile文件分析程序和系統異常信息,可以通過如下命令打開,其中unlimited表示corefile文件的大小無限制.

$ ulimit -c unlimited

這種設置方式雖然簡單,但它卻只是跟shell相關的,也就是說,如果我們關閉了當前shell再打開一個,則剛才的設置就失效了,這是很不方便的,可以將ulimit -c unlimited 放入/etc/profile中,然後執行source /etc/profile即可立即生效。

如果想配置只針對某一用戶有效,則修改此用戶的~/.bashrc或者~/.bash_profile文件:

$ ulimit -c unlimited
$ source .bashrc 

3.設置Core Dump的核心轉儲文件目錄和命名規則

默認corefile是生成在程序的執行目錄下或者程序啟動調用了chdir之後的目錄,我們可以通過設置生成corefile的格式來控制它,讓其生成在固定的目錄下。

/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作為擴展,如果添加則文件內容為1,否則為0
/proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core-%e

# echo "/home/saneri/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

將會控制所產生的core文件會存放到corefile目錄下,產生的文件名為core-命令名-pid-時間戳

或者

$ sysctl -w kernel.core_pattern=/corefile/core-%e-%p-%t

如果想讓每次啟動都保存設置,則需要寫入配置文件中.

# echo "kernel.core_pattern=/home/saneri/corefile/core-%e-%p-%t" >> /etc/sysctl.conf 
# sysctl 
-p /etc/sysctl.conf kernel.core_pattern = /home/saneri/corefile/core-%e-%p-%t

關於格式的的控制有如下幾個參數:

%%:相當於%
%p:相當於<pid>
%u:相當於<uid>
%g:相當於<gid>
%s:相當於導致dump的信號的數字
%t:相當於dump的時間
%e:相當於執行文件的名稱
%h:相當於hostname

4.測試是否能生成core文件

$ kill -s SIGSEGV $$

查看 corefile目錄下是否生成了core文件

5.用gdb查看core文件

gdb -c core文件路徑 [應用程序的路徑]

進去後輸入where回車, 就可以顯示程序在哪一行當掉的, 在哪個函數中.

ubuntu下core file文件生成及調試