为什么程序异常退出没有core文件?

LINUX程序发生异常的时候,操作系统一般会把当前进程所占用的内存,完整的dump到文件中,生成对应core文件,一般生成在对应的工作目录下。
但是有些时间进程异常退出后,后发现当前工作路径下没有对应的core文件生成,这个原因可能有以下几种:

1、CORE文件大小未修改

LINUX平台,默认core文件大小是0,也就是说默认不记录core文件,进程异常退出都不dump内存。
这个通过“ulimit –an”查看,如果大小是0,就通过“ulimit -c unlimited”命令修改为无限制,无限制的意思就是进程内存有多大就产生多大的core文件,这样可以保证core的完整性,方便事后的分析。如下所示:
ulimit -an

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited

为什么程序异常退出没有core文件?_第1张图片

这个命令是会话范围内有效,也就是会所更换一个会话,那么core文件大小就需要重新设置,所以对应的命令最好放在环境变量(.bash_profile)中。

2、CORE文件存放位置被转移

Linux系统默认的情况下,core文件生成的位置在工作目录下,但是操作系统是可以配置core文件的生成目录,
查看/proc/sys/kernel/core_pattern文件里面的内容默认是core,也就是core文件的生成路径和工作路径一致,如果内容为其他值,那么对应的core文件就会生成到对应的目录下。
/proc/sys/kernel/core_pattern表示的是core文件名的格式,默认值“core”的意思就是程序异常退出的时候在当前工作路径下生成文件名“core.进程号”文件。
如果这个值不是默认值,就说明系统参数被改过,就需要打开/etc/sysctl.conf配置文件,找到kernel.core_pattern项,把它注释掉,
然后“sysctl -p”让参数生效,这样就可以还原到原来的模式。
或者尝试把core_pattern文件内容直接改成core,
使用命令: sudo bash -c "echo core > /proc/sys/kernel/core_pattern " 
来进行写入,来指定程序所在目录为core文件生成目录。

3、ORACLE11G导致无法生成core文件

ORACLE11G客户端开发包,有自己的信号处理机制,会捕获对应的core信号,导致操作系统无法获得异常信号,因此退出之后就不会产生core文件。
如果平台底层对应的数据库驱动库是ORACLE11G的开发包,默认情况下,程序异常退出也不会产生core文件,那么就需要更改ORACLE11G客户端配置信息,才能达到产生core文件的目的,修改方法如下:
在$ORACLE_HOME/network/admin目录下的sqlnet.ora文件中添加
DIAG_ADR_ENABLED=OFF
DIAG_SIGHANDLER_ENABLED=FALSE
DIAG_DDE_ENABLED=FALSE
(如果不存在sqlnet.ora,可以从$ORACLE_HOME/network/admin/samples目录下拷贝一个)

4、某些异常退出不会产生core

还有些异常退出的场景下也不会产生core文件,譬如符号找不到。这种异常发生的时候,当时界面一般都会打印对应的退出原因的错误信息,如下所示:
 symbol lookup error: /home/xuxp/linux.i386/lib/libfsc_router.so: undefined symbol: _Z10TestNoCorev

这种异常退出的场景,只要可以重现,就保留程序启动的会话界面,这样就可以看到对应的异常错误信息,这种只打印不产生core文件的异常比较少。


5、操作系统参数设置导致不生成【RedHat6、7】


查看操作系统日志/var/log/messages文件,有如下几种场景记录:

为什么程序异常退出没有core文件?_第2张图片

为什么程序异常退出没有core文件?_第3张图片

为什么程序异常退出没有core文件?_第4张图片

解决方案:
修改 /etc/abrt/abrt-action-save-package-data.conf 文件,添加或者修改以下参数值:
OpenGPGCheck=no
ProcessUnpackaged=yes
重启 abrtd 服务:
# service abrtd restart
如果使用的是Redhat7,使用以下命令重启 abrtd 服务:
# systemctl restart abrtd.service

6、使用linux自带的crontab定时任务运行启动脚本

部分实际生产中,客户会使用linux的crontab来定时启停节点,这里可能存在环境变量未正确设置的问题。
可以通过在启动脚本中使用 ulimit -a 结合重定向来确认是否生效了。如果没有生效,解决也很简单,直接添加设置 ulimit -c unlimited 即可。但是要注意,有些系统层面会控制生成的core文件大小, unlimited 设置会报错。

7、core文件无法生成核查思路

    0、进程的RLIMIT_CORE或RLIMIT_SIZE被设置为0。使用getrlimit和ulimit检查修改。
         使用ulimit -a 命令检查是否开启core文件生成限制。如果发现-c后面的结果是0,就临时添加环境变量ulimit -c unlimited之后在启动程序观察是否有core生成,
         如果有,就将该命令添加到环境变量配置文件中。否则就要继续检查其他配置。

    1、 /proc/sys/kernel/core_pattern文件为空,且/proc/sys/kernel/core_uses_pid值为0。
        注意,若上述第一个文件为空且第二个文件值为1,core dump文件名将是.pid,需使用ls -a列出。
    2、若/proc/sys/kernel/core_pattern文件内容以"|"开始,"|"后面的内容将作为命令行,而core dump文件内容将作为该命令行的参数,此时也不会产生core dump文件。
    3、进程无写权限(如目录不可写、存在同名的非regular文件(目录或符号链接)等)
    比如进程启动用户为user1,实际程序所在目录bin所属是root,就有可能导致user1没有权限在bin目录下创建core文件。
    4、指定目录不存在
    5、文件系统空间不足
    6、进程所执行的二进制文件无读权限
    7、进程所执行的程序设置了set-user-ID (set-group-ID),且进程所有者与执行者不同。
    8、存在同名文件且有多个hard link

8、虚拟机不产生core文件


部分虚拟机环境下运行的节点不会生成core文件(查看message日志也没有对应的日志信息),而是将core文件生成在宿主机上(可以在宿主机的messages文件中发现core文件生成信息和路径).

9、abrt服务的Processunpackaged配置导致无法生成dump


 g18045pub1ice2 abrt-hook-ccpp:Process 62864  of user 1003 killed by SIGABRT- dumping core 56031
 g18045publice2 abrt-server:Executable'/data/trade/uc3/cres/workspace/bin/hsserver' doesn't belong to any package and Processunpackaged is set to "no'
abrtd 是一个守护进程监控的应用程序崩溃.当发生崩溃时,它将收集的崩溃(核心文件的命令行, etc .)application ,并采取措施
解决方法:
编辑 /etc/abrt/abrt-action-save-package-data.conf 文件,将 ProcessUnpackaged 设置为 yes,如下
ProcessUnpackaged = yes
执行命令 service abrt restart

你可能感兴趣的:(java,前端,网络)