• Linux core dumps 的生成


    简介:
         在程序开发过程中,我们可以通过assert,log, 单元测试,单步调试这些手段来排除bug,解决异常,提升代码质量。在发布版中,程序被异常终止了,只能通过当时的日志追踪程序当时运行的情景,如果没有core dumps 文件,在查找解决bug的时候,困难提高了几个数量级。
         当程序在运行过程中遇到异常,操作系统为了安全期间,会将异常程序关闭,并生成崩溃文件。崩溃文件一般是程序崩溃地址前的堆栈快照信息。通过崩溃文件运行与之匹配的程序,就可以找到程序异常事故现场,找到相应的代码片段,解决问题。本篇文章教你如何打开core dumps 开关,在程序崩溃时,生成崩溃文件。


    Core dumps开关:
         Centos系统core dumps默认 是关闭的,很显然Linux的思维方式就是定制你个人的私有操作系统,如果你对哪里不满意,或者你只需要某些应用或者服务,好的自己去安装,或者自己去打开。而不是霸道的为你做主。安全方面是列外,比如iptables是默认打开,这方面还是可以理解的。
         通过ulimit命令可以方便的查看core dumps文件是否打开:

         
    ulimit -c

         如果输出为0,说明core dumps开关未打开。
         打开 生成core dumps 文件开关,执行

    ulimit -c ulimited

         打开开关,ulimited 的意思是成成dump文件大小无限制,如果想对大小限制,可以换成数字,单位是kb。可是限制大小生成的dump文件是残缺的,用gdb调试可能会失败。所以最好还是开启为ulimited。
         执行命令后,系统生成core dumps的开关是打开了,等待下次系统重启的时候还是会默认为0,如果想以后系统重启,还是可以生成dump 文件,需要修改系统配置文件(/etc/profile):
         如果已经有:

    ulimit -c 0 > /dev/null 2>&1

         可以修改为下面命令,如果没有可以添加此命令

    ulimit -c unlimited >/dev/null 2>&1

    linux 几乎所有东西都是通过文件来描述的,ulimit 来设置和查看一些系统配置的命令。通过
    ulimit -a
    可以查看,设置那些变量, 其中core file size,就是通过-c选项来描述的。/dev/null 你可以理解为黑洞,任何文件,或信息导入它,都会被吞噬。linux 用0来描述标准输入,1来描述标准输出,2来描述标准错误。>为导入符。整个意思就是在执行 ulimit -c命令的时候,无论是输出,还是错误都导入都忽略掉。

    Core dumps生成规则:
         如果只打开dump开关,生成的dump文件路径为当前程序崩溃路径,dump文件名称为:core.19021,19021为进程号。如何定制自己想要的文件名和路径:打开文件:/etc/sysctl.conf

         添加下面命令:
         kernel.core_uses_pid = 1
         kernel.cre_pattern = ./core-%e-%s-%p-%t
         fs.suid_dumpable=2 
         第一条是配置是让生成的dump 文件加上进程号     第二条配置为在程序运行目录生成崩溃文件,其中:     %e 为程序名     %s 为程序崩溃时收到的信号数,对于信号不熟悉的同学可以看这里     %p 为程序运行时进程号     %t 为程序崩溃时时间(不过是秒数,如果想看具体时间,可以写个小程序,读出来)     我自己其实只用到了%e,这个选项,其它选项可以通过其它命令看到。     第三条是设置文件如果设置了+u权限, 也可以生成dump 文件。     在看下面提到的资料,最后一条是要在文件:/etc/sysconfig/init 里追加一条命令,但在Redhat系列操作系统不用加,因为其它系统里在设置ulimit -c 的时候用到了这个环境变量,如果你是其它系统,按照上面的教程不能生成dump文件,你可以考虑设置下这个变量。
         echo “DAEMON_COREFILE_LIMIT=‘unlimited’” >> /etc/sysconfig/init


    为了让上面的配置生效,最后需要重新加载配置文件:

    sysctl -p

    建议:
    1、dump 文件大小不要设置限制,虽然生成dump文件会很大,但压缩比是非常高的,压缩后可以很容易copy到本地。
    2、如果想重启后不重新设置core dump 开关,需要将命令写在系统配置里。


    参考资料:
    http://www.cyberciti.biz/tips/linux-core-dumps.html
  • 相关阅读:
    h5混合开发好用的下拉刷新插件
    设置窗体可以使用鼠标拖动大小 通过
    C# 使用System.Data.OleDb;避免oracle中文乱码问题
    C# 开启一个新进程并为新进程设置工作目录
    WPF窗体程序入口 自定义窗体启动页面
    WorkFlow WF如何为一个集合赋值
    第三方框架的使用
    AppIcon应用图标 and Launchimage启动图标的制作
    在didSelectRowAtIndexPath 里面取cell的方法
    iOS 开发技术体系
  • 原文地址:https://www.cnblogs.com/fengju/p/6174310.html
Copyright © 2020-2023  润新知