🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Java崩溃监测 ~~~  Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler()); ~~~ ## Native崩溃监测 ![](https://img.kancloud.cn/3c/39/3c392a611a8a1048fb833f31d0506e9f_558x246.png) google的breakpad太大,有合规和性能和扩展问题,bugly也是,另外通过runtime process的execute打印logcat,启动新进程进行处理,进程也不稳定,因此实现高效轻量级的框架,基于信号处理函数和dump子线程: ![](https://img.kancloud.cn/03/e8/03e81dedaf1bd810a9993900abf90e85_640x226.png) ![](https://img.kancloud.cn/03/e8/03e81dedaf1bd810a9993900abf90e85_640x226.png) 主要思想都是捕捉cpu的异常中断,处理linux的sigaction信号量,主要都是通过设置回调: ①设置sigaction的信号处理函数sigaction\_handler ②启动dump子线程,等待被唤起 ③触发异常,信号处理函数sigaction\_handler触发的时候,利用libunwind去解堆栈并且缓存起来到stack上下文 ④通过互斥量的Lock和Unlock,唤起dump子线程,去dump堆栈到str,并且反调java堆栈补充信息,回调给java注册的监听,上层去打log、发后台日志、写文件等 概括:信号处理函数,注册信号量、libunwind解堆栈;子线程,dump merge 回调; 与其他方案的对比优化是,发现预加载的子线程,能够比直接回调和子进程回调,更好地回调到java层,很稳定;另外,这里还涉及了溢出栈开辟空间/互斥量保证线程安全/存量处理函数的恢复等考虑点 # 参考资料 [Android 平台 Native 代码的崩溃捕获机制及实现](https://mp.weixin.qq.com/s/g-WzYF3wWAljok1XjPoo7w)