项目中疑难Crash问题集锦

  

  iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash地址了。对于线上App运行时的Crash收集也有很多好用的第三方工具,具有代表性的就是Crashlytics,通过打包时上传dSYM文件,收集到的Crash就可以解析为可读的格式了。

  尽管Crashlytics功能已经很强大了,统计出来的Crash信息也足够详细,还是会有一些难缠的问题,例如程序直接就挂在main函数中,剩下的就是系统的调用了。下面就聊了一下我们App中遇到的几个难缠的Crash:

1、多次弹出AlertView时存在的问题

在我们App中有一些地方因为业务会弹出一些二次确认框,当弹出AlertView时切换到后台,接着再切到前台,快速点击触发二次确认操作,会再弹出一个AlertView,此时点击该AlertView后,之前已经弹出的AlertView会恢复出来,再点击程序就会Crash掉。在iPhone采用相同步骤验证该问题,发现无法重现,每次程序切回前台时,AlertView现场迅速恢复,由此可见该问题是iPad上才会存在。

正常情况下程序退到后台时,系统会自动隐藏AlertView,等到下次程序切换到前台时,如果退出前弹出了AlertView,系统会恢复该AlertView的展示。问题就出现在这儿,系统恢复AlertView的展示时是有延迟的,而非立即恢复。在此时如果再触发先关时间,弹出新的AlertView,就会损坏中断的现场,从而导致程序运行状态出现异常,之后再操作可能就会Crash掉。

这个问题当时想到了两种解决办法:

a、在程序退到后台之前就对弹出层做默认操作

b、程序中设置标志,标识当前是否已经弹出AlertView,如果已经弹出,再操作时就不会再弹出AlertView

第一种方法,会存在一些问题,因为有些界面的AlertView弹出以后,点击默认操作可能会影响view层级,这样从后台再回来的时候现场界面发生变化,会给用户造成不必要的困惑。

第二种方法,在Apps的基类里面添加一个标记位,弹出AlertView时置为YES,关闭AlertView时置为NO。当前App如果已经弹出了AlertView,则后续操作不再触发弹出AlertView的操作,这样就能避免程序从后台切回来时快速点击导致的Crash问题。

2、webview动画引发的Crash问题

在执行自动化测试过程中,不规律的出现了几次Crash,无法找到固定的重现步骤,Crash栈如下:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000008
Crashed Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x390b15b0 objc_msgSend + 16
1 UIKit 0x33289182 -[_UIWebViewScrollViewDelegateForwarder forwardInvocation:] + 138
2 CoreFoundation 0x31218616 ___forwarding___ + 622
3 CoreFoundation 0x3116ff64 _CF_forwarding_prep_0 + 20
4 UIKit 0x330d40c2 -[UIScrollView _getDelegateZoomView] + 98
5 UIKit 0x330d3fc0 -[UIScrollView _zoomScaleFromPresentationLayer:] + 24
6 UIKit 0x330d9fec -[UIWebDocumentView _zoomedDocumentScale] + 56
7 UIKit 0x330d6ae8 -[UIWebDocumentView _layoutRectForFixedPositionObjects] + 100
8 UIKit 0x3327b292 -[UIWebDocumentView _updateFixedPositionedObjectsLayoutRectUsingWebThread:synchronize:] + 38
9 UIKit 0x330dc6d4 -[UIWebDocumentView _updateFixedPositioningObjectsLayoutAfterScroll] + 24
10 UIKit 0x330dc6b0 -[UIWebBrowserView _updateFixedPositioningObjectsLayoutAfterScroll] + 52
11 UIKit 0x330dc566 -[UIWebDocumentView _restoreScrollPointForce:] + 502
12 UIKit 0x330dc25c -[UIWebDocumentView _resetForNewPage] + 408
13 UIKit 0x330a84c4 -[UIWebDocumentView layoutSubviews] + 72
14 UIKit 0x330217fe -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 254
15 QuartzCore 0x32dcbd86 -[CALayer layoutSublayers] + 210
16 QuartzCore 0x32dcb924 CA::Layer::layout_if_needed(CA::Transaction*) + 456
17 QuartzCore 0x32dcc858 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 12
18 QuartzCore 0x32dcc23e CA::Context::commit_transaction(CA::Transaction*) + 234
19 QuartzCore 0x32dcc04c CA::Transaction::commit() + 312
20 UIKit 0x330278e6 _afterCACommitHandler + 122
21 CoreFoundation 0x311eb6ca __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
22 CoreFoundation 0x311e99bc __CFRunLoopDoObservers + 272
23 CoreFoundation 0x311e9d12 __CFRunLoopRun + 738
24 CoreFoundation 0x3115ceb8 CFRunLoopRunSpecific + 352
25 CoreFoundation 0x3115cd44 CFRunLoopRunInMode + 100
26 GraphicsServices 0x34d262e6 GSEventRunModal + 70
27 UIKit 0x330722fc UIApplicationMain + 1116
28 MyApp 0x0000fc60 main (main.m:15)
29 libdyld.dylib 0x394edb1c start + 0

  Crash栈咋一看,挂在系统的API调用上,再仔细看一下报EXC_BAD_ACESS错误,应该是对象被释放后导致了野指针调用问题。仔细查看Apps中调用到Webview的地方发现,使用方法没什么问题。网上搜索了一下发现,该问题可能是由于webview在动画中,持有者(VC)已经被释放导致的。

  解决办法:在所有持有Webview的对象释放前都添加了Webview的delegate置空操作。

  在自动化测试中tableview,scrollview也遇到了Webview相似的问题,因此就在程序中相关地方都做了保护处理,之后自动化测试中该类问题没有再出现过。

  一点感想:拿到Crash栈,一看是挂在系统调用,估计就不想花时间解决了。有时候坚持一下,多看一会儿,多想一下,尝试去Google上搜一下Crash信息中的一些字段,或许别人也有遇到过相同或者相似的问题,说不定得到启发从而解决了一个看似没法解决的问题。

