1、以下这些代码,放到AppDelegate的 @ implementation 之前。
#include <libkern/OSAtomic.h> #include <execinfo.h> // 系统信号截获处理方法 void signalHandler(int signal); // 异常截获处理方法 void exceptionHandler(NSException *exception); const int32_t _uncaughtExceptionMaximum = 10;
2、以下这些代码,放到AppDelegate 中。
void signalHandler(int signal) { volatile int32_t _uncaughtExceptionCount = 0; int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount); if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理 { return; } // 获取信息 NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:@"UncaughtExceptionHandlerSignalKey"]; NSArray *callStack = [AppDelegate backtrace]; [userInfo setObject:callStack forKey:@"SingalExceptionHandlerAddressesKey"]; // 现在就可以保存信息到本地[] } void exceptionHandler(NSException *exception) { volatile int32_t _uncaughtExceptionCount = 0; int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount); if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理 { return; } NSArray *callStack = [AppDelegate backtrace]; NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]]; [userInfo setObject:callStack forKey:@"ExceptionHandlerAddressesKey"]; // 现在就可以保存信息到本地[] NSArray *callStackSymbols = [exception callStackSymbols]; NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"]; NSString *reason = [exception reason]; NSString *name = [exception name]; DDLogError(@"异常 >>"); DDLogError(@"异常名称:%@",name); DDLogError(@"异常原因:%@",reason); DDLogError(@"堆栈标志:%@",callStackSymbolStr); DDLogError(@"异常 <<"); } //获取调用堆栈 +(NSArray *)backtrace { void* callstack[128]; int frames = backtrace(callstack, 128); char **strs = backtrace_symbols(callstack,frames); NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames]; for (int i=0;i<frames;i++) { [backtrace addObject:[NSString stringWithUTF8String:strs[i]]]; } free(strs); return backtrace; } // 注册崩溃拦截 void installExceptionHandler() { NSSetUncaughtExceptionHandler(&exceptionHandler); signal(SIGHUP, signalHandler); signal(SIGINT, signalHandler); signal(SIGQUIT, signalHandler); signal(SIGABRT, signalHandler); signal(SIGILL, signalHandler); signal(SIGSEGV, signalHandler); signal(SIGFPE, signalHandler); signal(SIGBUS, signalHandler); signal(SIGPIPE, signalHandler); }
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { installExceptionHandler(); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
注:
signalHandler 和 exceptionHandler 里面的内容可以删减,写自己的方法。
转自:
http://blog.csdn.net/daiyelang/article/details/17020211