概要
- 检测卡顿的原理
- 检测崩溃的原理
检测卡顿的原理
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来做,也可以自己研发一个堆栈收集库(可参考这里来做) 对于实例,网上已经有很多开源的项目,你可以参考这个