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

  • 相关阅读:
    【MongoDB】 C#官方驱动增删查改
    【MongoDB】MongoHelper
    【设计模式】简单的单例模式
    andriod深度探索及驱动开发展望
    搭建Android开发环境
    第一章Android系统移植与驱动开发概述
    时间
    django-admin和manage.py
    自定义django-admin命令
    会话session
  • 原文地址:https://www.cnblogs.com/saneri/p/10280227.html
Copyright © 2020-2023  润新知