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资料

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