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

  • 相关阅读:
    PHP microtime() 函数
    PHP localtime() 函数
    PHP idate() 函数
    PHP gmstrftime() 函数
    Orchestrator安装
    [BJOI2017]开车
    cant found Microsoft.VSSDK.BuildTools.15.0.26201
    如何移动 nuget 缓存文件夹
    如何移动 nuget 缓存文件夹
    如何移动 nuget 缓存文件夹
  • 原文地址:https://www.cnblogs.com/wanyakun/p/4164312.html
Copyright © 2011-2022 走看看