• iOS crash 异常捕获


    //

    //  UncaughtExceptionHandler.m

    //  UncaughtExceptions

    //

    //  Created by Matt Gallagher on 2010/05/25.

    //  Copyright 2010 Matt Gallagher. All rights reserved.

    //

    //  Permission is given to use this source code file, free of charge, in any

    //  project, commercial or otherwise, entirely at your risk, with the condition

    //  that any redistribution (in part or whole) of source code must retain

    //  this copyright and permission notice. Attribution in compiled projects is

    //  appreciated but not required.

    //

    #import "YunUncaughtExceptionHandler.h"

    #include <libkern/OSAtomic.h>

    #include <execinfo.h>

    NSString * const YunUncaughtExceptionHandlerSignalExceptionName = @"YunUncaughtExceptionHandlerSignalExceptionName";

    NSString * const YunUncaughtExceptionHandlerSignalKey = @"YunUncaughtExceptionHandlerSignalKey";

    NSString * const YunUncaughtExceptionHandlerAddressesKey = @"YunUncaughtExceptionHandlerAddressesKey";

    volatile int32_t YunUncaughtExceptionCount = 0;

    const int32_t YunUncaughtExceptionMaximum = 10;

    const NSInteger YunUncaughtExceptionHandlerSkipAddressCount = 4;

    const NSInteger YunUncaughtExceptionHandlerReportAddressCount = 5;

    @implementation UncaughtExceptionHandler

    + (NSArray *)backtrace

    {

    void* callstack[128];

    int frames = backtrace(callstack, 128);

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

     

    int i;

    NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];

    for (

    i = YunUncaughtExceptionHandlerSkipAddressCount;

    i < YunUncaughtExceptionHandlerSkipAddressCount +

    YunUncaughtExceptionHandlerReportAddressCount;

    i++)

    {

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

    }

    free(strs);

     

    return backtrace;

    }

    - (void)alertView:(UIAlertView *)anAlertView clickedButtonAtIndex:(NSInteger)anIndex

    {

        

    if (anIndex == 0)

    {

    dismissed = YES;

    }

    }

    - (void)validateAndSaveCriticalApplicationData

    {

    }

    //错误日志开始发送到服务器

    - (void)handleException:(NSException *)exception

    {

    [self validateAndSaveCriticalApplicationData];

    // UIAlertView *alert =

    // [[[UIAlertView alloc]

    // initWithTitle:NSLocalizedString(@"Unhandled exception", nil)

    // message:[NSString stringWithFormat:NSLocalizedString(

    // @"You can try to continue but the application may be unstable. "

    // @"Debug details follow: %@ %@", nil),

    // [exception reason],

    // [[exception userInfo] objectForKey:YunUncaughtExceptionHandlerAddressesKey]]

    // delegate:self

    // cancelButtonTitle:NSLocalizedString(@"Quit", nil)

    // otherButtonTitles:NSLocalizedString(@"Continue", nil), nil]

    // autorelease];

    // [alert show];

        NSString *errorStr = [NSString stringWithFormat:NSLocalizedString(

                                                                          @"error info details follow:%@%@", nil),

                              [exception reason],

                              [[exception userInfo] objectForKey:YunUncaughtExceptionHandlerAddressesKey]]

        ;

        

        NSLog(@"errorStrerrorStr:%@",errorStr);

       // [[NSUserDefaults standardUserDefaults]setObject:errorStr forKey:my_ExceptionLog];

        if(errorStr)

        {

            [self sendErrorMsg];

        }

        //NSLog(@"error:%@",errorStr);

    CFRunLoopRef runLoop = CFRunLoopGetCurrent();

    CFArrayRef allModes = CFRunLoopCopyAllModes(runLoop);

    while (!dismissed)

    {

    for (NSString *mode in (__bridge  NSArray *)allModes)

    {

    CFRunLoopRunInMode((__bridge CFStringRef)mode, 0.001, false);

    }

    }

    CFRelease(allModes);

    NSSetUncaughtExceptionHandler(NULL);

    signal(SIGABRT, SIG_DFL);

    signal(SIGILL, SIG_DFL);

    signal(SIGSEGV, SIG_DFL);

    signal(SIGFPE, SIG_DFL);

    signal(SIGBUS, SIG_DFL);

    signal(SIGPIPE, SIG_DFL);

    if ([[exception name] isEqual:YunUncaughtExceptionHandlerSignalExceptionName])

    {

    kill(getpid(), [[[exception userInfo] objectForKey:YunUncaughtExceptionHandlerSignalKey] intValue]);

    }

    else

    {

    [exception raise];

    }

    }

    -(void)sendErrorMsg

    {

        NSLog(@"exceppppppp");

       // FetchQueue *fetchQueue = [[FetchQueue alloc]init];

    //    [fetchQueue setGLDelegate:self.gldelegate];

        //[fetchQueue SendHTTpToGLServer:my_EXCEPT sendType:@"POST"];

    }

    @end

    void HandleException(NSException *exception)

    {

    int32_t exceptionCount = OSAtomicIncrement32(&YunUncaughtExceptionCount);

    if (exceptionCount > YunUncaughtExceptionMaximum)

    {

    return;

    }

    NSArray *callStack = [UncaughtExceptionHandler backtrace];

    NSMutableDictionary *userInfo =

    [NSMutableDictionary dictionaryWithDictionary:[exception userInfo]];

    [userInfo

    setObject:callStack

    forKey:YunUncaughtExceptionHandlerAddressesKey];

    [[[UncaughtExceptionHandler alloc] init]

    performSelectorOnMainThread:@selector(handleException:)

    withObject:

    [NSException

    exceptionWithName:[exception name]

    reason:[exception reason]

    userInfo:userInfo]

    waitUntilDone:YES];

    }

    void SignalHandler(int signal)

    {

    int32_t exceptionCount = OSAtomicIncrement32(&YunUncaughtExceptionCount);

    if (exceptionCount > YunUncaughtExceptionMaximum)

    {

    return;

    }

    NSMutableDictionary *userInfo =

    [NSMutableDictionary

    dictionaryWithObject:[NSNumber numberWithInt:signal]

    forKey:YunUncaughtExceptionHandlerSignalKey];

    NSArray *callStack = [UncaughtExceptionHandler backtrace];

    [userInfo

    setObject:callStack

    forKey:YunUncaughtExceptionHandlerAddressesKey];

    [[[UncaughtExceptionHandler alloc] init]

    performSelectorOnMainThread:@selector(handleException:)

    withObject:

    [NSException

    exceptionWithName:YunUncaughtExceptionHandlerSignalExceptionName

    reason:

    [NSString stringWithFormat:

    NSLocalizedString(@"Signal %d was raised.", nil),

    signal]

    userInfo:

    [NSDictionary

    dictionaryWithObject:[NSNumber numberWithInt:signal]

    forKey:YunUncaughtExceptionHandlerSignalKey]]

    waitUntilDone:YES];

    }

    void YunInstallUncaughtExceptionHandler(void)

    {

    NSSetUncaughtExceptionHandler(&HandleException);

    signal(SIGABRT, SignalHandler);

    signal(SIGILL, SignalHandler);

    signal(SIGSEGV, SignalHandler);

    signal(SIGFPE, SignalHandler);

    signal(SIGBUS, SignalHandler);

    signal(SIGPIPE, SignalHandler);

    }

    .h文件

    //

    //  UncaughtExceptionHandler.h

    //  UncaughtExceptions

    //

    //  Created by Matt Gallagher on 2010/05/25.

    //  Copyright 2010 Matt Gallagher. All rights reserved.

    //

    //  Permission is given to use this source code file, free of charge, in any

    //  project, commercial or otherwise, entirely at your risk, with the condition

    //  that any redistribution (in part or whole) of source code must retain

    //  this copyright and permission notice. Attribution in compiled projects is

    //  appreciated but not required.

    //

    #import <UIKit/UIKit.h>

    @interface UncaughtExceptionHandler : NSObject{

    BOOL dismissed;

    }

    @end

    void HandleException(NSException *exception);

    void SignalHandler(int signal);

    void YunInstallUncaughtExceptionHandler(void);

  • 相关阅读:
    《计算机图形学-基于3D图形开发技术》读书笔记
    【转】OpenGL和D3D 矩阵对比
    【转】D3D中详细拾取操作
    根据点坐标改变字体显示位置
    静态常量和常量在类中的初始化
    MFC单文档中使用D3D9
    单文档切换OpenGL视图
    超大地形的处理 (Terrain Visualization)【转自知乎】
    又出现这种问题。。。
    属性
  • 原文地址:https://www.cnblogs.com/qingjoin/p/5970215.html
Copyright © 2020-2023  润新知