【问题标题】:Mysterious crash on iOS 8iOS 8 上的神秘崩溃
【发布时间】:2014-09-18 18:18:16
【问题描述】:

我在 iOS 8 上收到了很多带有此堆栈跟踪的崩溃报告:

Date/Time:       2014-09-17T20:26:15Z
OS Version:      iPhone OS 8.0 (12A365)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x1
Crashed Thread:  0

Thread 0 Crashed:
0   libGPUSupportMercury.dylib           0x2a4f88fe gldGetBufferAllocationIdentifiers + 194
1   libGPUSupportMercury.dylib           0x2a4f93cb gpusSubmitDataBuffers + 108
2   libGPUSupportMercury.dylib           0x2a4f9249 gldCreateContext + 206
3   GLEngine                             0x2613c93b gliCreateContextWithShared + 600
4   OpenGLES                             0x26218ab3 glGetFramebufferParameteriAPPLE + 776
5   CoreImage                            0x23e88b8b 0x23dea000 + 650123
6   libdispatch.dylib                    0x314558b7 0x31454000 + 6327
7   libdispatch.dylib                    0x314564fb dispatch_once_f + 60
8   CoreImage                            0x23e88afb 0x23dea000 + 649979
9   CoreImage                            0x23e06c79 0x23dea000 + 117881
10  CoreUI                               0x29478837 CUIEqualRenditionKeysIgnoringAttribute + 71800
11  libsystem_pthread.dylib              0x315b9dcf sched_get_priority_min + 64
12  libsystem_platform.dylib             0x315b2867 _os_once + 40
13  libsystem_pthread.dylib              0x315b7f8b pthread_once + 48
14  CoreUI                               0x294787d9 CUIEqualRenditionKeysIgnoringAttribute + 71706
15  CoreUI                               0x2947faf7 CUIEqualRenditionKeysIgnoringAttribute + 101176
16  UIKit                                0x26f649db _UIGraphicsEndLetterpressWithStyle + 20792
17  UIKit                                0x26cf2875 UIGraphicsEndImageContext + 7838
18  UIKit                                0x26cf1fb5 UIGraphicsEndImageContext + 5598
19  UIKit                                0x26fe3db9 _UINavigationButtonUpdateAccessibilityBackgroundsForBlendMode + 287838
20  UIKit                                0x26cf19c7 UIGraphicsEndImageContext + 4080
21  UIKit                                0x26d8c1b1 UICeilToViewScale + 55778
22  UIKit                                0x26d70143 _UIBarHairlineShadowColorForBarStyle + 10164
23  UIKit                                0x26ce2b37 0x26cd6000 + 52023
24  QuartzCore                           0x2670accd CABackingStoreGetTypeID + 894
25  QuartzCore                           0x267066b5 CARenderServerGetServerPort + 5366
26  UIKit                                0x26cf5183 UIGraphicsGetImageFromCurrentImageContext + 2068
27  UIKit                                0x26cf1fb5 UIGraphicsEndImageContext + 5598
28  UIKit                                0x26d6efc5 _UIBarHairlineShadowColorForBarStyle + 5686
29  UIKit                                0x26d6ec63 _UIBarHairlineShadowColorForBarStyle + 4820
30  UIKit                                0x26d6e3cd _UIBarHairlineShadowColorForBarStyle + 2622
31  UIKit                                0x26fd5a6f _UINavigationButtonUpdateAccessibilityBackgroundsForBlendMode + 229652
32  UIKit                                0x26d6b837 _UIAccessibilityReduceMotion + 16948
33  UIKit                                0x26ce53d9 _UIApplicationLinkedOnOrAfter + 2526
34  UIKit                                0x26ce535d _UIApplicationLinkedOnOrAfter + 2402
35  UIKit                                0x26d6b24d _UIAccessibilityReduceMotion + 15434
36  UIKit                                0x26fd7ef9 _UINavigationButtonUpdateAccessibilityBackgroundsForBlendMode + 239006
37  UIKit                                0x26d6b0b3 _UIAccessibilityReduceMotion + 15024
38  UIKit                                0x26dc516f UIRectIntegralWithScale + 1040
39  Pogoplug                             0x001bccc9 __41-[InitialSlidingViewController didSignIn]_block_invoke (InitialSlidingViewController.m:216)
40  libdispatch.dylib                    0x314558cb 0x31454000 + 6347
41  libdispatch.dylib                    0x314558b7 0x31454000 + 6327
42  libdispatch.dylib                    0x314590bf _dispatch_main_queue_callback_4CF + 720
43  CoreFoundation                       0x2380dbe9 CFRunLoopTimerSetTolerance + 3370
44  CoreFoundation                       0x2380c2e9 _CFRunLoopGet2b + 2926
45  CoreFoundation                       0x2375a621 CFRunLoopRunSpecific + 474
46  CoreFoundation                       0x2375a433 CFRunLoopRunInMode + 104
47  GraphicsServices                     0x2ab080a9 GSEventRunModal + 134
48  UIKit                                0x26d44809 UIApplicationMain + 1438
49  Pogoplug                             0x0012c4bf main (main.m:11)
50  libdyld.dylib                        0x31475aaf _tlv_atexit + 8

