博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 崩溃异常捕获
阅读量:6433 次
发布时间:2019-06-23

本文共 4371 字,大约阅读时间需要 14 分钟。

iOS已经提供了捕获异常的机制

NSSetUncaughtExceptionHandler

我们就创建一个捕获crash的类,其中写好分析崩溃原因的方法

头文件

#import 
@interface UncaughtExceptionHandler : NSObject{}@endvoid HandleException(NSException *exception);void SignalHandler(int signal);//在didFinishLaunchingWithOptions中添加这个方法//添加一行 /* InstallUncaughtExceptionHandler();*/void InstallUncaughtExceptionHandler(void);复制代码

.m文件

定义

#include 
#include
NSString * const UncaughtExceptionHandlerSignalExceptionName = @"UncaughtExceptionHandlerSignalExceptionName";NSString * const UncaughtExceptionHandlerSignalKey = @"UncaughtExceptionHandlerSignalKey";NSString * const UncaughtExceptionHandlerAddressesKey = @"UncaughtExceptionHandlerAddressesKey";volatile int32_t UncaughtExceptionCount = 0;const int32_t UncaughtExceptionMaximum = 10;const NSInteger UncaughtExceptionHandlerSkipAddressCount = 4;const NSInteger UncaughtExceptionHandlerReportAddressCount = 5;复制代码

实现方法

@implementation UncaughtExceptionHandler+ (NSArray *)backtrace{  void* callstack[128];  int frames = backtrace(callstack, 128);  char **strs = backtrace_symbols(callstack, frames);    int i;  NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];  for (   i = UncaughtExceptionHandlerSkipAddressCount;   i < UncaughtExceptionHandlerSkipAddressCount +   UncaughtExceptionHandlerReportAddressCount;  i++)  {   [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];  }  free(strs);    return backtrace;}- (void)handleException:(NSException *)exception{ //可以在这个方法中打印或者弹出alert显示出来错误信息/*弹窗的message可以是  [NSString stringWithFormat:NSLocalizedString(                   @"你可以执行一些崩溃后需要做的事情.\n"                  @"%@\n%@", nil),                  [exception reason],    //崩溃内容                 [[exception userInfo] objectForKey:UncaughtExceptionHandlerAddressesKey]]*/ CFRunLoopRef runLoop = CFRunLoopGetCurrent(); CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop); while (!dismissed) {  for (NSString *mode in (NSArray *)allModes)  {   CFRunLoopRunInMode((CFStringRef)mode, 0.001, false);  } } CFRelease(allModes); NSSetUncaughtExceptionHandler(NULL); signal(SIGABRT, SIG_DFL); signal(SIGILL, SIG_DFL); signal(SIGSEGV, SIG_DFL); signal(SIGFPE, SIG_DFL); signal(SIGBUS, SIG_DFL); signal(SIGPIPE, SIG_DFL);     {        kill(getpid(),[[[[exception userInfo] allValues] lastObject] intValue]);    }}@end复制代码
void HandleException(NSException *exception){ int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount); if (exceptionCount > UncaughtExceptionMaximum) {  return; }  NSArray *callStack = [exception callStackSymbols];//堆栈调用信息    //[UncaughtExceptionHandler backtrace]; NSMutableDictionary *userInfo =  [NSMutableDictionary dictionaryWithDictionary:[exception userInfo]]; [userInfo  setObject:callStack  forKey:UncaughtExceptionHandlerAddressesKey];  [[[[UncaughtExceptionHandler alloc] init] autorelease]  performSelectorOnMainThread:@selector(handleException:)  withObject:   [NSException    exceptionWithName:[exception name]    reason:[exception reason]    userInfo:userInfo]  waitUntilDone:YES];}void SignalHandler(int signal){      NSLog(@"handleException 4"); int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount); if (exceptionCount > UncaughtExceptionMaximum) {  return; }  NSMutableDictionary *userInfo =  [NSMutableDictionary   dictionaryWithObject:[NSNumber numberWithInt:signal]   forKey:UncaughtExceptionHandlerSignalKey]; NSArray *callStack = [UncaughtExceptionHandler backtrace]; [userInfo  setObject:callStack  forKey:UncaughtExceptionHandlerAddressesKey];  [[[[UncaughtExceptionHandler alloc] init] autorelease]  performSelectorOnMainThread:@selector(handleException:)  withObject:   [NSException    exceptionWithName:UncaughtExceptionHandlerSignalExceptionName    reason:     [NSString stringWithFormat:      NSLocalizedString(@"Signal %d was raised.", nil),      signal]    userInfo:     [NSDictionary      dictionaryWithObject:[NSNumber numberWithInt:signal]      forKey:UncaughtExceptionHandlerSignalKey]]  waitUntilDone:YES];}void InstallUncaughtExceptionHandler(void){ NSSetUncaughtExceptionHandler(&HandleException); signal(SIGABRT, SignalHandler); signal(SIGILL, SignalHandler); signal(SIGSEGV, SignalHandler); signal(SIGFPE, SignalHandler); signal(SIGBUS, SignalHandler); signal(SIGPIPE, SignalHandler);}复制代码

转载于:https://juejin.im/post/5a93c9385188257a7b5aba42

你可能感兴趣的文章
负载均衡SLB的基本使用
查看>>
Centos 7 x86 安装JDK
查看>>
微信小程序的组件用法与传统HTML5标签的区别
查看>>
Hangfire 使用笔记
查看>>
(C#)Windows Shell 外壳编程系列8 - 同后缀名不同图标?
查看>>
【实操】配置负载均衡
查看>>
教你彻底学会c语言基础——文件操作
查看>>
对Java基本数据类型的再思考
查看>>
滑动返回-方式1
查看>>
如何使用免费控件将Word表格中的数据导入到Excel中
查看>>
seafile服务器配置
查看>>
印度OTA产业获资本青睐,HappyEasyGo完成数千万美金A+轮融资
查看>>
HyperLedger Fabric 1.2 区块链应用场景(3.1)
查看>>
【Java入门提高篇】Day13 Java中的反射机制
查看>>
也谈谈初创公司的技术团队建设
查看>>
关于 Django 开发的 11 件事
查看>>
Android屏蔽隐藏系统自带输入键盘
查看>>
阿里云 APM 解决方案地图
查看>>
中国HBase技术社区第一届MeetUp-HBase2.0研讨圆桌会
查看>>
阿里云服务器亚太南部 1、亚太南部 2、亚太东北 1、 亚太东北 2是哪个城市
查看>>