`
jiangmq100083
  • 浏览: 11476 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

IOS 处理闪退崩溃问题

    博客分类:
  • IOS
阅读更多

很多时候,开发的APP会存在在真机上出现闪退和崩溃的问题,如果捕获到这些异常,就以快速定位问题所在,所以这里记录下如何捕获和处理方法。

 

总的核心思想是:

1.让程序知道出现闪退和崩溃的问题时,该调用什么

2.对闪退和崩溃问题进行处理

 

key point:

ios里面的崩溃和闪退分两种情况,一种是未捕获的异常,通常是一些NSXXXXException这种,这种异常,可以通过NSSetUncaughtExceptionHandler 函数来进行异常处理。还有一种,内存访问错误,重复释放等这些错误造成的,就不是exception了,而是抛出Signal,这就需要做专门的Signal处理。

 

1.让程序知道出现闪退和崩溃的问题时,该调用什么:

//在AppDelegate.m里面的didFinishLaunchingWithOptions方法里面注册一下(didFinishLaunchingWithOptions方法在app启动时总会调用,所以在这里面注册)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 

{

    //对应第一种情况,如果有未捕获的异常,通过NSSetUncaughtExceptionHandler方法,来向程序注册,当这种情况时,就调用HandleException方法来进行处理

    NSSetUncaughtExceptionHandler(&HandleException);

 

    //对应第二种情况,抛出了Signal的时候,就调用SignalHandler方法处理

    //第一个参数,表示抛出的Signal,当系统抛出SIGABRT这个Signal的时候,就调用SignalHandler方法进行处理

    signal(SIGABRT, SignalHandler);

    signal(SIGILL, SignalHandler);

    signal(SIGSEGV, SignalHandler);

    signal(SIGFPE, SignalHandler);

    signal(SIGBUS, SignalHandler);

 

    signal(SIGPIPE, SignalHandler);

 

    XXXXXXXXX

}

 

2.对闪退和崩溃问题进行处理:

//HandleException方法

volatile int32_t UncaughtExceptionCount = 0;

 

const int32_t UncaughtExceptionMaximum = 10;

 

void HandleException(NSException *exception)

{

    //我也不明白到玩意到底啥意思

    int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount);

    if (exceptionCount > UncaughtExceptionMaximum)

    {

        return;

    }

    //获得关于exception的信息

    NSArray *stackArray = [exception callStackSymbols];

    NSString *reason = [exception reason];

    NSString *name = [exception name];

    NSString *errorMessage = @"";

    

    errorMessage = [errorMessage stringByAppendingFormat:@"App Crash error:name=%@;reason=%@;stack=%@",name,reason,[stackArray componentsJoinedByString:@";"]];

    //处理exception或者发送mail或者上传得到的exception信息

 

 

}

 

//SignalHandler方法

void SignalHandler(int signal)

{

    int32_t exceptionCount = OSAtomicIncrement32(&UncaughtExceptionCount);

    if (exceptionCount > UncaughtExceptionMaximum)

    {

        return;

    }

   

    //处理signal或者发送mail或者上传得到的signal信息

 

}

 

//得到backtrace的内容,就相当于exception的详细log

const NSInteger UncaughtExceptionHandlerSkipAddressCount = 4;

 

const NSInteger UncaughtExceptionHandlerReportAddressCount = 5;

+ (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 = UncaughtExceptionHandlerSkipAddressCount;

         i < UncaughtExceptionHandlerSkipAddressCount +

         UncaughtExceptionHandlerReportAddressCount;

         i++)

    {

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

    }

    free(strs);

    

    return backtrace;

 

}

 

 

 

 

分享到:
评论

相关推荐

    unity ios 启动闪退

    ### Unity iOS 启动闪退问题解析与解决方案 #### 一、问题背景 在使用Unity进行iOS应用开发的过程中,开发者可能会遇到一个常见的问题——应用程序在启动时出现闪退的情况。这种情况不仅会影响用户体验,而且会给...

    ios app的闪退异常的处理

    在iOS应用开发中,"闪退"是一个常见的问题,它指的是应用程序在启动后突然崩溃或在运行时无预警地终止。这种情况对用户体验极其不利,因此开发者必须熟练掌握处理这类异常的技术。本文将深入探讨iOS App闪退异常的...

    iOS开发 常见的崩溃闪退原因(12点)1

    总结,通过理解这些常见崩溃原因,开发者可以更好地预防和解决iOS应用中的问题。使用如腾讯Bugly或友盟等错误收集工具,可以帮助监控应用在真实环境中的表现,及时发现并修复问题,提高应用质量。

    ios Crash闪退日志获取和上传至服务器

    在iOS应用开发中,处理和分析Crash日志对于优化用户体验和提高软件稳定性至关重要。"ios Crash闪退日志获取和上传至服务器"这个话题涵盖了以下几个关键知识点: 1. **Crash日志概述**:当iOS应用程序因某种原因无法...

    iOS利用运行时处理闪退

    在iOS开发中,遇到应用程序崩溃(闪退)是常见的问题,尤其在运行时。iOS的运行时系统(Objective-C Runtime)提供了一套强大的工具来帮助开发者处理这些问题。本篇文章将详细探讨如何利用运行时来避免iOS应用的闪退...

    Flutter项目在 iOS14 启动崩溃的解决方法

    下面看下Flutter项目在 iOS14 启动崩溃的问题及解决方法 崩溃现象 在iOS14发布之后,运行APP就出现闪退,和机型没关,只要是iOS 14就必闪退 崩溃分析 1、启动就闪退,多起几次可能有一次没有问题。 2、启动后到某个...

    iOS防崩溃及闪退demo

    "iOS防崩溃及闪退demo"提供了一个实际的示例,帮助开发者理解和实施有效的错误处理策略,以减少应用在运行时出现问题的概率。下面我们将深入探讨这个领域的关键知识点。 1. **异常处理**:在iOS中,主要通过...

    jsonkit 支持ios9 ,完美解决 ios9 奔溃问题

    在 iOS 9 发布之前,由于系统版本的更新和 API 的变动,许多开发者在使用 JSON 解析时遇到了崩溃的问题。JSONKit 的出现,旨在提供一个兼容性良好的解决方案,特别是在面对 iOS 9 的崩溃问题时,它表现出了强大的...

    iOS App连续闪退时上报crash日志的方法详解

    总结来说,处理iOS App连续闪退的crash日志上报涉及多个层面,包括保证crash handler的稳定性、识别连续闪退以及确保日志安全上传。开发者需要综合运用各种策略和技术,以提供更健壮的App并及时解决问题。通过不断...

    iOS 拦截奔溃 使程序不在崩溃

    总的来说,通过异常处理、Runloop观察和第三方库,开发者可以在iOS应用程序中有效地拦截和处理奔溃,提高用户体验,同时也有利于快速定位和修复问题。这不仅对用户友好,也有助于提升应用的整体质量。

    IOS10 相册相机闪退bug解决办法

    当你尝试在运行iOS10系统的设备上调用相机或者相册功能时,如果Info.plist文件中缺少上述的权限声明,系统会阻止应用的访问请求,并可能导致应用崩溃,表现为“闪退”。用户通常会在应用试图打开相机或相册时看到...

    iOS实现保护APP不闪退

    "iOS实现保护APP不闪退"这个话题关注的就是如何有效地预防和处理APP的意外崩溃,以提供更好的用户体验。CocoaPods是一个广泛使用的iOS依赖管理工具,通过它我们可以方便地引入第三方库来增强APP的功能。在本例中,...

    cocos2d搓牌实例-lua代码(完美运行安卓和ios,解决ios崩溃问题)

    此cocos2d的lua代码搓牌和网上的有些差别。网上一大堆安卓lua代码搓牌,但是都有一个问题。ios上运行就会崩溃。但是我这个代码彻底解决ios崩溃问题。完美运行。具体在initCardVertex()函数里面。

    Flutter项目在 iOS14 启动崩溃.md

    针对Flutter项目,运行在iOS14以上系统,莫名崩溃问题的解决。

    iOS异常捕获和崩溃日志

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

    ios-iOS捕获崩溃日志.zip

    当应用出现崩溃时,开发者需要能够及时捕获并分析崩溃日志,以便定位问题并修复。"ios-iOS捕获崩溃日志.zip"这个压缩包提供了相关的解决方案,尤其是对于Swift项目。 首先,描述中提到的Swift扩展库——...

    swift-XXShield实现防止iOSAPPCrash和捕获异常状态下的崩溃信息

    这个框架可以帮助开发者构建更健壮的应用,及时发现和处理可能导致崩溃的问题,从而有效降低APP的Crash率。 Swift-XXShield的核心功能包括: 1. **异常捕获与处理**:通过在代码中添加全局异常处理器,XXShield...

    cordova扫码插件phonegap-plugin-barcodescanner,修复了在ios10上面的内存泄漏导致的闪退bug

    在iOS 10上,用户报告了使用此插件时遇到的问题,主要表现为内存泄漏,最终可能导致应用突然退出(闪退)。内存泄漏是编程中的常见问题,当程序无法释放不再使用的内存时,会导致系统资源耗尽,影响应用的稳定性和...

Global site tag (gtag.js) - Google Analytics