项目中疑难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栈如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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信息中的一些字段,或许别人也有遇到过相同或者相似的问题,说不定得到启发从而解决了一个看似没法解决的问题。

时间: 2024-10-15 13:17:17

项目中疑难Crash问题集锦的相关文章

iOS:项目中疑难Crash问题集锦

项目中疑难Crash问题集锦 iOS App运行中遇到Crash的情况相信大家都遇到过,开发和者测试中遇到了可能很方便的办法就是直接拿着设备连接一下,然后使用Xcode自带的工具就可以解析出Crash地址了.对于线上App运行时的Crash收集也有很多好用的第三方工具,具有代表性的就是Crashlytics,通过打包时上传dSYM文件,收集到的Crash就可以解析为可读的格式了. 尽管Crashlytics功能已经很强大了,统计出来的Crash信息也足够详细,还是会有一些难缠的问题,例如程序直接

Android在项目中接入腾讯TBS浏览器WebView的教程与注意的地方

腾讯TBS浏览器服务 我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug.这时候腾讯老哥站出来了,搞了一个TBS浏览器服务这个东西. 说得这么屌,其实就是一个webView控件,然后解析解析网页的内核是他自己做的,叫X5内核(系统原生的WebView用的是WebKit内核),所以我们开发者用的时候,主要就是用这个com.tencent.smtt.sdk.WebView控件 当然这个控件有很多功能,当然也有些要注意的地方. 官网地址:http

检测项目中的循环引用引起的内存问题

说到检测项目中的循环引用 可以有很多手段,其中牛叉的 instruments 当然是把利器. 当然开发过程中往往会大意引起的 循环引用 比如:忘写了 @weakify(self) && @strongify(self); 在大量使用RAC 和 block..... 当然引起这类原因还有很多... 如果分工明确的话可能会再项目结束后,专门测试这块...然而好像并不是每次迭代都会做这块的工作,除非被明确发现引起崩溃的情况. so  要是能把这个工作引入debug 期间,如果引起循环引用 可以抛

现有项目中集成Flutter

本文列举了项目开发使用Flutter会遇到的问题,以及如何使用Flutter module在现有项目中集成Flutter,并对其原理进行了分析. 最近在做的一个商业项目,完全的使用Flutter编写的,这其中的坑,只有写过的人才能体会到. 1. 纯Flutter项目的问题 在论述纯Flutter项目问题之前,我先表述下我的观点(仅限于纯Flutter项目,目前时间2018年6月26日,不排除Flutter的发展,让我的观点改观): 对于个人开发者,可以使用纯Flutter去开发App尝鲜: 对于

用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中

我最近在用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中,第一次写项目,写过这类项目的多多提意见,哪方面的意见都行,有代码或者demo的求赏给我,谢谢

DotNet项目中的一些常用验证操作

在项目中需要对用户输入的信息,以及一些方法生成的结果进行验证,一般在项目中较多的采用js插件或js来进行有关信息的校验,但是从项目安全性的角度进行考虑,可对系统进行js注入. 如果在后台对用户输入的信息进行验证会相对的安全,在出现信息验证不合法时,可以直接在程序中抛出异常,终止程序的运行. 现在提供几种较为常用的验证方法,可以减少在项目中开发时间和错误性: 1.判断域名:         /// <summary>         /// 普通的域名         /// </summ

javaWeb项目中如何实现在线查看pdf文件

最近有需求要实现在网页直接查看pdf,word,excel文件.但是实际当中并没有很好的开源插件供我们使用,确实有一些付费的插件不错,也很好用,但是对于我来说都不适合. 现在只是单纯的找到了围魏救赵的方法. 就是先实现显示pdf文件,其他文件用别的方式去转成pdf.虽然这个方法确实不好,但是也是没有办法的办法了,如果以后能有更好的,那就再发布别的吧. 这里我就直接介绍pdf的显示方法. 直接上干货. 首先在E:\tomcat8\webapps这个目录下面拷贝下面这个文件 http://yunpa

Python+Selenium进行UI自动化测试项目中,常用的小技巧2:读取配置文件(configparser,.ini文件)

在自动化测试项目中,可能会碰到一些经常使用的但 很少变化的配置信息,下面就来介绍使用configparser来读取配置信息config.ini 读取的信息(config.ini)如下: [config]platformName=AndroidappPackage=com.sheinsideappActivity=.module.GuideActivitybaseUrl=http://0.0.0.0:4723/wd/hubfindElementTimes=10[cmd]openAppium=nod

团队项目中个人的定位及计划

我们团队在这一次的移动APP开发计划中准备做一个针对上海地区大学分数线进行专业推荐的APP,根据前几章的学习,团队中的成员将会被初步分为开发人员.测试人员以及PM(program manager).我在这次的软件开发中担任开发人员的职务. 在开发开始的阶段,全员首先一起明确这次APP的主题,一起分析好这款APP将要实现怎样的功能,将要面向哪些受众:对于市面上的同类软件,我们还能添加哪些实用的功能.首先将会尽可能地将上海地区内高校近几年的分数线.每个系的最低录取分数统计好录入系统中,再根据考生相应