app崩溃抓取
来源:互联网 发布:深圳市斯基凯网络 编辑:程序博客网 时间:2024/05/22 01:47
Java层默认未处理异常的Handler,都是调用Thread.setDefaultUncaughtExceptionHandler,注册一个UncaughtExceptionHandler来实现的。可以抓到所有线程的未处理异常
final Thread.UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread thread, Throwable throwable) {// 编写崩溃前的处理逻辑// ...// 此回调既可以收到Exception, 也可以收到Error
/*调用默认处理,杀死进程*/oldHandler.uncaughtException(thread, throwable);}});
当然也可以注册针对指定线程的未处理异常的Handler,如:
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread thread, Throwable throwable) {// 编写崩溃前的处理逻辑// ...// 此回调既可以收到Exception, 也可以收到Errorif( /*这是一个致命错误*/ ) {//调用默认处理,杀死进程Thread.getDefaultUncaughtExceptionHandler().uncaughtException(thread, throwable);} else {// 什么也不处理的话, 当前线程被终止,但是整个进程可以继续运行}}});
二、native层异常
native异常是通过信号来通知的。所以要想抓到native异常,需要注册信号回调。
注册方法:
static struct sigaction g_oldCSSigAction[8] = {0};void CrashSaver_handleSignal(int sig, siginfo_t* info, void* context);// 注册信号函数void CrashSaver_install(){ // 保存信号的默认行为对象 memset(g_oldCSSigAction, 0, sizeof(g_oldCSSigAction)); sigaction(SIGTRAP, NULL, &g_oldCSSigAction[0]); sigaction(SIGABRT, NULL, &g_oldCSSigAction[1]); sigaction(SIGILL, NULL, &g_oldCSSigAction[2]); sigaction(SIGSEGV, NULL, &g_oldCSSigAction[3]); sigaction(SIGFPE, NULL, &g_oldCSSigAction[4]); sigaction(SIGBUS, NULL, &g_oldCSSigAction[5]); sigaction(SIGPIPE, NULL, &g_oldCSSigAction[6]); sigaction(SIGSYS, NULL, &g_oldCSSigAction[7]); // 创建 信号行为对象 struct sigaction newSigAction; sigemptyset(&newSigAction.sa_mask); newSigAction.sa_flags = SA_SIGINFO; /*设置信号处理函数*/ newSigAction.sa_sigaction = CrashSaver_handleSignal; // 注册信号新的行为对象 sigaction(SIGTRAP, &newSigAction, NULL); sigaction(SIGABRT, &newSigAction, NULL); sigaction(SIGILL, &newSigAction, NULL); sigaction(SIGSEGV, &newSigAction, NULL); sigaction(SIGFPE, &newSigAction, NULL); sigaction(SIGBUS, &newSigAction, NULL); sigaction(SIGPIPE, &newSigAction, NULL); sigaction(SIGSYS, &newSigAction, NULL);}
编写回调处理函数:
void CrashSaver_handleSignal(int sig, siginfo_t* info, void* context){// sig 触发的信号ID 如 SIGABRT、SIGSEGV等 // info 对此信号的描述信息 // context 信号发生的上下文。比如各种寄存器信息。此结构和具体的CPU平台有关 // 此处增加处理逻辑 CrashSaver_uninstall(); /*反注册*/ raise(signum); /*调用系统默认信号处理*/}
反注册函数:
void CrashSaver_uninstall(){ sigaction(SIGTRAP, &g_oldCSSigAction[0], NULL); sigaction(SIGABRT, &g_oldCSSigAction[1], NULL); sigaction(SIGILL , &g_oldCSSigAction[2], NULL); sigaction(SIGSEGV, &g_oldCSSigAction[3], NULL); sigaction(SIGFPE, &g_oldCSSigAction[4], NULL); sigaction(SIGBUS, &g_oldCSSigAction[5], NULL); sigaction(SIGPIPE, &g_oldCSSigAction[6], NULL); sigaction(SIGSYS, &g_oldCSSigAction[7], NULL); memset(g_oldCSSigAction, 0, sizeof(g_oldCSSigAction));}
0 0
- app崩溃抓取
- iOS app崩溃日志抓取
- iOS之APP异常崩溃抓取
- Windows Phone & Windows App应用程序崩溃crash信息抓取方法
- android app崩溃log抓取,打印在本地
- Day9 APP中抓取崩溃日志与邮件通知
- app崩溃
- Android抓取崩溃日志
- Android抓取崩溃日志
- Android 抓取崩溃日志
- iOS app崩溃收集
- 追踪app崩溃率
- 追踪app崩溃率
- APP测试崩溃
- app保存崩溃日志
- 查看ios app崩溃
- Fiddler抓取APP数据包
- APP启动时间抓取
- Linux中的find指令
- C/C++ 笔试、面试题目大汇总
- hibernate学习之八(set和list映射)
- Android中Activity的四种启动模式
- iOS多线程
- app崩溃抓取
- 递归算法的学习
- 博为峰JavaEE技术文章 ——MyBatis Hibernate 工作原理
- 前端框架React
- ETL工具
- 全面整理的C++面试题
- SpringMVC异步化请求初探(续-請求背压)
- 图书管理系统(C语言)
- idea 下部署web项目遇到问题总结