参考文章:

iOS 中捕获程序崩溃日志

iOS 崩溃crash大解析

崩溃信息收集

自己添加代码收集

  • 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动作
1
2
3
NSSetUncaughtExceptionHandler (&uncaughtExceptionHandler);

官方文档介绍:Sets the top-level error-handling function where you can perform last-minute logging before the program terminates.
  • 实现自己的处理函数
1
2
3
4
5
6
7
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);
}
  • 如果是做SDK要捕获异常,但是不想影响到主程序的异常崩溃。那么就先捕获老的异常,替换为自己的异常处理函数。处理了后再调用老的异常处理函数
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
#pragma mark - 异常捕获

void (*oldHandler)(NSException *exception);

static 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);

oldHandler(exception);
}

-(BOOL)install{
if(NSGetUncaughtExceptionHandler() != uncaughtExceptionHandler)
oldHandler = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
return YES;
}

-(BOOL)uninstall{
NSSetUncaughtExceptionHandler(oldHandler);
return YES;
}

itunesConnect自动收集

从AppStore下载的应用,应用崩溃后系统会自动收集崩溃信息发至itunesConnect。 xcode7.0后不需要再去itunesconnect后台下载崩溃信息。 XCode->Window->Organizer->Crashes 可以下载查看对应App的崩溃行。

崩溃信息分析

手动分析

崩溃信息分析用 xcode自带的工具分析 symbolicatecrash。 位于

1
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

如果找不到symbolicatecrash。进入到xcode.app,执行 find . -name symbolicatecrash来查找

把对应版本的 .app .dSYM 导出的.crash文件 以及 symbolicatecrash 放在同一个文件夹。敲命令生成更简洁的崩溃信息

1
2
3
export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer

./symbolicatecrash /Users/xxxx/Desktop/crash/InOrder.crash /Users/xxxx/Desktop/crash/InOrder.app.dSYM > Control_symbol.crash

这样处理过后的崩溃信息就会被定义到对应的行了

xcode分析

如果XCode上保存了archive。 则可以 XCode->Window->Organizer->Crashes-> Open in Project