概要
- 檢測卡頓的原理
- 檢測崩潰的原理
檢測卡頓的原理
Runloop的兩次source[kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting]的監控 創建信號量的方式 渲染界面的頻率來監控幀率
檢測崩潰的原理
崩潰分類
- Mach異常
- OC異常
Mach異常
需要註冊異常端口 獲取到single
signal(SIGHUP, SignalExceptionHandler);
signal(SIGINT, SignalExceptionHandler);
signal(SIGQUIT, SignalExceptionHandler);
signal(SIGABRT, SignalExceptionHandler);
signal(SIGILL, SignalExceptionHandler);
signal(SIGSEGV, SignalExceptionHandler);
signal(SIGFPE, SignalExceptionHandler);
signal(SIGBUS, SignalExceptionHandler);
signal(SIGPIPE, SignalExceptionHandler);
// 獲取函數堆棧信息,這裏可以獲取響應調用堆棧的符號信息,通過數組回傳
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
OC異常
註冊NSUncaughtExceptionHandler 獲取到NSException
void HandleException(NSException *exception) {
// 異常的堆棧信息
NSArray *stackArray = [exception callStackSymbols];
// 出現異常的原因
NSString *reason = [exception reason];
// 異常名稱
NSString *name = [exception name];
NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@\nException name:%@\nException stack:%@",name, reason, stackArray];
NSLog(@"%@", exceptionInfo);
[UncaughtExceptionHandler saveCrash:exceptionInfo];
}
Swift異常
Swift異常也是通過Mach異常的signal註冊方式捕獲
signal(SIGTRAP, SignalExceptionHandler)
SIGTRAP可以捕獲大部分Swift異常
結合Slide Address 進行crash分析
https://www.jianshu.com/p/d2b7a2eb36ba
異常解析
符號化
就是我們要獲取到其他的堆棧信息的時候 我們就需要符號化數據了 通過 dSYM 文件提取地址和符號的對應關係,進行符號還原
運行時堆棧獲取
當卡頓發生之後,我們爲了定位,會收集當時的一個堆棧情況,在此你可以使用 PLCrashReporter來做,也可以自己研發一個堆棧收集庫(可參考這裏來做) 對於實例,網上已經有很多開源的項目,你可以參考這個