解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

问题背景

java通过jni去集成c++sdk时线上发现会有偶现崩溃,为了方便定位native(c++)的崩溃,sdk采用了google breakpad崩溃转储方案(Google跨平台的崩溃转储和分析框架和工具集合,breakpad支持windows、linux、macos、android、ios等。目前已有Google Chrome, Firefox, Google Picasa, Camino, Google Earth等项目使用。),更新sdk后,发现java启动后必现崩溃。

根因分析

最终定位出原因如下:

  1. jvm注册了信号处理函数,针对比如StackoverflowError 和NPE(NullPointerException)都会收到SIGSEGV,然后针对这两种异常虚拟机不选择退出,而是自己内部作了额外的处理,其实是恢复了线程的执行,仅仅向应用层抛出异常(因为这两种错误在jvm里太常见了),jvm不会崩溃;
  2. sdk breakpad捕获到了该信号,写完minidump完后直接退出进程;

解决方法

只要sdk捕获到信号后写完minidump后不直接结束进程即可,继续抛出异常,让jvm去捕获处理,该方案有一个缺点就是可能运行过程中会生成大量minidump文件,最后排查问题时用最后一个minidump即可。
在这里插入图片描述
实际操作:MinidumpCallback回调返回false代替返回succeeded。

参考:线程崩溃为什么不会导致 JVM 崩溃(https://www.cnblogs.com/xiekun/p/16378063.html)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值