美文网首页
iOS崩溃分析及全面监控

iOS崩溃分析及全面监控

作者: 安心做个笨男孩 | 来源:发表于2020-07-28 17:13 被阅读0次

    奔溃信息分类

    可以通过信号捕获的崩溃信息:数组越界,野指针问题,NSNotification线程问题,KVO 问题
    无法被信号捕获的奔溃信息:后台任务超时、内存超出限制、主线程卡顿超阈值

    通过信号捕获的崩溃信息

    1、一般使用bugly全局监听,获取崩溃信息。
    信号量捕获实现代码如下

    // 注册signalHandler
    void registerSignalHandler(void) {
        signal(SIGSEGV, handleSignalException);
        signal(SIGFPE, handleSignalException);
        signal(SIGBUS, handleSignalException);
        signal(SIGPIPE, handleSignalException);
        signal(SIGHUP, handleSignalException);
        signal(SIGINT, handleSignalException);
        signal(SIGQUIT, handleSignalException);
        signal(SIGABRT, handleSignalException);
        signal(SIGILL, handleSignalException);
    }
    
    // 打印捕获到的崩溃信息
    void handleSignalException(int signal) {
        NSMutableString *crashString = [[NSMutableString alloc]init];
        void* callstack[128];// 指针数组
       // backtrace()函数用与获取当前线程的调用堆栈,获取的信息将会被存放在callstack中
        int i, frames = backtrace(callstack, 128);
       // backtrace_symbols()将从backtrace函数获取的信息转化为一个字符串数组.
        char** traceChar = backtrace_symbols(callstack, frames);
        for (i = 0; i <frames; ++i) {
            [crashString appendFormat:@"%s\n", traceChar[i]];
        }
        NSLog(crashString);
    }
    

    2、常见的异常编码

    • 0x8badf00d,表示 App 在一定时间内无响应而被 watchdog 杀掉的情况。(主线程被卡)
    • 0xdeadfa11,表示 App 被用户强制退出。
    • 0xc00010ff,表示 App 因为运行造成设备温度太高而被杀掉。

    3、在bugly上可以查看到引起奔溃的系统,机型等信息。以及出现奔溃影响的用户数量。根据影响用户数量由大到小排列,优先解决影响面大的。

    降低崩溃方式

    pod导入SafeKit,无需修改代码降低奔溃发生。

    主要针对:数组,字典,可变数组,可变字典,字符串。处理数组越界, 野指针。

    创建对应的分类,在分类的load方法中进行方法替换处理。load方法在main() 函数执行前已经完成。
    核心代码如下:

    // 进行系统方法替换
    + (void)safe_swizzleMethod:(Class)srcClass srcSel:(SEL)srcSel tarClass:(Class)tarClass tarSel:(SEL)tarSel{
        if (!srcClass) {
            return;
        }
        if (!srcSel) {
            return;
        }
        if (!tarClass) {
            return;
        }
        if (!tarSel) {
            return;
        }
        // class_getInstanceMethod获取类中的方法
        Method srcMethod = class_getInstanceMethod(srcClass,srcSel);
        Method tarMethod = class_getInstanceMethod(tarClass,tarSel);
        // 将系统的类中方法替换成已经进行安全处理的方法
        method_exchangeImplementations(srcMethod, tarMethod);
    }
    

    相关文章

      网友评论

          本文标题:iOS崩溃分析及全面监控

          本文链接:https://www.haomeiwen.com/subject/fkmfrktx.html