zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Flask入门到精通(二)
    MySQL安装配置,命令,异常纪要
    JQuery 选择器
    redhat Enterprise Linux Server release 7.2(Maipo) 安装redis-stat
    pssh 不能执行指定用户命令
    VMware 命令行下安装以及导入Ubuntu系统
    Linux CPU相关信息查看
    Ubuntu 16.04 Mxnet CPU 版本安装
    Ubuntu 16.04 TensorFlow CPU 版本安装
    <转>揭秘DNS后台文件:DNS系列之五
  • 原文地址:https://www.cnblogs.com/wanyakun/p/4164312.html
Copyright © 2011-2022 走看看