一. 捕獲Crash異常信息
第1種異常(NSException)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSSetUncaughtExceptionHandler(&CrashExceptionHandler);
return YES;
}
void CrashExceptionHandler(NSException *exception) {
NSArray<NSString *> *callStack = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSLog(@"原因:%@\n名稱:%@\n調(diào)用棧:%@", reason, name, callStack);
}
第2種異常(收到系統(tǒng)發(fā)出的SIGXXX信號(hào)導(dǎo)致Crash)
#include <execinfo.h>(需要引入的函數(shù)庫(kù))
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
signal(SIGABRT, SignalExceptionHandler);
signal(SIGILL, SignalExceptionHandler);
signal(SIGSEGV, SignalExceptionHandler);
signal(SIGFPE, SignalExceptionHandler);
signal(SIGBUS, SignalExceptionHandler);
signal(SIGPIPE, SignalExceptionHandler);
return YES;
}
void SignalExceptionHandler(int signal)
{
NSArray *callStack = [AppDelegate backtrace];
NSLog(@"信號(hào)捕獲崩潰,堆棧信息:%@",callStack);
NSString *name = @"LMSignalException";
NSString *reason = [NSString stringWithFormat:@"signal %d was raised",signal];
NSLog(@"名稱:%@\n原因:%@", name, reason);
}
+ (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;
}
備注:僅僅是捕獲異常可能不能滿足程序的需求,所以再推薦使用AvoidCrash
二. 防止程序Crash + 捕獲Crash異常信息
AvoidCrash的使用方法寫的很詳細(xì),作者很認(rèn)真,點(diǎn)贊!