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

2023-05-16

问题背景

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)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