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);
}
3、在 didFinishLaunchingWithOptions方法的开头写如下代码:
- (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