ubuntu下core file文件生成及調試


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

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

設置方法二:

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文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM