ubuntu下core file文件生成及調試

1.簡介:
corefile 是Linux下程序崩潰時生成的文件,能夠用來分析程序崩潰的緣由,由於它內部包含了程序崩潰時的堆棧信息。shell

2.corefile的設置ubuntu

默認狀況下,程序崩潰是不會生成corefile的,由於被操做系統限制。能夠經過命令: ulimit -c 來查看,若是值爲0則表示被限制了,因此不能生成corefile文件.vim

若是要使用corefile文件分析程序和系統異常信息,能夠經過以下命令打開,其中unlimited表示corefile文件的大小無限制.bash

$ ulimit -c unlimited

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

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

$ ulimit -c unlimited
$ source .bashrc 

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

默認corefile是生成在程序的執行目錄下或者程序啓動調用了chdir以後的目錄,咱們能夠經過設置生成corefile的格式來控制它,讓其生成在固定的目錄下。ui

/proc/sys/kernel/core_uses_pid能夠控制產生的core文件的文件名中是否添加pid做爲擴展,若是添加則文件內容爲1,不然爲0
/proc/sys/kernel/core_pattern能夠設置格式化的core文件保存位置或文件名,好比原來文件內容是core-%espa

# 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回車, 就能夠顯示程序在哪一行當掉的, 在哪一個函數中.

 ################################################################################

設置方法二:

1.用戶家目錄下創建corefiles文件夾.

$ mkdir corefiles

2.修改/etc/init.d/apport文件,在do_start 函數中添加 echo "/home/ubuntu/corefiles/core-%e-%p-%t" > /proc/sys/kernel/core_pattern  (注意替換爲你的 corefiles 目錄的路徑),註釋掉原來的 echo "|$AGENT %p %s %c %d %P" > /proc/sys/kernel/core_pattern;

do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started

        [ -e /var/crash ] || mkdir -p /var/crash
        chmod 1777 /var/crash

        # check for kernel crash dump, convert it to apport report
        if [ -e /var/crash/vmcore ] || [ -n "`ls /var/crash | egrep ^[0-9]{12}$`" ];then
            /usr/share/apport/kernel_crashdump || true
        fi

        # check for incomplete suspend/resume or hibernate
        if [ -e /var/lib/pm-utils/status ]; then
                /usr/share/apport/apportcheckresume || true
                rm -f /var/lib/pm-utils/status
                rm -f /var/lib/pm-utils/resume-hang.log
        fi

echo "/home/ubuntu/corefiles/core-%e-%p-%t" > /proc/sys/kernel/core_pattern #echo
"|$AGENT %p %s %c %P" > /proc/sys/kernel/core_pattern echo 2 > /proc/sys/fs/suid_dumpable }

3.添加用戶系統變量.在.bashrc文件底部添加以下:

$ vim .bashrc

ulimit -c unlimited
$ source .bashrc 

 當系統異常時就會在corefiles文件目錄下生成core文件。

相關文章
相關標籤/搜索