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

相关文章
相关标签/搜索