bugly的原理
2020-10-14 本文已影响0人
Rumbles
1.检测卡顿的原理
Runloop的两次source[kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting]的监控 创建信号量的方式
渲染界面的频率来监控帧率
2.检测崩溃的原理
iOS一般的崩溃有两种
1.Single异常
我们需要注册异常端口 获取到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);
获取到的 backtrace
void SignalExceptionHandler(int signal)
{
NSMutableString *mstr = [[NSMutableString alloc] init];
[mstr appendString:@"Stack:\n"];
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i <frames; ++i) {
[mstr appendFormat:@"%s\n", strs[i]];
}
[SignalHandler saveCreash:mstr];
}
2.Objective-C 异常 获取到NSException
注册NSUncaughtExceptionHandler
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 saveCreash:exceptionInfo];
}
在对应的函数中我们拿到数据后写入本地 然后在合适的时机上传到服务器
3.符号化
就是我们要获取到其他的堆栈信息的时候 我们就需要符号化数据了
通过 dSYM 文件提取地址和符号的对应关系,进行符号还原