【问题标题】:iOS 9 Crashing in _prepareForCAFlush with EXC_BAD_ACCESS KERN_INVALID_ADDRESSiOS 9 在 _prepareForCAFlush 中使用 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 崩溃
【发布时间】:2015-12-18 13:52:15
【问题描述】:

随着 iOS 9 的发布,我们看到了几份崩溃报告,这似乎是 Apple 在 iOS 9 中的一个错误。这种情况发生在各种设备类型(iPhone、iPad 和 iPod)上。我正在寻找为什么会发生这种情况,以及我是否可以采取任何措施来解决它。这个堆栈是通过我们的崩溃报告系统(Crashlytics)报告的,所以很遗憾我没有可重现的步骤或代码,但我会尽我所能回答任何问题。堆栈如下:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x34a27ad6 objc_msgSend + 21
1  CoreFoundation                 0x230d3db9 -[__NSArrayM dealloc] + 148
2  libobjc.A.dylib                0x34a34f67 objc_object::sidetable_release(bool) + 150
3  libobjc.A.dylib                0x34a353a9 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 388
4  CoreFoundation                 0x230cbfa9 _CFAutoreleasePoolPop + 16
5  UIKit                          0x27523cd9 _prepareForCAFlush + 312
6  UIKit                          0x2752886b _beforeCACommitHandler + 10
7  CoreFoundation                 0x2317a509 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
8  CoreFoundation                 0x2317880d __CFRunLoopDoObservers + 280
9  CoreFoundation                 0x23178c3f __CFRunLoopRun + 958
10 CoreFoundation                 0x230cc249 CFRunLoopRunSpecific + 520
11 CoreFoundation                 0x230cc035 CFRunLoopRunInMode + 108
12 GraphicsServices               0x2c182ad1 GSEventRunModal + 160
13 UIKit                          0x272e18a9 UIApplicationMain + 144
14 APPNAMEHERE                    0x000ec967 main (main.m:14)

【问题讨论】:

  • 这里有类似的问题。您使用什么分析提供商?
  • Yerk,我们使用谷歌分析来处理应用事件等。以及用于报告崩溃的 Twitter Fabric Crashlytics。
  • 好像是Crashlytics的一个bug:stackoverflow.com/a/31016107/4975761

标签: ios iphone ipad ios9


【解决方案1】:

对我来说,问题是当应用程序最小化时我正在显示和关闭键盘。

[self.textView becomeFirstResponder];
[self.textView resignFirstResponder];

我在 applicationWillResignActive 事件上执行了上述代码。 删除此代码修复了崩溃。

【讨论】:

    【解决方案2】:

    我们遇到了具有类似堆栈跟踪的崩溃,经过长时间的调查,我们发现它与另一个崩溃有关;修复它也解决了这个问题,但是我仍然不确定这两个崩溃是如何相关的。

    以下是其他崩溃的详细信息:

    我们在其中一个方法中调用了函数,例如

    AudioServicesAddSystemSoundCompletion(self.soundID,  
                                          [[NSRunLoop currentRunLoop] getCFRunLoop],  
                                          kCFRunLoopDefaultMode,  
                                          AudioServicesSystemSoundCompletion,  
                                          (void *)CFBridgingRetain(self)); 
    

    AudioServicesSystemSoundCompletion 的样子

    void AudioServicesSystemSoundCompletion(SystemSoundID ssID,  void *clientData) {  
         AudioServicesRemoveSystemSoundCompletion(ssID);  
         CFRelease(clientData);  
    }
    

    同时执行该函数调用两次或更多次会导致应用崩溃。我们通过传递 NULL 而不是 (void *)CFBridgingRetain(self) 并删除 CFRelease(clientData); 来解决此问题。行。

    自此修复以来,我们不再看到“_prepareForCAFlush”崩溃。

    另请注意,根据 Crashlytics 的说法,每次崩溃重现时,设备的内存使用率都非常高。

    希望这会有所帮助!

    【讨论】:

    • 我们正在围绕您在此提出的建议测试一些理论,如果成功,我会通知大家。我们没有做任何与您在这里完全一样的事情,但确实在我们的某些代码中似乎在错误的时间发布了某些内容,这可能是原因。感谢您的回复,我希望在大约一周内有明确的结果。
    • 更新。到目前为止,我们的修复尝试仍未解决问题。我们尝试过的事情可能对一些人有所帮助,但并不显着。我打赌某些东西正在“泄漏”,这是在尝试清理东西时发生的崩溃。不知道如何找出是什么或为什么....
    • 现在呢?我们遇到了同样的问题,我不知道是什么原因造成的。
    • 大家好,你知道了吗?
    【解决方案3】:

    我也面临这个问题,我认为我找到了可能导致它的原因。 你们有机会使用 SDWebImage 吗? 因为那是我发现 CFRunLoopRun() 被调用并且其他人抱怨的唯一地方: Dead thread ticket -> App Crash

    【讨论】:

      【解决方案4】:

      似乎只影响配备 32 位处理器 A5 和 A6 的设备 - iPod 5th Gen、iPhone 4S/5/5C、iPad 2/Mini)。 我们这边也没有复制品。 这些崩溃开始并随着 iOS 9 的发布和采用而加剧。 iOS v9.0.1 似乎没有修复它。

      【讨论】:

      • 根据 Fabric,40% 的崩溃属于 iPhone 6,25% 属于 iPhone 6 plus
      • 只是为了确认,它也是 64 位的,因为我们有很多 iPhone 6 和 6 plus 也出现了这种崩溃。还在想办法……
      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 2023-03-23
      • 1970-01-01
      • 2015-04-17
      • 2021-08-31
      • 2014-07-13
      • 2021-09-29
      • 1970-01-01
      相关资源
      最近更新 更多