java调用C++库崩溃排查

本文介绍了当Java通过JNI方式调用C++库导致崩溃时的排查方法。首先,生成core文件或使用gdb附加到进程以确定崩溃原因,但gdb可能无法显示完整的堆栈信息。对于C++库崩溃,可以查看堆栈,而Java崩溃则看不到调用栈,因为Java的符号表不包含在内。为了解决这个问题,可以使用jstack进行调试,查看阻塞进程的堆栈,掌握其用法,如添加选项"-l"以获取更详细的堆栈信息。
摘要由CSDN通过智能技术生成

java调用C++库崩溃排查

问题:java通过JNI方式调用C++库文件,运行时崩溃

1.首先生成core文件/或者gdb attach到进程上

//不限制core文件大小
ulimit -c unlimited
//core文件带pid和进程名 core在当前目录
echo "core_%e_%p" > /proc/sys/kernel/core_pattern

2.gdb查看core文件崩溃位置,可以看到是什么原因导致的崩溃,但是看不见堆栈

具体使用:gdb -c core-java-2853 -e java
结果:
Program received signal SIGSEGV, Segmentation fault.
(gdb) bt
#0  0x00007f19191429cf in ?? ()
#1  0x00000007c5922548 in ?? ()
#2  0x00000000000000b2 in ?? ()
#3  0x0000000000000000 in ?? ()
2.1 若是C++库的崩溃,怎可以看见崩溃的堆栈,要是java的崩溃怎看不见调用栈。

java崩溃看不见堆栈的原因:gdb调试的是java,Java里面是不会包括你写的程序的符号表了(因为符号表存储在自己写的Java程序中)。因为在java中没有读取到符号表,函数名、变量名这些都是存储在符号表中的,没有了符号表函数名自然无法解析了。那为什么不直接用GDB调试自己写的java程序呢?因为java程序只能在jvm上跑&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值