一次由图片引起的致命崩溃问题

上周项目上线后出现一个奇怪的线上崩溃问题,写篇文章记录一下。

问题

系统为iOS9.0.2、iOS9.1、iOS9.2、iOS9.2.1的iPhone,通过App Store下载的,一启动程序就会闪退,但是在模拟器上或者真机debug模式相同系统版本的情况下也不会闪退。我们的项目环境为:Xcode9、Objective-C、Target iOS8.0及以上。

日志

下面列举几个常见的日志:

1、UIKit: -[UINibStringIDTable lookupKey:identifier:] + 132

	UIKit: -[UINibStringIDTable lookupKey:identifier:] + 132

UINibStringIDTable
2、UIKit: UINibDecoderDecodeObjectForValue + 788

UIKit: UINibDecoderDecodeObjectForValue + 788

UINibDecoderDecodeObjectForValue
3、CoreUI: -[CUIStructuredThemeStore renditionWithKey:usingKeySignature:] + 1600

CoreUI: -[CUIStructuredThemeStore renditionWithKey:usingKeySignature:] + 1600

CoreUI: -[CUIStructuredThemeStore renditionWithKey:usingKeySignature:] + 1600
4、libcache.dylib: _entry_get_optionally_checking_collisions + 164

libcache.dylib: _entry_get_optionally_checking_collisions + 164

libcache.dylib: _entry_get_optionally_checking_collisions + 164
5、FrontBoardServices: -[FBSSerialQueue _performNext] + 192

FrontBoardServices: -[FBSSerialQueue _performNext] + 192

FrontBoardServices: -[FBSSerialQueue _performNext] + 192
6、QuartzCore: CA::Context::commit_transaction(CA::Transaction*) + 340

QuartzCore: CA::Context::commit_transaction(CA::Transaction*) + 340

QuartzCore: CA::Context::commit_transaction(CA::Transaction*) + 340

解决

经网上查阅资料,发现Apple Developer Forums 上有一个跟我们近乎一样的问题(Crashes on iOS 9.0.2, 9.2 and 9.2.1)线上IPA包的图片资源中有3张图片的DisplayGamut是P3形式的(kCGColorSpaceDisplayP3是iOS9.3及以后才支持)。按如下几步操作即可解决:
1、导出线上IPA包,找到其中的Assets.car文件。
2、利用assetutil命令行工具将Assets.car文件导出为json格式,在终端进入Assets.car文件所在的文件夹下输入以下命令:

	sudo xcrun --sdk iphoneos assetutil --info Assets.car > Assets.json

3、打开第二步生成的Assets.json文件,查找DisplayGamut或者ARGB-16,包含此类信息的图片就是这次闪退问题的罪魁祸首了。替换一下对应的图片重新打包发布即可。
Assets.json

尾声

虽然及时解决了这个崩溃问题,但是今天回头又看了下,发现网上有个类似的问题(Release版本只在iOS9.2及以下闪退),对比了下,又稍微有些区别——原博主的是显示的图片格式问题,而我们项目中的却不是。PS:原博文介绍了另一种通过脚本处理所有图片格式的方法,本文就不列出了。我们有三张问题图片:
DisplayGamut
但是在Xcode中查看Color Space是正常的,如下所示:
flash_on

flash_off
然后对比了正常图片的Color Space也是sRGB IEC61966-2.1。因此,给本人带来一个疑惑,有待进一步证实~

补充说明

国庆假后得知业出现了很多类似问题,不过是Xcode10的bug,Apple也给出了回应,Xcode10.1会解决这个bug。
Asset Catalog
解决方案可以参考高老师很忙的微博: 解决Xcode10打包iOS9.0-iOS9.2.1Crash的问题

参考资料

[1]、Crashes on iOS 9.0.2, 9.2 and 9.2.1
[2]、App crashes as release build on iPad/iPhone 6-iOS 9.2 - but debugging is fine
[3]、App crashes immediately on start up… Crash in iOS9 on release only through TestFlight or Store. Distributed with Xcode 8
[4]、Release版本只在iOS9.2及以下闪退

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PCIe是一种计算机硬件接口标准,用于连接计算机主板和其他外部设备,例如显卡、网卡和存储设备。在PCIe的使用过程中,可能会出现不可修复的错误,这些错误可以分为致命和非致命错误两种情况。 致命错误指的是当PCIe发生严重故障或出现不可修复的错误时,它将导致连接的设备无法正常工作。这种情况下,计算机系统可能会崩溃或故障,必须重新启动系统才能恢复正常运行。致命错误可能由于硬件故障、电源问题或者连接不良等原因造成。 非致命错误是指在PCIe连接过程中出现的一些较小的问题,这些问题可以通过重新插拔设备或重新启动系统来解决。非致命错误可能包括连接不良、数据传输错误等。虽然非致命错误不会导致系统完全崩溃,但它们可能会对系统的性能和稳定性产生一定的影响。 需要注意的是,对于PCIe不可修复的错误,我们无法通过简单的软件修复来解决问题,而是需要进行硬件的检修或更换。因此,在使用PCIe接口的设备时,我们应该定期检查设备的连接状态,及时发现并解决可能存在的问题,以确保系统的正常运行和稳定性。 总的来说,PCIe不可修复的错误可能是致命的或非致命的,致命错误会导致系统崩溃,而非致命错误则可能会降低系统性能。对于这些错误,我们应该重视其出现的原因,并采取适当的措施来防止其发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值