崩溃信息收集是应用中很重要的组成部分,可以在app崩溃后分析崩溃原因以解决问题。崩溃信息收集目前可以使用友盟,bugly等第三方sdk,简单方便,当应用崩溃后,崩溃信息会自动发送至相应的服务器,开发者可以登录自己在该sdk官网的帐号查看崩溃信息。这些第三方库很好用,使用方法官网写的也很清楚,所以不再赘述。
友盟官网:http://bbs.umeng.com/portal.php
bugly官网:http://bugly.qq.com/
不使用第三方库崩溃信息收集:
首先,可预测的异常可以用如下方式实现:
@try {
// 可能产生异常的代码
//.......
}
@catch (NSException *exception) {
// 异常后采取的补救措施
//......
}
@finally {
// 无论是否产生异常都会执行的代码,一般清理现场
//......
}
进程中无法预估的异常,可以用如下方式来设置。
1.在应用启动完成方法中设置异常调用方法
2. 方法中获取堆栈信息发送出去,或者保存进日志文件。此方法中直接发送有可能会失败,因为app可能已经崩溃退出了,来不及发送。
//步骤1,在方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中增加如下代码
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
//步骤2
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"]];
NSLog(@"%@", content);
/**
* 把异常崩溃信息发送至开发者邮件
*/
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]];
}
崩溃分析:
工程编译时需要配置产生dsym符号文件,在得到崩溃的堆栈地址(本应用的方法的崩溃地址)后,使用命令
$dwarfdump --arch armv7 Your.app.dSYM --lookup 0x52846 | grep 'Line table'
可以从符号表中检索出崩溃地址对应的源文件和行号,然后根据该行号可以定位具体的代码。
命令中的armv7是CPU指令集中的一个指令, 之后的参数为dsym文件的路径, 0x52846为崩溃的堆栈地址,grep指令是过滤参数
运行结果如下:
1 2 | |
此部分参考网址:http://foggry.com/blog/2015/07/27/ru-he-shou-dong-jie-xi-crashlog/
这个功能最好使用第三方的sdk,因为使用简单,功能强大。这些sdk除了崩溃信息收集之外还提供了用户分析,用户设备信息采集等一系列功能。对于产品的使用追踪非常有用。