参考文章:
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