目录html
能够按照下面这个文章的指引来经过jni调用触发Java core dumpjava
Generating a Java Core Dumplinux
基本思路是经过Java调用本地C代码,而后在C代码中触发一个错误,从而引起jvmshell
crash。jvm
须要注意两个问题.net
libnativelib.so
,须要改成libnativelib.jnilib
$ gcc -fPIC -o libnativelib.jnilib -shared \ -I$JAVA_HOME/include/linux/ \ -I$JAVA_HOME/include/ \ CoreDumper.c
sudo cp $JAVA_HOME/Contents/Home/include/darwin/jni_md.h $JAVA_HOME/Contents/Home/include
在执行java mainClass的时候可能会报这个错误,由于java执行mainClass的时候mainClass须要带有package名称,要看下生成的libnativelib.jnilib在那一个目录,使用-Djava.library.path指向libnativelib.jnilib的路径日志
通过上面一顿操做以后,就能够看到执行java目录下面有一个hs_err_pidxxx.log文件,在对应的目录下还有core dump文件,mac下的core dump目录是code
/cores
不过有可能并无生成core dump,只有hs_err_pidxxx.log文件,咱们看下hs_err_pidxxx.log文件,其中有一行htm
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
根据提示core dump失败了,能够经过设置ulimit -c unlimited
再从新试下,就能够在/cores目录下找到相似core.xxx的文件。blog
由于mac下会限制进程对资源的限制,-c表示core文件的最大值,单位为区块,ulimit -c unlimited
设置为无限制。注意在当前shell中执行只会对当前shell生效。
hs_err_pidxxx.log是一个文本日志文件,能够直接查看。core dump文件能够经过gdb、jmap、jstack来分析,具体能够参考Analysing a Java Core Dump
参考
JVM Crashes的常见缘由:Staying on Top of JVM Crashes
gcc编译找不到jni_md.h:Mac下Java JNI 调C