之前一直想要获取到用户的日志分析以及对于测试人员测试出来的偶现性BUG进行收集和分析。所以针对多方面去考虑了几种方式
1.在测试环境下
在代码层面我们可以使用@try、catch捕获异常:
以下是最简单的写法
@
try
{
// 可能会出现崩溃的代码
}
@
catch
(NSException *exception) {
// 捕获到的异常exception
}
@finally {
// 结果处理
}
AppDelegate.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
return
YES;
}
void UncaughtExceptionHandler(NSException *exception) {
/**
* 获取异常崩溃信息
*/
NSArray *callStack = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSString *content = [NSString stringWithFormat:@
"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@"
,name,reason,[callStack componentsJoinedByString:@
"\n"
]];
/**
* 把异常崩溃信息发送至开发者邮件
*/
NSMutableString *mailUrl = [NSMutableString string];
[mailUrl appendString:@
"mailto:test@qq.com"
];
[mailUrl appendString:@
"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"
];
[mailUrl appendFormat:@
"&body=%@"
, content];
// 打开地址
NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}
|
接着在按照下图的步骤查看具体的信息
在点击View Device Logs后可以看到你的设备中所有的崩溃信息,可以根据时间进行排序,我们找到刚才的崩溃信息,出现了以下界面:
崩溃信息大致大致可以分为以上几个部分,下面来详细介绍:
第一部分是闪退进程的相关信息:
Incident Identifier : 是崩溃报告的唯一标识符。
CrashReporter Key: 是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。
Hardware Model :标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。
Process:对项目的操作权限,上面的是可读可写
Path:崩溃文件的路径
Identifier:项目标识符,就是Bundle Id
Version:版本号
.....等等.......
第二部分
给出了一些基本信息,包括闪退发生的日期Date/Time和时间Launch Time,设备的iOS版本OS Version等。
第三部分
Exception Type:异常的类型。
Exception Codes :异常错误码
Termination Reason:闪退的原因,比如常见的数组越界啊,什么的。
Triggered by Thread:出现问题在哪个线程,这个比较重要,首先确定在哪个线程中出了问题,然后再去定位。
第四部分
这部分提供应用中所有线程的回溯日志。 线程调用的一些,堆栈信息,压根看不懂,所有需要进行符号化处理。
当然以上说的除了第三方的之外大部分都只是在我们内部测试的时候使用。毕竟我们不能拿到用户的手机以及让用户给我们发邮件