如何修复 Swift 5 上的 'outlined consume of Model?' 运行时崩溃
How to fix 'outlined consume of Model?' runtime crash on Swift 5
我刚刚将我的一个应用程序升级到 Swift 5,我根本没有做太多更改,似乎没有任何问题,所以我只是在生产中发布它(幸运的是分阶段发布)。
1 天后,我开始在 Crashlytics 上看到一个非常奇怪的崩溃,影响了 15% 的使用我的应用程序的人。
这是堆栈跟踪:
Crashed: com.apple.main-thread
0 (Missing) 0x31698aa1503e0 (Missing)
1 libswiftCore.dylib 0x1afa5ac68 _swift_release_dealloc + 28
2 App 0x104194c3c outlined consume of MyModel? + 4300033084
3 App 0x104482cb8 @objc MyController.__ivar_destroyer (<compiler-generated>)
4 libobjc.A.dylib 0x180f267cc object_cxxDestructFromClass(objc_object*, objc_class*) + 148
5 libobjc.A.dylib 0x180f366b8 objc_destructInstance + 68
6 libobjc.A.dylib 0x180f36720 object_dispose + 16
7 UIKitCore 0x1ae2edac0 -[UIResponder dealloc] + 152
8 UIKitCore 0x1add173e0 -[UIViewController dealloc] + 1748
9 App 0x10431d82c BaseViewController.__deallocating_deinit (MyController.swift:56)
10 App 0x10431d85c @objc BaseViewController.__deallocating_deinit (<compiler-generated>)
11 libobjc.A.dylib 0x180f41b9c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 672
12 CoreFoundation 0x181d59f40 _CFAutoreleasePoolPop + 28
13 CoreFoundation 0x181cd8e00 __CFRunLoopRun + 1932
14 CoreFoundation 0x181cd8354 CFRunLoopRunSpecific + 436
15 GraphicsServices 0x183ed879c GSEventRunModal + 104
16 UIKitCore 0x1ae2c3b68 UIApplicationMain + 212
17 App 0x104108468 main (AppDelegate.swift:21)
18 libdyld.dylib 0x18179e8e0 start + 4
我已经在网上搜索了一些东西,但我在 Swift 论坛上只找到了一个与此不太相关的帖子。
MyModel其实是一个struct model,嵌套在另一个Model中。
MyController 是管理模型的非常大的控制器。
弹出控制器时崩溃似乎很明显,因此当系统尝试解除分配所有相关属性时。
我试了很多次都没有结果,我真的不知道从哪里开始看。
有人遇到同样的问题吗?
更新[部分修复]:
它似乎是由广告框架引起的堆栈损坏,为了解决这个问题,我将 MyModel 从 Struct 移动到 Class,它现在在堆上并且无法被双重释放。
根据我的经验,大多数 outlined consume of
错误都是由并发问题引起的。当一个 queue/thread 读取结构而另一个 queue/thread 在没有同步的情况下修改它(互斥锁、信号量、屏障等)时。
您需要检查所有线程堆栈以查看哪个线程访问 MyModel
与主(崩溃)线程同时访问。
我刚刚将我的一个应用程序升级到 Swift 5,我根本没有做太多更改,似乎没有任何问题,所以我只是在生产中发布它(幸运的是分阶段发布)。 1 天后,我开始在 Crashlytics 上看到一个非常奇怪的崩溃,影响了 15% 的使用我的应用程序的人。
这是堆栈跟踪:
Crashed: com.apple.main-thread
0 (Missing) 0x31698aa1503e0 (Missing)
1 libswiftCore.dylib 0x1afa5ac68 _swift_release_dealloc + 28
2 App 0x104194c3c outlined consume of MyModel? + 4300033084
3 App 0x104482cb8 @objc MyController.__ivar_destroyer (<compiler-generated>)
4 libobjc.A.dylib 0x180f267cc object_cxxDestructFromClass(objc_object*, objc_class*) + 148
5 libobjc.A.dylib 0x180f366b8 objc_destructInstance + 68
6 libobjc.A.dylib 0x180f36720 object_dispose + 16
7 UIKitCore 0x1ae2edac0 -[UIResponder dealloc] + 152
8 UIKitCore 0x1add173e0 -[UIViewController dealloc] + 1748
9 App 0x10431d82c BaseViewController.__deallocating_deinit (MyController.swift:56)
10 App 0x10431d85c @objc BaseViewController.__deallocating_deinit (<compiler-generated>)
11 libobjc.A.dylib 0x180f41b9c (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 672
12 CoreFoundation 0x181d59f40 _CFAutoreleasePoolPop + 28
13 CoreFoundation 0x181cd8e00 __CFRunLoopRun + 1932
14 CoreFoundation 0x181cd8354 CFRunLoopRunSpecific + 436
15 GraphicsServices 0x183ed879c GSEventRunModal + 104
16 UIKitCore 0x1ae2c3b68 UIApplicationMain + 212
17 App 0x104108468 main (AppDelegate.swift:21)
18 libdyld.dylib 0x18179e8e0 start + 4
我已经在网上搜索了一些东西,但我在 Swift 论坛上只找到了一个与此不太相关的帖子。
MyModel其实是一个struct model,嵌套在另一个Model中。 MyController 是管理模型的非常大的控制器。
弹出控制器时崩溃似乎很明显,因此当系统尝试解除分配所有相关属性时。
我试了很多次都没有结果,我真的不知道从哪里开始看。
有人遇到同样的问题吗?
更新[部分修复]: 它似乎是由广告框架引起的堆栈损坏,为了解决这个问题,我将 MyModel 从 Struct 移动到 Class,它现在在堆上并且无法被双重释放。
根据我的经验,大多数 outlined consume of
错误都是由并发问题引起的。当一个 queue/thread 读取结构而另一个 queue/thread 在没有同步的情况下修改它(互斥锁、信号量、屏障等)时。
您需要检查所有线程堆栈以查看哪个线程访问 MyModel
与主(崩溃)线程同时访问。