【问题标题】:Occasionally iOS 6 MKMapView crashes in initWithFrameiOS 6 MKMapView 偶尔会在 initWithFrame 中崩溃
【发布时间】:2012-10-03 17:31:44
【问题描述】:

我在苹果商店有一个应用程序,在 iOS6 更新后,我在MKMapView 中收到了数百个崩溃报告。我无法在我的设备上重现崩溃。 EAGLContext 似乎有问题。我们在我们的应用程序中不使用 OpenGL,但我们在不同的控制器中有多个 MKMapView 实例。 我在这里iOS 6 app crashes in EAGLContext when displaying maps 发现了类似的问题,但他们使用 OpenGL。

这里有回溯:

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

Thread 0 Crashed:
0   libGPUSupportMercury.dylib          0x00000e22 gpus_ReturnNotPermittedKillClient + 10
1   libGPUSupportMercury.dylib          0x3bccc5fb gldCreateContext + 190
2   GLEngine                            0x344c2b15 gliCreateContextWithShared + 676
3   OpenGLES                            0x0000491d -[EAGLContext initWithAPI:properties:] + 1433
4   OpenGLES                            0x000042d7 -[EAGLContext initWithAPI:sharedWithCompute:] + 143
5   VectorKit                           0x00011c81 -[VGLGPU init] + 105
6   VectorKit                           0x000d4659 __24+[VGLGPU sharedInstance]_block_invoke_0 + 49
7   libdispatch.dylib                   0x000014b7 _dispatch_client_callout + 23
8   libdispatch.dylib                   0x000073f7 dispatch_once_f$VARIANT$mp + 43
9   VectorKit                           0x00011c13 +[VGLGPU sharedInstance] + 39
10  VectorKit                           0x00001db1 -[VKMainLoop updateLinkState] + 485
11  VectorKit                           0x00001955 -[VKScreenCanvas _updateDisplayStatus:] + 109
12  UIKit                               0x0001c371 -[UIView initWithFrame:] + 129
13  VectorKit                           0x00010ca5 -[VGLScreenCanvas initWithFrame:context:] + 53
14  VectorKit                           0x00010a7d -[VKScreenCanvas initWithFrame:context:] + 57
15  VectorKit                           0x00010a3f -[VKScreenCanvas initWithFrame:] + 39
16  VectorKit                           0x000106bd -[VKMapCanvas initWithFrame:shouldRasterize:] + 65
17  VectorKit                           0x000104bb -[VKMapView initWithFrame:andGlobe:shouldRasterize:] + 647
18  MapKit                              0x0000dc95 -[MKMapView _commonInitAndEnableLoading:fromIB:] + 725
19  MapKit                              0x0000d811 -[MKMapView initWithFrame:] + 257
.....

【问题讨论】:

  • 你确定不是内存泄漏?我遇到了类似的问题,但我已经确定了原因。 iOS 6 MKMapView 占用的内存是前一个的 10 倍。我的应用程序是关于在地图上显示内容的,其占用空间从 30MB 增加到 280MB。我正在尝试解决它,但还没有任何线索。
  • 嗨@trein,例外是SIGSEGV,据我了解这应该是由于内存访问错误造成的。

标签: ios ios6 ios6-maps


【解决方案1】:

当用户在我们的应用程序后台运行时,我们遇到了类似的问题,就像我们弹出一个包含地图子视图的窗口一样。崩溃似乎是由于我们在后台运行时使用 openGL 调用的地图。我们必须将地图子视图的创建封装在一个检查中,如下所示:

UIApplicationState appState = [[UIApplication sharedApplication] applicationState];
    if( (appState != UIApplicationStateBackground) && (appState != UIApplicationStateInactive))
    {
        // Do map subview initialization...
    }
    else
    {
        self.attemptedToLoadMap = YES;
    }

我们保存了布尔值,这样如果应用返回前台,我们可以添加子视图以供显示。

您必须在以导致重新绘制操作的方式(例如,添加注释)操作地图时执行此操作。

