异常捕获

异常捕获 有两种

  • IOS系统的异常
    • NSSetUncaughtExceptionHandler(&exceptionHandler);// exceptionHandler是捕获的回调函数
  • C或者C++ 里面的异常 // signalHandler 也是回调函数
    • 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);
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:SignalExceptionKey];
    NSArray *stackArray = [JHCatchCrash backtrace];
    userInfo[StackAddressesExceptionKey] = stackArray;
    NSLog(@"signalHandler: %@", userInfo);
    // 现在就可以保存信息到本地[]
   
}

void exceptionHandler(NSException *exception) {
    
    volatile int32_t _uncaughtExceptionCount = 0;
    int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);
    
    // 如果太多不用处理
    if (exceptionCount > _uncaughtExceptionMaximum) {
        return;
    }
    // 异常的堆栈信息
    NSArray *stackArray = [exception callStackSymbols];
    /* 异常理由和名字**/
    NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@;Exception name:%@",[exception reason], [exception name]];
    NSMutableDictionary *userInfo =[NSMutableDictionary dictionary];
    userInfo[UncaughtExceptionKey] = exceptionInfo;
    userInfo[StackAddressesExceptionKey] = stackArray;
    NSLog(@"exceptionHandler: %@", userInfo);
    // 现在就可以保存信息到本地[]

}


//获取调用堆栈
+ (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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Cras...
    MTDeveloper阅读 1,168评论 1 2
  • 要接入上海分部的自己的性能统计和事件统计的 sdk,在接入之前自己了解下。看到了一套捕获异常的代码。 对于异常分为...
    南京小伙阅读 872评论 2 1
  • 最近项目上需要对崩溃信息进行处理,要满足崩溃后及时捕捉到崩溃信息,当应用下次打开后再将报文上传至服务器...
    迷失之刃阅读 4,708评论 9 8
  • 每个软件都可能遇到异常,所以从设计阶段就要考虑异常处理的问题,纳为业务流程的一部分。 异常是需要妥善处理的,但是处...
    蓝灰_q阅读 3,246评论 0 4
  • 把你一人扔在酒店一个晚上和一个晚上,我不知道你是怎么度过的。 当我匆匆忙忙赶来,却带着不舒服的肚子。 常常,我在你...
    减肥的女孩阅读 200评论 0 1