iOS 捕获系统外异常
太阳火神的美丽人生 (http://blog.youkuaiyun.com/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
有时应用崩溃,而日志中的输出信息太少,无法定位问题,这是最头疼的事情,尤其很累的时侯,已经想不起来刚才改过什么了,这就叫做无耐。
工欲善其事,必先利其器,下面的方法可以给多些信息,让你看到堆栈执行顺序,在哪里崩溃的,也就能大概给个思路,确定问题的症结。
在 AppDelegate.m 类实现之前加入:
- void UncaughtExceptionHandler(NSException *exception) {
- // 获取异常相关信息
- NSArray *callStackSymbols = [exception callStackSymbols];
- NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"];
- NSString *reason = [exception reason];
- NSString *name = [exception name];
- // 获取系统当前时间
- NSDate * date = [NSDate date];
- NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init ];
- [dateFormatter setDateFormat:@"yyyy年MM月dd日 HH小时mm分ss秒"];
- NSString * dateStr = [dateFormatter stringFromDate:date];
- NSLog(@"系统当前时间为:%@ \n",dateStr);
- NSLog(@"异常名称:%@ \n",name);
- NSLog(@"异常原因:%@ \n",reason);
- NSLog(@"堆栈标志:%@ \n",callStackSymbolStr);
- }
void UncaughtExceptionHandler(NSException *exception) {
// 获取异常相关信息
NSArray *callStackSymbols = [exception callStackSymbols];
NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"];
NSString *reason = [exception reason];
NSString *name = [exception name];
// 获取系统当前时间
NSDate * date = [NSDate date];
NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init ];
[dateFormatter setDateFormat:@"yyyy年MM月dd日 HH小时mm分ss秒"];
NSString * dateStr = [dateFormatter stringFromDate:date];
NSLog(@"系统当前时间为:%@ \n",dateStr);
NSLog(@"异常名称:%@ \n",name);
NSLog(@"异常原因:%@ \n",reason);
NSLog(@"堆栈标志:%@ \n",callStackSymbolStr);
}
- @implementation AppDelegate
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);