程序员自我修养之java、C++ crash上报机制

一、JavaCrash的监控

    1.JavaCrash的异常大致流程

异常线程的区别
设置uncaughtExceptionHandler异常处理器

    代码演示使用

        原理文字描述:JVM会调用Thread的dispatchUncaughtException的方法,把异常事件分发出去,线程里面有两个获取线程异常的方法:setUncaughtExceptionHandler(只处理当前线程的异常)和 setDefaultUncaughtExceptionHandler(处理所有线程的异常)两个方法,之所以线程崩溃是因为在Thread.UncaughtExceptionHandler重写它的uncaughtException的方法,调用了Process.killProcess方法和System.exit方法

二、C++ crash上报机制

1、demo目录预览

2、c++ crash的exception type异常类型的信息:

EXC_BAD_ACCESS:

        此类型是最常见的crash, 通常用于访问了不该访问的内存导致的,一般EXC_BAD_ACCESS后面的()还会带有补充信息,野指针错误形式在Xcode中通常表现为:Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误。因为你访问了一块已经不属于你的内存。

SIGSEGV:  通常由于重复释放对象导致, 一般在ARC以后很少见到

SIGABRT:  收到Abort信号退出, 通常Foundtion库中的容器为了保护状态正常会做一些检测, 例如插入nil到数据中等会遇到此类错误.

SEGV(Segmentation Violation):代表无效内存地址, 比如空指针, 未初始化指针, 栈溢出等.

SIGBUS: 总栈错误, 与SIGSEGV不同的是, SIGSEGV访问的是无效的地址, 而SIGBUS访问的是有效的地址, 但是总栈访问异常(如地址对齐问题)

SIGILL: 尝试执行非法的指令, 可能不被识别或者没有权限

SIGFPE:  数学计算相关问题, 比如除零操作

SIGIPIPE: 管道另一端没有进程接手数据

EXC_BAD_INSTRUCTION:此类异常通常由于线程执行非法指令导致

EXC_ARITHMETIC: 除零错误会抛出此类异常

3、signal报错查询表

signal 11 : 空指针异常

signal 6 : 资源初始化异常(配置文件、对象)

4、c++与java通道建立

5、C++ crash 初始化捕获信号类型

6、C++ crash核心调用位置

7、整体流程概述

开子线程去收集crash的堆栈,通过设置不同的监听信号类型,开辟存储crash的堆栈信息,通过监听crash.action事件,将错误信息放在crash_stack里面。

8、为什么上报信息堆栈后面可以会有准确代码的位置?

自行思考


-----------------------------------------------------------------------------------------------------------------------------

下面东西可以不做学习重点

  2.出现crash异常应该怎么处理

  3.把混淆的代码需要还原

       客户端使用的方法------->GUI工具

        服务端同学使用的方法 ------>retrace命令    

二、NativeCrash监控处理方式

现在采用的是:Google-breakpad做为主流

采用add2Line工具把.so文件+偏移地址可以准确判定代码出错的位置

native crash监听: 创建singalHandler方法,通过singal_stack去存储singal_action去拿到崩溃堆栈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容