`
liubo0_0
  • 浏览: 20231 次
社区版块
存档分类
最新评论

IOS 异常捕获

 
阅读更多

1、以下这些代码,放到AppDelegate的 @ implementation 之前。

#include <libkern/OSAtomic.h>
#include <execinfo.h>

// 系统信号截获处理方法
void signalHandler(int signal);
// 异常截获处理方法
void exceptionHandler(NSException *exception);
const int32_t _uncaughtExceptionMaximum = 10;


2、以下这些代码,放到AppDelegate 中。

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 = [AppDelegate 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 = [AppDelegate backtrace];
     NSMutableDictionary *userInfo =[NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];
     [userInfo setObject:callStack forKey:@"ExceptionHandlerAddressesKey"];
     
     // 现在就可以保存信息到本地[]
    NSArray *callStackSymbols = [exception callStackSymbols];
    NSString *callStackSymbolStr = [callStackSymbols componentsJoinedByString:@"\n"];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    DDLogError(@"异常 >>");
    DDLogError(@"异常名称:%@",name);
    DDLogError(@"异常原因:%@",reason);
    DDLogError(@"堆栈标志:%@",callStackSymbolStr);
    DDLogError(@"异常 <<");
}

//获取调用堆栈
+(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);
}

3、在 didFinishLaunchingWithOptions方法的开头写如下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    installExceptionHandler();

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

注:

signalHandler 和 exceptionHandler 里面的内容可以删减,写自己的方法。


转自:

http://blog.csdn.net/daiyelang/article/details/17020211



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics