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(SIGHUPsignalHandler);

    signal(SIGINTsignalHandler);

    signal(SIGQUITsignalHandler);

    

    signal(SIGABRTsignalHandler);

    signal(SIGILLsignalHandler);

    signal(SIGSEGVsignalHandler);

    signal(SIGFPEsignalHandler);

    signal(SIGBUSsignalHandler);

    signal(SIGPIPEsignalHandler);

}


@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值