执行 Swift 库时 iOS 崩溃
Posted
技术标签:
【中文标题】执行 Swift 库时 iOS 崩溃【英文标题】:iOS crash while executing Swift libs 【发布时间】:2015-07-03 21:02:40 【问题描述】:我在一个 Target 上遇到了一系列奇特的崩溃,也发生在针对不同目标的其他设备上。当我尝试象征它时,我在随机代码位置误入歧途:这是崩溃时二进制图像的顶部:
二进制图像:0x73000 - 0x3cafff +inArrivo Express armv7 /var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/inArrivo Express 0x6b9000 - 0x820fff libswiftCore.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftCore.dylib 0x995000 - 0x99cfff libswiftCoreAudio.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftCoreAudio.dylib 0x9ab000 - 0x9b6fff libswiftCoreGraphics.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftCoreGraphics.dylib 0x9cd000 - 0x9d4fff libswiftCoreImage.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftCoreImage.dylib 0x9e4000 - 0x9ebfff libswiftDarwin.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftDarwin.dylib 0x9fc000 - 0x9fffff libswiftDispatch.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftDispatch.dylib 0xa0e000 - 0xa3dfff libswiftFoundation.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftFoundation.dylib 0xa78000 - 0xa7ffff libswiftObjectiveC.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftObjectiveC.dylib 0xa8c000 - 0xa8ffff libswiftSecurity.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftSecurity.dylib 0xa9a000 - 0xaa5fff libswiftUIKit.dylib armv7 /private/var/mobile/Applications/D2AE6804-C6CC-4953-AB14-1C5439420D0F/inArrivo Express.app/Frameworks/libswiftUIKit.dylib
当崩溃发生在这个帧中时:
1 CoreFoundation 0x2f481167 0x2f3e2000 + 651623
2 CoreFoundation 0x2f480d7f 0x2f3e2000 + 650623
3 CoreFoundation 0x2f47f11b 0x2f3e2000 + 643355
4 CoreFoundation 0x2f3e9ebf 0x2f3e2000 + 32447
5 CoreFoundation 0x2f3e9ca3 0x2f3e2000 + 31907
6 GraphicsServices 0x342ef663 0x342e6000 + 38499
7 UIKit 0x31d3614d 0x31cc8000 + 450893
8 inArrivo Express 0x0007dc5d 0x73000 + 44125
9 libdyld.dylib 0x3a173ab7 0x3a172000 + 6839
跟踪程序几乎毫无价值,因为崩溃确实是随机发生的。会是什么?
Xcode 崩溃报告比 QuincyKit 更精确一些,并且总是报告:
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION as in:
线程 0: 0 ??? 0000000000 0 + 0 1 核心基础 0x2f481166 CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION + 14 2 CoreFoundation 0x2f480d7e __CFRunLoopDoTimer + 782 3 CoreFoundation 0x2f47f11a __CFRunLoopRun + 1210 4 核心基础 0x2f3e9ebe CFRunLoopRunSpecific + 522 5 CoreFoundation 0x2f3e9ca2 CFRunLoopRunInMode + 106 6 图形服务 0x342ef662 GSEventRunModal + 138 7 UIKit 0x31d3614c UIApplicationMain + 1136 8 inArrivo Express 0x000dbbdc 0xd1000 + 43996 9 libdyld.dylib 0x3a173ab6 开始 + 2
线程 1 崩溃:0 libsystem_kernel.dylib 0x3a216808 kevent64 + 24 1 libdispatch.dylib 0x3a162de8 _dispatch_mgr_invoke + 228 2 libdispatch.dylib 0x3a151f6e _dispatch_mgr_thread$VARIANT$up + 34
在我的应用程序的线程上,即使崩溃发生在另一个线程上。
【问题讨论】:
【参考方案1】:崩溃似乎是由于在前一个会话终止之前调用了一个新的数据任务。我通过尝试并删除特定于目标的所有代码来尝试错误。 Apple 表示崩溃发生在 Swift 中更接近于 Objective-c 的问题,但它似乎回到了 C 悬空指针的时代!这就是 90 年代计算机科学和 php 编程经验脱颖而出的地方!请 Apple 注意 Swift 应该是未来 20 年的 21 世纪语言,并且运行时支持应该随之而来。
【讨论】:
以上是关于执行 Swift 库时 iOS 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
Crashlytics iOS - 第 0 行崩溃 - Swift 来源
iOS Swift:deleteRowsAtIndexPaths 崩溃 [重复]
.task 崩溃 - Swift 5.5 (iOS 15 Beta 5)