OC基础

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 文件提取地址和符号的对应关系,进行符号还原

移动端监控体系之技术原理剖析

上一篇 下一篇

猜你喜欢

热点阅读