• IOS Crash捕获


    IOS Crash ,就两种情况:一种是异常,另一种是中断[信号量]。

    #include <libkern/OSAtomic.h>

    #include <execinfo.h>

    // 系统信号截获处理方法

    void signalHandler(int signal);

    // 异常截获处理方法

    void exceptionHandler(NSException *exception);

    const int32_t _uncaughtExceptionMaximum = 10;

    void signalHandler(int signal)

    {  

        volatile int32_t _uncaughtExceptionCount = 0;

        int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);

        if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理

        {

            return;

        }

        

        // 获取信息

        NSMutableDictionary *userInfo =

        [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:UncaughtExceptionHandlerSignalKey];

        

        NSArray *callStack = [ExceptionHandler backtrace];

        [userInfo  setObject:callStack  forKey:SingalExceptionHandlerAddressesKey];

        

        // 现在就可以上报信息到服务器    

    }

    void exceptionHandler(NSException *exception)

    {

        volatile int32_t _uncaughtExceptionCount = 0;

        int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);

        if (exceptionCount > _uncaughtExceptionMaximum) // 如果太多不用处理

        {

            return;

        }

        

        NSArray *callStack = [ExceptionHandler backtrace];

        NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];

        [userInfo setObject:callStack forKey:ExceptionHandlerAddressesKey];

        

         // 现在就可以上报信息到服务器  

    }

    @implementation ExceptionHandler

    //获取调用堆栈

    + (NSArray *)backtrace

    {

        void* callstack[128];

        int frames = backtrace(callstack, 128);

        char **strs = backtrace_symbols(callstack,frames);

        

        NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

        for (int i=0;i<frames;i++)

        {

            [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];

        }

        free(strs);

        

        return backtrace;

    }

    // 注册崩溃拦截

    -(void)installExceptionHandler

    {

        NSSetUncaughtExceptionHandler(&exceptionHandler);

        signal(SIGHUP, signalHandler);

        signal(SIGINT, signalHandler);

        signal(SIGQUIT, signalHandler);

        

        signal(SIGABRT, signalHandler);

        signal(SIGILL, signalHandler);

        signal(SIGSEGV, signalHandler);

        signal(SIGFPE, signalHandler);

        signal(SIGBUS, signalHandler);

        signal(SIGPIPE, signalHandler);

    }

    @end

  • 相关阅读:
    京东RPA:以企业数字化转型为驱动的机器人流程自动化解决方案专家
    运维大规模ES集群的思考和实践
    潘建伟团队再登Nature:建成全球首个集成量子通信网,全长4600公里
    数智化浪潮之中,传统企业如何抓住转型机遇?
    “持证”就能上岗 京东绿色内推招聘通道开启
    IoT爆发前夕,企业架构要面对哪些变革?
    如何使用ClickHouse实现时序数据管理和挖掘?
    图灵测试已过时,AI 需要新基准测试;别了Flash,Adobe播放器正式停运
    送你一份迷你书,全面了解如何做好大促技术备战
    Django 动态修改库名
  • 原文地址:https://www.cnblogs.com/wanyakun/p/4164312.html
Copyright © 2020-2023  润新知