在进行iOS Crash Report可读化之前,有几样东西是必须的:
1. 应用的app文件,比如Foo.app
2. 应用的dSYM文件,比如Foo.app.dSYM
3. 崩溃报告,比如xxx.crash
头两个文件是在后缀名为xcarchive的文件中找到,每个发布的应用都会生成xcarchive文件。
Crash Report的来源比较多,一个是Xcode,一个是iTunes Connect,还有在手机上也可以获得。
这三个文件必须要属于同一个版本的,否则就没有用了。
把这三个文件放到一个文件夹里,然后查看这个崩溃报告中的程序起始地址,比如说0x2a000. 这个起始地址怎么找呢?在Crash Report文件中找Binary Images部分,第一个地址就是起始地址。
cd到这个文件夹,接下去运行
xcrun atos -o Foo.app/Foo -arch armv7s -l 0x2a000 0x000e6f8b
这样就能获得地址0x000e6f8b的错误信息了。
这里的参数-arch参数由崩溃报告中的Hardware Model确定;
armv6设备:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch
armv7设备:iPhone 3GS, iPhone 4, iPhone 4S, iPad , iPad 2, the new iPad, iPod Touch 3G, iPod Touch 4
armv7s设备:iPhone 5之后的设备
所以现在这里多数是armv7s.
如果你想把错误文本输出到一个文件,那么就参考下面的命令:
xcrun atos -o Foo.app/Foo -arch armv7s -l 0x2a000 -f addr.txt
怎么样确定你的定位是正确的,这里有一个方法来确定main函数的定位,如果main函数对了,那么其他的应该也没有问题。
在crash report中的Thread 0部分的倒数第二行一般都是main函数,比如
13 KVOdemo 0x000320c6 0x2a000 + 32966
这时候的可读化应该是main函数,如果是其它的函数,那么就要注意了。看看是不是参数又问题,一个是起始地址(-l 参数),还有就是arch参数(-arch参数)。
在我们日常的开发过程中其实没有那么麻烦,一个如果测试的设备在身边,连上Xcode就可以直接查看device 的crash logs。
还有我们也可以在代码里面添加Exception Handler来处理这些个问题。
//在didFinishLaunchingWithOptions方法中声明,在debug模式的时候增加这个功能
#ifdef DEBUG
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
#endif//获取异常崩溃信息
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:developer@qq.com"];
[mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];
[mailUrl appendFormat:@"&body=%@", content];
NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}
当出现问题的时候让测试人员直接把错误文本发到你的邮箱就可以了。这样就节省了时间。不过这里的定位信息没有那么明确。但是基本上可以定位你的错误。