注:smileEvday保留本文的一切权利

  转载请著名原文出处

  本文在开发过程中随时更新,欢迎交流

iOS:项目中疑难Crash问题集锦的更多相关文章

  1. ios项目中引用其他项目复习

    ios项目中引用其他开源项目,今天再次复习了,记个备注. 1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Li ...

  2. iOS-C文件添加到iOS项目中,运行报错

    iOS-C文件添加到iOS项目中,运行报错 问题: 往项目中添加一个空的c文件, 编译运行; 出现2,30个编译错误. 原因: 由于在项目中添加了Pch文件,在文件中所有代码还没有开始运行之前, pc ...

  3. iOS项目中常见的文件

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  5. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的“前往”|“前 ...

  6. 在Xamarin.iOS项目中使用预设数据库

    在Xamarin.iOS项目中使用预设数据库 当开发者准备好一个预设数据库文件后,就可以将这个数据库文件添加到创建的项目中了.本节将分别在Xamarin.iOS和Xamarin.Android项目中使 ...

  7. 给iOS项目中添加图片,并通过UIImageView引用和显示该UIImage图片

    [问题] 关于iOS/iPhone中的文件选择对话框,用于用户去选择图片等文件 过程中,问题转换为,需要给当前iOS项目中,添加一个图片. 类似于Windows开发中的资源文件,其中图片文件属于资源的 ...

  8. ios项目中安装和使用CocoaPods

    CocoaPods是什么? http://code4app.com/article/cocoapods-install-usage http://blog.csdn.net/jjmm2009/arti ...

  9. iOS项目中安装和使用 Cocoapods

    1.首先我们要打开我们的终端: 2.在终端输入 这条命令  gem sources -l 2.1如果是和我是一样的显示,则镜像已添加,无需更改,如果不一样,则需要进行更改 这里输出的如果是 https ...

随机推荐

  1. Bzoj2756 [SCOI2012]奇怪的游戏

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3220  Solved: 886 Description ...

  2. Linux Hackers/Suspicious Account Detection

    catalog . Linux黑客帐号攻击向量 . Linux可疑帐号检测模型 1. Linux黑客帐号攻击向量 0x1: 将黑客帐号添加到"root"组 . useradd ha ...

  3. Andirod——网络连接(HttpURLConnection)

    Android中使用HTTP协议访问网络的方法主要分为两种: 使用HttpURLConnection 使用HttpClient 本文主要内容是HttpURLConnection的使用. HttpURL ...

  4. AngularJs $resource 高大上的数据交互

    $resource 创建一个resource对象的工厂函数,可以让你安全的和RESFUL服务端进行数据交互. 需要注入 ngResource 模块.angular-resource[.min].js ...

  5. Alpha版本十天冲刺--Day4

    站立式会议 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 解决线程信息传递问题(使用函数回调),Android登录验证接口完善 无 json解析,忘记密码界面验证码获取接口,忘记密码请求 ...

  6. 软件工程个人作业-Week2

    第一部分  调研, 评测 必应词典客户端版本:安卓版5.2.2 bug描述一:在学习页面点击“单词挑战”或“我爱说英语”会弹出“加载失败,请稍后重试”,无论点击多少次都加载不出来. bug描述二:在未 ...

  7. 【Alpha阶段】第二次Scrum例会

    燃尽图软件存在bug,正在排查修复:(已修复)由于时区设置到了美国,图表显示有问题. 会议信息 时间:2016.10.18 22:00 时长:1h 地点:大运村1号公寓5楼楼道 类型:设计阶段阶段性会 ...

  8. wildfly jobss 同时连接多个数据源

    由于需要从一个远程机器取数据.处理后保存到本地数据库处理.用 wildfly datasource 会报: [com.arjuna.ats.arjuna] (default task-6) ARJUN ...

  9. python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...

  10. 9月23日JavaScript作业----用DIV做下拉列表

    例题二.用div做下拉列表 <title>无标题文档</title> <style type="text/css"> *{ margin:0px ...