添加谷歌地图作为子视图会导致 iOS 应用程序因 exc_bad 崩溃

2024-01-10

我的代码直到大约 3 天前都运行得很好。我尝试回到一个 100% 有效的更旧的提交,但现在它仍然因 exc_bad 崩溃。 仅当在设备上运行应用程序时才会发生崩溃,如果我在模拟器上运行应用程序或使用仪器在设备上运行应用程序,它运行得很好。当我更改我的 google api 密钥时,它说“您可能无权使用此 api 密钥”,但不再崩溃。

仅当通过 xcode 在设备上运行应用程序时,应用程序才会崩溃。当稍后在设备上运行相同版本而不连接到 Xcode 时,它​​可以正常工作。

我不确定可以在此处添加哪些信息来帮助调试问题。我最近将 xcode 更新到了 6.4,并使用最新更新更新了 OSX。

我使用的是google 1.10.1 sdk版本,使用CocoaPods安装

我用来添加地图的代码:

self.mapView = [GMSMapView mapWithFrame:self.view.bounds camera:camera];

self.mapView.myLocationEnabled = YES;
self.mapView.settings.myLocationButton = YES;
self.mapView.delegate = self;

[self.mapView addObserver:self
               forKeyPath:@"myLocation"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];

[self.view insertSubview:self.mapView atIndex:1];

错误本身在 code=1、code=2 和 code=257 之间变化。我尝试使用故事板而不是代码添加 GMSMapView 。我尝试安装旧版本的 xcode 并再次运行,但它没有改变任何东西。

如果我注释掉插入子视图行,该应用程序不会崩溃。我尝试过运行僵尸仪器工具,但是当我使用仪器运行时,应用程序工作正常。

#0  0x0000000100c5dc34 in EAGLContext_renderbufferStorageFromDrawable(EAGLContext*, objc_selector*, unsigned long, id<EAGLDrawable>) ()
#1  0x00000001002404c0 in gmscore::renderer::ios::GLRenderTarget::CreateFramebuffer() ()
#2  0x00000001002403cc in gmscore::renderer::ios::GLRenderTarget::FrameStart() ()
#3  0x00000001002e7af4 in gmscore::renderer::EntityRenderer::Draw(bool) ()
#4  0x00000001002516f4 in -[GMSPhoenixRenderer drawIfNeeded] ()
#5  0x00000001002329a0 in -[GMSEntityRendererView draw] ()
#6  0x000000010028dc74 in -[GMSDisplayLink displayLinkFired:] ()
#7  0x0000000100c5ca9c in -[DYDisplayLinkInterposer forwardDisplayLinkCallback:] ()
#8  0x00000001887f629c in CA::Display::DisplayLinkItem::dispatch() ()
#9  0x00000001887f6134 in CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) ()
#10 0x00000001855d1470 in IODispatchCalloutFromCFMessage ()
#11 0x00000001843c2dc4 in __CFMachPortPerform ()
#12 0x00000001843d7a54 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#13 0x00000001843d79b4 in __CFRunLoopDoSource1 ()
#14 0x00000001843d5934 in __CFRunLoopRun ()
#15 0x00000001843012d4 in CFRunLoopRunSpecific ()
#16 0x000000018db1f6fc in GSEventRunModal ()
#17 0x0000000188ec6fac in UIApplicationMain ()
#18 0x000000010002d794 in main at /Users/yoavschwartz/Documents/donkey_republic_ios/DonkeyRepublic/DonkeyRepublic/main.m:14
#19 0x0000000196272a08 in start ()

重新启动计算机/设备时,此问题似乎已自行解决,但现在又出现了。我真的不明白发生了什么事。


我已经找到了问题的根源并找到了解决方法:

该问题似乎是由 XCode 中的 OpenGL ES Frame Capture 触发的;我猜测这个问题是在 Apple 从 XCode 6.4/iOS 8.3 开始将 Metal 添加到混合中时开始的,也许对整个帧捕获调试系统产生了不利影响。

解决方法:

  1. 在 XCode 中,转到产品 > 方案 > 编辑方案...
  2. 选择左侧的“运行”选项卡。
  3. 选择顶部的“选项”子选项卡。
  4. 将“GPU 帧捕获”从“自动启用”或“OpenGL ES”更改为“金属”或“禁用”。

这会禁用 OpenGL ES 帧捕获,这不太好,但允许您继续调试构建。

不确定这个问题是 Apple 还是 Google 的,但我将向两者发布错误报告。快乐编码!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加谷歌地图作为子视图会导致 iOS 应用程序因 exc_bad 崩溃 的相关文章

随机推荐