最新消息:20210917 已从crifan.com换到crifan.org

[整理]如何自己写代码捕获崩溃日志并保存

iphone crifan 2384浏览 0评论

参考:

ios崩溃日志收集_源码下载_Dev资源_DevStore

iOS App在发布以后获取在用户手机上的崩溃日志 – 阿P的博客

iOS 中捕获程序崩溃日志 – 简书

[总结]

想要自己通过代码获得崩溃日志的整体思路就是:

在didFinishLaunchingWithOptions注册一个异常处理的函数

在自己的异常处理函数中,收集和崩溃相关的(尽可能多的)信息

把信息保存到本地,以便于下次发送给自己的服务器,或者(此时不能直接调用,因为程序崩溃后,往往没有足够时间做类似于调用邮件程序发邮件的事情,所以可以保存起来,下次启动时做这类事情)调用邮件程序,发送给作为程序开发者的自己(这需要用户运行你的app调用邮件的权限)

比如:

void uncaughtExceptionHandler(NSException *exception){
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSLog(@"infoDictionary==%@",infoDictionary.description);
    // app名称
    NSString *app_Name = [infoDictionary objectForKey:@"CFBundleName"];
    NSLog(@"app_Name==%@",app_Name);
    // app版本
    NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSLog(@"app_Version==%@",app_Version);
    // app build版本
    NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
    NSLog(@"app_build==%@",app_build);
    //异常堆栈信息
    NSArray *stackArray = [exception callStackSymbols];
    // 出现异常的原因
    NSString *reason = [exception reason];
    // 异常名称
    NSString *name = [exception name];
    //userInfor
    NSDictionary *userInfor = [exception userInfo];
    NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason === %@\nException name === %@\nException stack ==== %@\nUserInfor === %@",name, reason, stackArray,userInfor.description];
    NSLog(@"%@", exceptionInfo);
    NSMutableArray *tmpArr = [NSMutableArray arrayWithArray:stackArray];
    [tmpArr insertObject:reason atIndex:0];
    //保存到本地  —  当然你可以在下次启动的时候,上传这个log
    [exceptionInfo writeToFile:[NSString stringWithFormat:@"%@/Documents/error.log",NSHomeDirectory()]

或者:

/**
 * 实现NSUncaughtExceptionHandler方法
 */
void uncaughtExceptionHandler(NSException *exception)
{
  // 调用堆栈
    NSArray *arr = [exception callStackSymbols];
    // 错误reason
    NSString *reason = [exception reason];
    // exception name
    NSString *name = [exception name];
    // 根据自己的需求将crash信息记录下来,下次启动的时候传给服务器。
    // 尽量不要在此处将crash信息上传,因为App将要退出,不保证能够将信息上传至服务器
}
// AppDelegate中的方法
– (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    // 加入crash handler
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    // 模拟错误信息
    NSArray *array = [NSArray arrayWithObject:@"0"];
    NSLog(@"%@", [array objectAtIndex:1]);
    return YES;
}

或:

void UncaughtExceptionHandler(NSException *exception) {
 NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
 NSString *reason = [exception reason];//非常重要,就是崩溃的原因
 NSString *name = [exception name];//异常类型
 NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
}

自己发邮件:

NSString *crashLogInfo = [NSString stringWithFormat:@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr];
NSString *urlStr = [NSString stringWithFormat:@"mailto://tianranwuwai@yeah.net?subject=bug报告&body=感谢您的配合!错误详情:%@",crashLogInfo];
NSURL *url = [NSURL URLWithString:[urlStr
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];

转载请注明:在路上 » [整理]如何自己写代码捕获崩溃日志并保存

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
93 queries in 0.201 seconds, using 23.35MB memory