`
jiangmq100083
  • 浏览: 10806 次
  • 性别: 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;

 

}

 

 

 

 

分享到:
评论

相关推荐

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

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

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

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

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

    1. 字典的key或value为nil,字典的key只要为nil任何写法定会崩, 2. 数组越界 3. 内存溢出或泄露,分为下个 4. 遍历数组时,对数组进操作

    iOS防崩溃及闪退demo

    此demo在iOS的app发生崩溃或闪退时弹出alertView提示发生可能引起崩溃的原因,便于开发者调试!

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

    iOS 拦截奔溃 使程序不在崩溃 使用Runloop起死回生 拦截崩溃信息 传到服务器

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

    这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人员定位问题很有帮助。 为保障线上 App 的用户体验,我们一般都会对线上 App 的 crash 率做实时...

    iOS实现保护APP不闪退

    iOS实现保护APP不闪退 可以通过 cocoapods 引入 pod 'JJException' 附件为使用 Dome

    iOS异常捕获和崩溃日志

    iOS异常捕获和崩溃日志 欢迎关注 http://blog.csdn.net/u014220518/article/details/53522239

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

    iOS10系统下调用系统相册、相机功能,遇到闪退的情况,描述如下: This app has crashed because it attempted to access privacy-sensitive data without a usage description.The app's Info.plist must contain ...

    ios-iOS捕获崩溃日志.zip

    捕获崩溃; 推荐给大家一个swift扩展库,支持cocoapods,地址:https://github.com/CoderZCC/ZCategoryTool, 欢迎Star

    iOS 捕获程序崩溃日志

    我们常常会遇到iPhone手机或者iPad平板上运行APP崩溃的问题,有时候打开某个APP,却一下子“闪退”了。对于开发者来说,这个绝对是头疼的问题。那么如何获取到iOS设备崩溃日志呢?这个提供一些简单的方法,共开发者...

    解决iOS7上UITextField限制字数输入导致崩溃问题的方法

    但对于系统键盘,联想状态下的输入也会监听,这里如果不处理就容易发生崩溃,例如当快要达到字数限制时,继续输入,此时textField.text =联想输入文字+textField已有文字,当textField.text超过字数限制时,就会截取...

    ios开发中的容错处理示例详解

    一出现这种问题,调试后发现是他们返回null或者是”null”的数据类型,因为是线上的问题,所以让他们直接在后台将出现问题的字段进行处理就好了。久而久之,发现这种处理方式并不可取,觉得应该在app端应该做些容错...

    iOS防crash组件

    WOCrashProtector是一个无侵入的 iOS crash 防护框架,基于 Swizzle Method 的 Crash 防护。能有效的防止代码潜在的crash,自动在app运行时实时捕获导致app崩溃的破环因子,使app避免崩溃,照样可以继续正常运行。

    百度地图毕业设计源码-AppPerformance:App性能监控,包括:CPU占用率、内存占用大小、卡顿、启动闪退、崩溃、耗电量等

    占用率、内存使用情况、网络状况监控、启动时闪退、卡顿、FPS、使用时崩溃、耗电量监控、流量监控等等。 文中所有代码都已同步到中,有兴趣的可以clone 下来一起探讨下。 环境 Xcode 10.0+ Swift 4.2 1 . CPU 占用率...

    ios iphone 崩溃字符记录

    亲测:该错误对邮箱(系统自带app),imessage 无效,微信有效(iphone 7 plus ios13.4.1) 且只会造成微信闪退 解决方法:在微信把那条信息下发一条信息,导致微信打开的时候不会加载到上面的信息造成崩溃就行了

    防止崩溃的措施

    一款提高iOS稳定性,有效防止闪退的框架,那么iOS中会有很多引起crash,比如最常见的数组越界,添加空值。

    【iOS问题分析:在iPad运行的时候手写输入的时候会crash】 touchesBegan:(NSSet *)touches withEvent

    iPad 会发生闪退 ,然而无法在iPhone重现。 最终定位是因为执行了一些废弃的代码。这代码里面将一个空的按钮对象设置图片。 导致这样的问题,是因为之前的同事代码删除的只是删除了一半,注释了赋值代码,却没有注释...

    ShareSDK造成App崩溃的一个BUG原因分析以及Fix方法

    近期研究了一下Game App做社交分享,...按照文档中描述的步骤进行的相对顺利,在各个社交平台的appkey生效后,我们对demo app进行了测试,居然发现app经常随机性的崩溃,有时甚至是每次都崩溃,经过深入分析,发现这是S

    嗒嗒助手 v1.1.0.18.zip

    先是导致部分iPhone/ipad升级激活失败变砖,紧接着又曝出了在Safari及其他应用中轻点链接会造成应用不响应甚至崩溃的问题,后者是直接促使苹果火速推送iOS9.3.1的原因。对于这么一个被bug缠身的系统,避之都不及,更...

Global site tag (gtag.js) - Google Analytics