任何可能出错的线索将不胜感激。 这里是第 216 行

MenuViewController *menuVC = [[MenuViewController alloc] initWithNibName:nil bundle:nil];
NavControllerPortrait *navController = [[NavControllerPortrait alloc] initWithRootViewController:menuVC];

主要在 iPhone 5 和第三代 iPad 上使用(不确定是否仅限于这些设备)。

更多信息 另一个发生频率较低的崩溃具有类似的堆栈跟踪,并且由此代码引起:

CELoginViewController *loginVC = [[CELoginViewController alloc] initWithNibName:nil bundle:nil];
NavControllerPortrait *nav = [[NavControllerPortrait alloc] initWithRootViewController:loginVC];

所以我强烈怀疑我的自定义 UINavigationController 或 Apple 对它的更改。鉴于我不是唯一遇到此崩溃的人 - 我更倾向于责怪 Apple :-)

谢谢。

【问题讨论】:

  • 你没有给我们太多的帮助。我看不出代码有什么问题。它可以在运行 iOS 8 的模拟器中运行吗?如果是这样,那么您唯一的希望就是找到运行 iOS 8 的 iPhone 5 并对其进行测试。
  • 在我的 iPhone 5s / iPad Air 和 iOS 8 上试用过,效果很好,模拟器也一样。
  • @CherpakEvgeny 不幸的是,更改有色图像并没有为我解决这个问题,你能解决你的问题吗?
  • 还不知道 - 如果应用程序已经从后台启动,我已经合并了一些逻辑来推迟创建视图控制器......直到用户打开它,仍然需要部署到生产中看看是否这已经解决了这个问题,因为我无法自己重现它

标签: ios ios8


【解决方案1】:

我没有足够的声誉来评论和询问细节,但是我遇到了同样的问题,主要是在 iPhone 5 上,但也有在 5c、4s、iPad 3 和 iPod 5G 上,我相信我会做的即使没有回答问题,说出来也会很有帮助。

首先,这是当您尝试使用 OpenGL 绘制内容或调整大小或移动 MKMapView 在背景中时发生的崩溃。在您的崩溃日志中可能并不明显,但我收到的每一个崩溃报告都是在应用程序在后台启动时发生的。考虑到 UIViewController 被称为 InitialSlidingViewController,对您来说似乎是一样的。在我的情况下,大部分时间都是“重要位置更新”,但在你的情况下,它可能是“后台获取”或“访问”更新或“静默远程通知”。

我在我的应用程序中注意到的一件事是它在崩溃时正在设置导航栏,更具体地说是尝试渲染图像,我在导航栏中对图像进行了着色。对你来说,这是其他东西,但需要 OpenGL,也许是像视差这样的运动效果,我在堆栈跟踪中看到 _UIAccessibilityReduceMotion?

