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

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



分享到:
评论

相关推荐

    iOS 异常捕捉及处理发送。ExceptionHandler.

    3. 实现异常捕获和处理的回调方法。 4. 将异常信息记录并保存。 5. 可选:集成邮件发送功能,当异常发生时自动发送报告。 通过以上介绍,我们可以看到`ExceptionHandler`在iOS开发中的重要性,它可以帮助我们更有效...

    iOS异常捕获和崩溃日志

    总结来说,iOS异常捕获和崩溃日志处理是提升应用质量不可或缺的环节。利用如ZFJUncaughtExceptionHandler这样的工具,可以有效地记录和分析崩溃信息,从而快速定位和修复问题,提供更稳定的用户体验。对于开发者而言...

    iOS 异常捕捉及处理发送。ExceptionHandler

    在iOS开发中,异常捕捉和处理是至关重要的环节,它能确保应用在遇到错误时能够稳定运行,并且为开发者提供有价值的错误信息以便于调试。`ExceptionHandler`是一个专门用于捕获和处理iOS应用中的异常的机制。这个机制...

    iOS 异常自定义捕捉handle工具类下载

    1. **异常捕获**:通过注册异常处理器,当异常发生时,系统会调用我们设定的处理程序。 2. **异常信息收集**:在处理程序中,我们需要收集异常的详细信息,包括异常名称、原因、堆栈轨迹等,这些信息对于定位问题...

    iOS开发异常捕获上传至邮箱

    在iOS应用开发中,异常捕获是至关重要的一个环节,它可以帮助开发者在程序崩溃时获取必要的信息,以便分析和修复问题。"iOS开发异常捕获上传至邮箱"这个标题所涉及的知识点主要涵盖如何在iOS应用程序中实现异常监控...

    iOS捕获程序异常崩溃记录、App信息等

    "iOS捕获程序异常崩溃记录、App信息等"这一主题就是关注如何在iOS应用中实现这样的功能。通过创建自定义的崩溃捕获机制,并将相关信息上传至服务器,我们可以获取详细的崩溃日志和系统信息,从而更好地诊断和解决...

    ios Crash异常捕捉demo

    - **异常捕获**:在关键代码段使用`@try`、`@catch`来捕获异常,提供备用逻辑或用户提示。 - **记录日志**:在异常处理器中记录详细的错误信息,便于后续排查问题。 - **使用第三方库**:考虑集成如Fabric/...

    iOS程序异常crash捕获与拦截

    二、异常捕获 1. 自定义异常处理:通过在代码中添加@try/@catch结构,可以捕获并处理异常。但这种方法只适用于知道可能出现异常的特定代码段。 2. 主线程异常处理:由于大部分用户交互发生在主线程,确保主线程不...

    IOS 异常崩溃时发送邮件

    "IOS 异常崩溃时发送邮件"这个主题正是关于如何在iOS应用出现异常时,自动捕获异常信息并通过电子邮件发送到指定地址,以便于调试。 首先,我们需要了解`NSSetUncaughtExceptionHandler`这个函数。它是Objective-C...

    iOS异常处理

    总结来说,iOS异常处理主要是通过异常捕获和处理来增强应用的健壮性。`AppExceptionHandler`类提供了一种便捷的方式来全局监控和处理应用中的异常,帮助开发者更好地调试和维护应用。通过学习和应用这些技术,可以...

    ios异常处理问题

    "ios异常处理问题"这一主题关注的是如何有效地检测和处理这些异常,以防止程序的非预期终止。 在Objective-C和Swift这两种主要的iOS编程语言中,异常处理机制有所不同。在Objective-C中,异常是通过`@try`、`@catch...

    iOS捕获异常组件UncaughtExceptionHandler

    添加UncaughtExceptionHandler这个类 iOS SDK提供的函数是NSSetUncaughtExceptionHandler来进行异常处理。但是无法处理内存访问错误、重复释放等错误,因为这些错误发送的SIGNAL。所以需要处理这些SIGNAL

    ios app异常处理可以发送邮件

    在iOS应用开发中,异常处理是一项至关重要的任务,它能够帮助开发者及时捕获并处理程序运行过程中的错误,提升用户体验,同时也有助于开发者更好地诊断和修复问题。本篇文章将详细探讨如何在iOS应用程序中实现异常...

    程序崩溃异常捕获

    在实际应用中,为了提高用户体验,还可以结合崩溃报告库,如Android的ACRA(Application Crash Report for Android)或iOS的Fabric的Crashlytics,它们提供了一套完整的异常捕获、本地存储、上传和分析的解决方案。...

    unity 捕捉异常和移动设备崩溃Android

    "unity 捕捉异常和移动设备崩溃Android"这个主题聚焦于如何在Unity引擎中有效地管理和处理异常,以及如何针对Android设备上的游戏崩溃进行调试。下面我们将深入探讨相关知识点。 一、Unity异常处理基础 在Unity中,...

    NdUncaughtExceptionHandler 异常捕捉

    在iOS开发中,异常处理是确保程序稳定性和用户体验的关键部分。`NdUncaughtExceptionHandler` 是一个自定义的未捕获异常处理程序,用于在应用程序中处理那些没有被正常捕获的异常情况。当一个异常在主线程或者任何...

    iOS中捕获日志与异常示例详解

    异常捕获 在 iOS 中,捕获异常可以通过 NSSetUncaughtExceptionHandler 函数来实现。NSSetUncaughtExceptionHandler 函数可以设置一个顶级错误处理程序,在程序终止之前可以获取到崩溃信息,并执行相应的操作,...

    ios-iOS捕获崩溃日志.zip

    "ios-iOS捕获崩溃日志.zip"这个压缩包提供了相关的解决方案,尤其是对于Swift项目。 首先,描述中提到的Swift扩展库——ZCategoryTool,是由CoderZCC开发的一个开源工具,它支持通过CocoaPods进行集成。CocoaPods是...

    iOS Crash日志收集上报

    Mach异常是最底层的内核级异常,是指在iOS系统的内核层中发生的异常。Mach异常可以是EXC_BAD_ACCESS(内存访问异常)等。Mach异常是通过Mach API暴露给用户态的,可以直接通过Mach API设置thread、task、host的异常...

Global site tag (gtag.js) - Google Analytics