常见crash分析——crash日志的保存

383 阅读2分钟

程序一般都有BUG,Crash是一种比较严重的BUG。一款优秀的应用程序,要保证没有易现的Crash,并且要保证开发者对Crash的可控性,即可以方便的记录、分析、处理。

上文我们对数组越界进行了补救处理,但是数组越界的问题并没有得到解决,只是做到了不会让程序崩溃但根本问题并没有得到解决,这时候我们就需要一个反馈,能够精确的捕获到crash发生的原因,进而及时的解决问题。

在这里推荐一本必看的书《iOS 性能优化实战》本文内容取自该书第1章 1.5 日志与埋点

image.png

在启动应用程序时,可以向系统中注册异常捕获函数 NSSetUncaughtExceptionHandler(&CHExceptionHandlers); CHExceptionHandlers是我们自定义的函数 可以实现自己定义的方法,比如crash的堆栈信息保存本地、上传到服务器或者进行其他的操作。

void CHExceptionHandlers(NSException *exception) {
    NSLog(@"%s", __func__);
    //exception 属性
    ////异常类型名称
    //@property (readonly, copy) NSExceptionName name;
    ////异常原因
    //@property (nullable, readonly, copy) NSString *reason;
    ////额外用户信息
    //@property (nullable, readonly, copy) NSDictionary *userInfo;
    ////数据调用栈地址列表
    //@property (readonly, copy) NSArray<NSNumber *> *callStackReturnAddresses;
    ////数据调用栈符号列表
    //@property (readonly, copy) NSArray<NSString *> *callStackSymbols;
    //crash堆栈信息
    NSString *str = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingString:@"/log.log"];
    [exception.callStackSymbols writeToFile:str atomically:NO];
    NSLog(@"%@",str);
}

这里就是做了一个对日志的本地保存的处理 添加了异常捕获函数后,发生crash就会在打印日志中看到crash日志保存路径

image.png 通过访达进入到该路径即可获取到crash日志

image.png

image.png 拿到了crash日志,我们就可以进行一个上传到服务器的这么一个操作,从而有效的处理BUG,完善我们的代码。