zoukankan      html  css  js  c++  java
  • 关于启动程序崩溃时不产生coredump 文件分析办法

    在系统设置了ulimit -SHc unlimited ,程序并不产生corefile文件;由此有下面的分析:

    1. 程序使用了daemon的方式启动的, daemon是/etc/init.d/functions 上定义的函数,里面有一段是这样的

    daemon() {
    ......
        # make sure it doesn't core dump anywhere unless requested
        corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
    ......
        # And start it up.
        if [ -z "$user" ]; then
           $cgroup $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*"
        else
           $cgroup $nice runuser -s /bin/bash $user -c "$corelimit >/dev/null 2>&1 ; $*"
        fi
    ......    
    }

    解释:
    其 中$corelimit变量定义了corefile的设置,变量$DAEMON_COREFILE_LIMIT 则定义了corefile大小的设置,因为这个值没有初始化,那${DAEMON_COREFILE_LIMIT:-0}使得 DAEMON_COREFILE_LIMIT的大小为0;
    最后在执行程序的时候,就会设置corefile大小为0,即使你在系统启动时使用了ulimit -SHc unlimited; 也没有起到作用;
    那只要在/etc/init.d/functions上添加$DAEMON_COREFILE_LIMIT变量的初始值就好了

    # vi /etc/init.d/function
    
    ## user define set coredump
    DAEMON_COREFILE_LIMIT="unlimited"


    # 关于limits.conf上是不是要设置,表示不关心

    # vim /etc/security/limits.conf
    *   soft        core                unlimited
    *   hard        core                unlimited


    # 关于core的设置,有几个参数

    在 默认的情况下,很多系统的core文件是生成在你运行程序的目录下,或者你在程序中chdir后的那个目录,然后在core文件的后面加了一个pid。在 实际工作中,这样可能会造成很多目录下产生core文件,不便于管理,实际上,在2.6下,core文件的生成位置和文件名的命名都是可以配置的。

    /proc/sys/kernel/core_uses_pid      可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
    /proc/sys/kernel/core_pattern       可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e

    可以这样修改:
    echo "/tmp/core-%e-%p" > core_pattern
    将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
    以下是参数列表:

        %p - insert pid into filename 添加pid
        %u - insert current uid into filename 添加当前uid
        %g - insert current gid into filename 添加当前gid
        %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
        %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
        %h - insert hostname where the coredump happened into filename 添加主机名
        %e - insert coredumping executable name into filename 添加命令名

    当然上面的设置是临时性的,需要在/etc/sysctl.conf文件中增加

    kernel.core_pattern = /tmp/core-%e-%p

    加好后,如果你想不重启看看效果的话,则用下面的命令:

    sysctl -p /etc/sysctl.conf

    # 重启应用程序

    # 摘自网上的一段代码,用来测试corefile的产生 

    #include <stdio.h>
    
    int main(int argc, char* argv[])
    {
        char * p = NULL;
        *p = 123;
        return 0;
    }
    

      编译

    gcc -g ./main.c -o ./main.bin
    

     执行,产生coredump

    ./main.bin
    ls查看/tmp产生的dump文件
    
  • 相关阅读:
    Oracle数据库入门——体系结构
    基础知识——CentOS7操作系统的安装图文教程
    Oracle数据库入门——基础知识
    Windows Server 2008 R2 64位操作系统安装Oracle 11g 64位数据库,在客户终端上安装Oracle 11g 32位,才能安装P/L Sql Developer并配置
    2. Mysql数据库的入门知识
    1. Mysql数据库的安装
    Excel制作考勤管理
    常用函数公式及技巧搜集
    调试C++NPv2_Select_Reactor_Log_Server程序
    调试C++NPv2_Reactor_Log_Server程序
  • 原文地址:https://www.cnblogs.com/yoncan/p/3261798.html
Copyright © 2011-2022 走看看