不管你是什么,或者我在做什么,它在某些设备上发生的频率更高,而在某些设备上从来没有发生过,这意味着它很可能是一个 iOS 错误。我还在堆栈跟踪中看到“CI::can_use_gpu()”,它崩溃是因为它在检查是否可以使用 gpu 时使用 gpu。

那么我们如何防止它崩溃呢?

您可以尝试禁用您正在使用的功能,对我来说,我会用正确颜色的图像替换图像,而不是使用淡色。
或者你可以尝试加载另一个视图控制器,也许只是一个空的视图控制器,当应用程序在后台启动时,当它进入前台时,将视图控制器与你正在使用的视图控制器交换。

【讨论】:

  • 我其实也有同样的怀疑——出于同样的原因,并且有句谚语“伟大的思想者认为是一样的”——所以我想是这样的
  • 感谢@Sjoerd 参考文档,我应该在我的答案中包含该链接,我会相应地更新。问题是 iOS 在内部使用 OpenGL 来完成一些基本任务,这会导致崩溃。我有一个视图控制器,它有一个带有彩色图像的 UIBarButtonItem。我在 viewDidLoad 中设置了这个按钮,并在 applicationDidFinishLaunching 中创建了这个视图控制器 rootViewController。我认为这是一个非常基本的设置来解决这类问题。
【解决方案2】:

Apple 开发者论坛上有关于这种行为的讨论,其中一名 Apple 员工承认这是一个错误:

https://devforums.apple.com/thread/246744?start=0&tstart=0

iOS 8.3 刚刚发布几天,如果我们的崩溃监测是准确的,那么 8.3 很有可能已经修复了这个问题。一旦我们掌握了超过几天的数据,我将更新这个答案。

编辑:经过 Fabric/Crashlytics 一周的崩溃报告后,看起来 8.3 解决了此崩溃的两个来源:一个来自 MapKit,它尝试使用 OpenGL ES 渲染矢量地图图块和/或地图叠加栅格图块在后台,另一个来自 UIKit,它尝试在后台渲染 UITabBar 的标签图像(同样,在后台使用 OpenGL ES)。很想听听其他人的意见。

【讨论】:

  • 酷,谢谢。同时,我添加了代码来解决这个问题,为所有人修复它,而不仅仅是升级到 8.3 的用户
【解决方案3】:

我在一个应用程序上看到了这一点,该应用程序在其中一个选项卡上包含一个 mapKit 视图。据报道,该错误与应用程序在后台运行时在地图上执行的更新有关,我意识到唯一可以更新的是用户位置“闪烁”的蓝点。所以我添加了代码来设置

   self.mapview.showsUserLocation = NO; 

每当应用程序进入后台,并在它变为活动时将其设置为 YES。这似乎已经停止了我的 alpha 测试中的错误。一旦我从 beta 测试中得到结果,我会更新这个。

【讨论】:

  • 仍然从用户那里看到这个崩溃,所以再次深入研究它。堆栈跟踪包括对方法“VKPolygonTileSource TileForData:downloadKey:sourceKey”的调用,所以我想知道在应用程序后台运行时是否正在下载或更新地图图块。一种可能的情况 - 连接不良,因此连接缓慢,地图开始加载,用户通过主页按钮将其设置为背景,地图图块完成加载,尝试更新,崩溃。
  • 仍然看到此崩溃,但频率要低得多(每周一次)。这是一个业务关键型企业应用程序,因此即使这样也是有问题的。 :-(
【解决方案4】:

navigationBar设置背景图片也可能会导致iOS8应用启动时崩溃:

[self.navigationBar setBackgroundImage:[UIImage imageNamed:imgName] forBarMetrics:UIBarMetricsDefault];

根据Apple documents,可能我应该在

中自定义navigationBar
- (void)applicationDidBecomeActive:(UIApplication *)application {
     // customize the navigationBar only once 
     ...
}

但我认为它很差。

【讨论】: