iOS卡頓、異常監控

概要

  1. 檢測卡頓的原理
  2. 檢測崩潰的原理

檢測卡頓的原理

Runloop的兩次source[kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting]的監控  創建信號量的方式 渲染界面的頻率來監控幀率 runloop卡頓檢測

檢測崩潰的原理

崩潰分類

  • 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來做,也可以自己研發一個堆棧收集庫(可參考這裏來做) 對於實例,網上已經有很多開源的項目,你可以參考這個

APM資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章