iOS Crash闪退信息捕获工具类
来源:互联网 发布:php怎么链接数据库 编辑:程序博客网 时间:2024/04/28 02:07
IOS SDK中提供了一个现成的函数 NSSetUncaughtExceptionHandler 用来做异常处理,但功能非常有限,而引起崩溃的大多数原因如:内存访问错误,重复释放等错误捕获不到,因为这些异常抛出的是Signal,所以必须要专门做Signal处理。工具类的实现源码如下:
头文件
#import <Foundation/Foundation.h>extern NSString *const UncaughtExceptionHandlerSignalKey;extern NSString *const SingalExceptionHandlerAddressesKey;extern NSString *const ExceptionHandlerAddressesKey;@interface ExceptionHandler : NSObject+ (void)installExceptionHandler;+ (NSArray *)backtrace;@end
实现文件
#import "ExceptionHandler.h"#include <libkern/OSAtomic.h>#include <execinfo.h>NSString *const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey";NSString *const SingalExceptionHandlerAddressesKey = @"SingalExceptionHandlerAddressesKey";NSString *const ExceptionHandlerAddressesKey = @"ExceptionHandlerAddressesKey";const int32_t _uncaughtExceptionMaximum = 20;// 系统信号截获处理方法void signalHandler(int signal);// 异常截获处理方法void exceptionHandler(NSException *exception);void signalHandler(int signal){ volatile int32_t _uncaughtExceptionCount = 0; int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount); // 如果太多不用处理 if (exceptionCount > _uncaughtExceptionMaximum) { return; } // 获取信息 NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:UncaughtExceptionHandlerSignalKey]; NSArray *callStack = [ExceptionHandler backtrace]; [userInfo setObject:callStack forKey:SingalExceptionHandlerAddressesKey]; // 现在就可以保存信息到本地[] }void exceptionHandler(NSException *exception){ volatile int32_t _uncaughtExceptionCount = 0; int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount); // 如果太多不用处理 if (exceptionCount > _uncaughtExceptionMaximum) { return; } NSArray *callStack = [ExceptionHandler backtrace]; NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]]; [userInfo setObject:callStack forKey:ExceptionHandlerAddressesKey]; NSLog(@"Exception Invoked: %@", userInfo); // 现在就可以保存信息到本地[] }@implementation ExceptionHandler//获取调用堆栈+ (NSArray *)backtrace{ void* callstack[128]; int frames = backtrace(callstack, 128); char **strs = backtrace_symbols(callstack,frames); NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames]; for (int i=0;i<frames;i++) { [backtrace addObject:[NSString stringWithUTF8String:strs[i]]]; } free(strs); return backtrace;}// 注册崩溃拦截+ (void)installExceptionHandler{ NSSetUncaughtExceptionHandler(&exceptionHandler); signal(SIGHUP, signalHandler); signal(SIGINT, signalHandler); signal(SIGQUIT, signalHandler); signal(SIGABRT, signalHandler); signal(SIGILL, signalHandler); signal(SIGSEGV, signalHandler); signal(SIGFPE, signalHandler); signal(SIGBUS, signalHandler); signal(SIGPIPE, signalHandler);}@end
0 0
- iOS Crash闪退信息捕获工具类
- iOS Crash闪退信息捕获工具类
- iOS Crash闪退日志的捕获和上传至服务器
- 捕获程序Crash,让你的APP告别闪退
- IOS Crash捕获
- IOS程序crash捕获
- IOS Crash捕获
- ios Crash闪退日志获取和上传至服务器
- iOS Crash闪退日志获取和上传至服务器
- ios Crash闪退日志获取和上传至服务器
- ios Crash闪退日志获取和上传至服务器
- iOS 10 因苹果健康导致闪退 crash
- iOS 10 因苹果健康导致闪退 crash
- iOS Swift Crash的捕获
- iOS Swift Crash的捕获
- iOS 崩溃信息拦截防止闪退
- iOS crash 信息符号
- Android如何捕获应用的crash信息
- Akka相关概念理解
- 黑马程序员java学习日志《基础篇之一》
- QQ聊天界面细节注意点
- 枚举类型
- Tomcat - 性能调整完整教程
- iOS Crash闪退信息捕获工具类
- 各个语言下json解析的openapi
- 实战:mysql 巡检脚本V1
- 组合博弈
- 提高编程技能最有效的方法(转载)
- 正则表达式
- Tomcat6.x - 性能参数调整
- VBS基础篇 - 运算符(4) - 比较运算符
- Giveaway of the Day--一个良知网站