java core dump_Java core dump

生成Java core dump

可以按照下面这个文章的指引来通过jni调用触发Java core dump

基本思路是通过Java调用本地C代码,然后在C代码中触发一个错误,从而引发jvm

crash。

需要注意两个问题

gcc编译的时候需要注意库的名称,例子里面是libnativelib.so,需要改为libnativelib.jnilib

$ gcc -fPIC -o libnativelib.jnilib -shared \

-I$JAVA_HOME/include/linux/ \

-I$JAVA_HOME/include/ \

CoreDumper.c

例子中的命令是基于linux的,如果在mac下jni_md.h头文件的位置和linux稍有不同,在用gcc编译的时候要注意下,需要把jni_md.h文件复制到对应的目录

sudo cp $JAVA_HOME/Contents/Home/include/darwin/jni_md.h $JAVA_HOME/Contents/Home/include

java.lang.UnsatisfiedLinkError: no XXX in java.library.path

在执行java mainClass的时候可能会报这个错误,因为java执行mainClass的时候mainClass需要带有package名称,要看下生成的libnativelib.jnilib在那一个目录,使用-Djava.library.path指向libnativelib.jnilib的路径

经过上面一顿操作之后,就可以看到执行java目录下面有一个hs_err_pidxxx.log文件,在对应的目录下还有core dump文件,mac下的core dump目录是

/cores

不过有可能并没有生成core dump,只有hs_err_pidxxx.log文件,我们看下hs_err_pidxxx.log文件,其中有一行

# 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的文件。

因为mac下会限制进程对资源的限制,-c表示core文件的最大值,单位为区块,ulimit -c unlimited设置为无限制。注意在当前shell中执行只会对当前shell生效。

core dump分析

hs_err_pidxxx.log是一个文本日志文件,可以直接查看。core dump文件可以通过gdb、jmap、jstack来分析,具体可以参考Analysing a Java Core Dump

参考

gcc编译找不到jni_md.h:Mac下Java JNI 调C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值