iOS Crash異常處理

一. 捕獲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)贊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。