【讨论】:

  • 嗨@stuckj,它可以解决您的崩溃问题吗?
  • 应用在周末获得批准。而且,是的,它似乎已经解决了这个问题。在崩溃报告中不再看到它的报告。
  • 您知道为什么还要检查 UIApplicationStateInactive 吗?我的意思是应用程序的 UI 仍然可见,只是不是最前面。我只添加了对 UIApplicationStateBackground 的检查,但我仍然收到有关此的崩溃报告。
  • 你在进入后台之前进入了非活动状态。当您的状态为 UIApplicationStateBackground 时,您已经在后台,因此在执行此检查之前,您已经面临地图 UI 操作杀死事物的风险。检查非活动以及关闭该窗口更多。即使进行此检查,可能仍然可能发生崩溃,但它应该更多地关闭窗口。
  • 嗯。我们的地图视图是通过 NIB 创建的。为什么我会偷偷怀疑这不再是一个好主意。 :-o
【解决方案2】:

【讨论】:

  • 我不使用 OpenGL,但 Apple 使用 iOS 6 地图。在这种情况下,也许他们应该遵循自己的技术问答?哎呀。
  • 选词不当。它稍微解释了正在发生的事情,但在 Apple 提供的框架(MapKit)负责的情况下,它没有解释如何“解决”这个问题
【解决方案3】:

我们在我们的应用程序中找到了这个问题的原因,所以我想发布解决方案,以防它对其他人有所帮助。我们的主视图控制器在显示时监视显着的位置变化,并在隐藏时停止监视。我们的一些用户在此屏幕上遇到了不相关的崩溃,这使应用程序处于监控状态。当应用程序注册重要的位置更改更新时,如果应用程序没有运行,iOS 实际上会将应用程序启动到后台以告诉它新的位置。由于我们的应用程序在首次启动时会显示地图,这导致了崩溃。 Apple 支持部门向我们确认,运行 iOS 8.x 的 32 位设备存在一个错误,如果在应用程序处于后台时更新 MapView(或其他 OpenGL 上下文),可能会导致崩溃。

我们更改了代码,以便如果应用因位置发生重大变化而启动,我们会立即停止监控并引发异常以使应用崩溃。这对用户来说是完全不可见的,因此他们不会注意到崩溃,并且可以防止进一步的崩溃发生。

- (void)validateLaunchWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions[@"UIApplicationLaunchOptionsLocationKey"]) {
        // the app was launched due to a significant location change, which is not valid and causes crashes
        // prevent this from happening again by disabling significant location monitoring
        CLLocationManager *locationManager = [[CLLocationManager alloc] init];
        [locationManager stopMonitoringSignificantLocationChanges];

        // intentionally crashing the app here; it is not in a good state and it needs to be prevented from
        // getting to any code that would re-enable significant location monitoring
        @throw [NSException exceptionWithName:@"com.redacted.significantLocationLaunch"
                                       reason:@"app may not be launched due to significant location changes"
                                     userInfo:@{}];
    }
}

我们看到了 数千次 次崩溃,但在找出原因之前无法在我们的测试设备上复制它。如果您想复制它(并确认修复),请在您的应用开始监控重大位置更改后立即@throw 异常。应用程序崩溃后,去开车。一旦您的手机切换信号塔,iOS 将在后台启动该应用程序,您将遇到崩溃。我们能够拿到我们的一部用户手机并检查崩溃日志。所有的车祸都发生在她上下班途中。

【讨论】:

    【解决方案4】:

    我面临着类似的堆栈跟踪。我注意到在控制台中它提供了有关实际问题的更多详细信息:您不能在后台使用 GPU。 iOS 5 的地图是基于图块的,所以我假设没有使用 GPU,但 iOS 6 中的新地图使用矢量图形,因此使用了 GPU。因此,任何曾经在后台的地图作品都不再是。

    【讨论】:

    • 嗨@hunterhacker,我从用户那里得到这个堆栈跟踪。我无法在自己的设备上重现崩溃。你能帮我重现这个错误吗?
    • 我无法在模拟器中重新创建它,可能是因为模拟器不使用 GPU 生成地图。每当我在后台运行并获取有关新用户位置的回调时尝试创建新地图视图时,跟踪就会可靠地发生。很抱歉回复延迟,不知道我应该如何收到关于答案的 cmets 通知,但我没有得到它。
    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多