一,背景
当我们运行的WebLogic JVM发生Fatal Error时,会造成JVM crash掉,进而造成进程终止。一般来说crash的时间我们是无法估计在什么时候的,它具有很大的偶然性,因此理论上有时我们希望自动产生Core dump文件来提供我们事后分析的信息记录。默认我们的系统是没有enable这个功能的,因此我们可以尝试开启。
1.1 core dump说明
core文件简介
core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。
核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为程序错误,比如非法内存访问导致段错误, 事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
一个进程允许 产生多大的core文件取决于进程的Resource Limit(这个信息保在PCB中)。默认是不允许产生core文件的, 因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。
一个core文件里,包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理等信息,也就是把程序当时工作的状态存储成一个文件。不仅仅是在出错的时候会生成core dump文件,在系统卡住或者cpu使用率很高的时候也可以手动触发生成core dump文件。
1.2 手动模拟crash
Kill -11 <PID>
信号11(SIGSEGV)是当一个进程执行了一个无效的内存引用,或发生段错误时发送给它的信号。
二,开启JVM crash自动产生Java core dump
2.1 测试环境:
OS: Red Hat Enterprise Linux Server release 6.7 (Santiago)
WebLogic Server 版本: 12.2.1.2.0
2.2 开启JVM crash自动产生Java core dump
core dump文件生成开关其实是通过对生成的文件大小进行控制达到的,默认大小是0,也就是说默认是不生成core dump文件的,可以通过命令ulimit -c进行查看。将此参数修改成unlimited就可以生成core dump文件了,但值得注意的一点是,每个应用进程都会读取自己的一套系统参数,可以查看进程对应的内存文件/proc/<pid>/limits中的信息来判断修改后的参数值是否对此应用进程生效了,limits文件中的信息如下:
查看core文件生成功能是否打开,如下若是0,则表示没有打开。
$ ulimit -c
0
修改为可以生成core dump文件:
1)临时设置
示例1:如下设置4G,单位为kbyte。
如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文 件的时候,gdb会提示错误。
# ulimit -c 4194304
示例2:不限制大小。
$ ulimit -c unlimited
$ ulimit -c
unlimited
2)永久设置
# echo " * soft core unlimited" >> /etc/security/limits.conf
# echo " * hard core unlimited" >> /etc/security/limits.conf
然后重启服务器或重新登录即可生效。
查看具体应用进程的core dump参数设置:
$ ps -ef |grep Server1
weblogic 13463 13412 99 01:40 ? 00:00:34 /usr/java/jdk1.8.0_144/bin/java -server -Xms256m -Xmx512m -Dweblogic.Name=Server1 -Djava.security.policy=/home/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server/lib/weblogic.policy -Dweblogic.ProductionModeEnabled=true -Dweblogic.system.BootIdentityFile=/home/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/base_domain/servers/Server1/data/nodemanager/boot.properties -Dweblogic.nodemanager.ServiceEnabled=true -Dweblogic.nmservice.RotationEnabled=true -Djava.system.class.l