iOS上使用MKMapSnapshotter时出现的VectorKit崩溃报告

53

我收到了与VectorKitMKMapSnapShotter有关的不同类型的崩溃报告。这些崩溃似乎很随意,但它们似乎在从后台返回时发生得最多。设备在发生崩溃之前没有发送任何内存警告。

这里发生了什么?

我正在使用:

if (!_snapshotQueue) {
    _snapshotQueue = dispatch_queue_create("com.bestappever.snapshot", DISPATCH_QUEUE_SERIAL);
}
[_snapshotter cancel]
_snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
__weak __typeof(self)__self = self;
[_snapshotter startWithQueue:queue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        __strong __typeof(__self)_self = __self;
        [_self doSomething];
    });
}];

最常见的一个如下:

Thread 11 Crashed:
0   libobjc.A.dylib                      0x38502b66 objc_msgSend + 5
1   VectorKit                            0x35bc8997 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 51
2   VectorKit                            0x35c1f88d -[VKTileProvider tileSource:invalidateKeys:] + 168
3   VectorKit                            0x35c41325 -[VKTileSource didFailToLoadTileKey:error:] + 196
4   GeoServices                          0x32ca906b ___ZN8LoadItem15deleteRequesterEP8NSStringbb_block_invoke + 87
5   libdispatch.dylib                    0x389ec0c3 _dispatch_call_block_and_release + 11
6   libdispatch.dylib                    0x389f0e7b _dispatch_queue_drain + 375
7   libdispatch.dylib                    0x389edf93 _dispatch_queue_invoke + 43
8   libdispatch.dylib                    0x389f1745 _dispatch_root_queue_drain + 77
9   libdispatch.dylib                    0x389f19c5 _dispatch_worker_thread2 + 57
10  libsystem_pthread.dylib              0x38b1bdff _pthread_wqthread + 298
11  libsystem_pthread.dylib              0x38b1bcc4 start_wqthread + 8

其他例子:

Thread 11 Crashed:
0   libobjc.A.dylib                      0x3850a7aa lookUpImpOrForward + 94
1   libobjc.A.dylib                      0x3850302b _class_lookupMethodAndLoadCache3 + 35
2   libobjc.A.dylib                      0x38502df9 _objc_msgSend_uncached + 25
3   VectorKit                            0x35bc8997 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 50
4   VectorKit                            0x35bc895d -[VKTileProvider tileSource:didFetchTile:forKey:] + 60
5   VectorKit                            0x35bc8915 -[VKTileSource fetchedTile:forKey:] + 44
6   VectorKit                            0x35bc9a95 -[VKTileSetBackedTileSource fetchedTile:forKey:] + 212
7   VectorKit                            0x35bc889d -[VKTileSource _fetchedTile:] + 224
8   VectorKit                            0x35bc8409 __49-[VKTileSource decodeData:downloadKey:sourceKey:]_block_invoke_3 + 109
9   libdispatch.dylib                    0x389ec0c3 _dispatch_call_block_and_release + 11
10  libdispatch.dylib                    0x389f0e7b _dispatch_queue_drain + 375
11  libdispatch.dylib                    0x389edf93 _dispatch_queue_invoke + 43
12  libdispatch.dylib                    0x389f1745 _dispatch_root_queue_drain + 77
13  libdispatch.dylib                    0x389f19c5 _dispatch_worker_thread2 + 57
14  libsystem_pthread.dylib              0x38b1bdff _pthread_wqthread + 298
15  libsystem_pthread.dylib              0x38b1bcc4 start_wqthread + 8


Thread 6 Crashed:
0   libsystem_kernel.dylib               0x390a41fc __pthread_kill + 8
1   libsystem_c.dylib                    0x39054ffd abort + 76
2   Ding Dong                            0x00090de7 uncaught_exception_handler + 27
3   CoreFoundation                       0x2e6a524f __handleUncaughtException + 579
4   libobjc.A.dylib                      0x38ae590f _objc_terminate() + 175
5   libc++abi.dylib                      0x3839a1c7 std::__terminate(void (*)()) + 79
6   libc++abi.dylib                      0x38399a1d __cxxabiv1::exception_cleanup_func(_Unwind_Reason_Code, _Unwind_Exception*) + 1
7   libobjc.A.dylib                      0x38ae5783 objc_exception_throw + 250
8   CoreFoundation                       0x2e6a88e7 -[NSObject doesNotRecognizeSelector:] + 202
9   CoreFoundation                       0x2e6a71cb ___forwarding___ + 707
10  CoreFoundation                       0x2e5f64d8 _CF_forwarding_prep_0 + 24
11  VectorKit                            0x36077cb9 -[VKTileProvider tileSource:keyIsNeeded:] + 68
12  VectorKit                            0x36077c2b -[VKTileSource _shouldDecodeTile:] + 178
13  VectorKit                            0x36077a91 -[VKTileSource didFetchData:forKey:] + 108
14  GeoServices                          0x3319a087 ___ZNK49-[GEOTileLoaderInternal _loadedTile:forKey:info:]66__49-[GEOTileLoaderInternal _loadedTile:forKey:info:]_block_invoke3$_1clERKN8LoadItem9RequesterE_block_invoke_2 + 55
15  libdispatch.dylib                    0x38fc8d1b _dispatch_call_block_and_release + 11
16  libdispatch.dylib                    0x38fcf273 _dispatch_queue_drain$VARIANT$mp + 375
17  libdispatch.dylib                    0x38fcf06b _dispatch_queue_invoke$VARIANT$mp + 43
18  libdispatch.dylib                    0x38fcfce1 _dispatch_root_queue_drain + 77
19  libdispatch.dylib                    0x38fcff59 _dispatch_worker_thread2 + 57
20  libsystem_pthread.dylib              0x3910adbf _pthread_wqthread + 298
21  libsystem_pthread.dylib              0x3910ac84 start_wqthread + 8

Thread 16 Crashed:
0   VectorKit                            0x35a36476 std::__1::__hash_iterator<std::__1::__hash_node<std::__1::pair<VKTileKey, void const*>, void*>*> std::__1::__hash_table<std::__1::pair<VKTileKey, void const*>, std::__1::__unordered_map_hasher<VKTileKey, void const*, hashkey, true>, std::__1::__unordered_map_equal<VKTileKey, void const*, eqkey, true>, vk_allocator<std::__1::pair<VKTileKey, void const*> > >::find<VKTileKey>(VKTileKey const&) + 54
1   VectorKit                            0x35a3642d -[VKTileKeyMap objectForKey:] + 24
2   VectorKit                            0x35a3a837 -[VKTileKeyList containsKey:] + 34
3   VectorKit                            0x35a54b9f -[VKTileProvider tileMatters:] + 78
4   VectorKit                            0x35a549c1 -[VKTileProvider changeTileForKey:toState:withMetadata:withTile:forLayer:] + 92
5   VectorKit                            0x35a5495d -[VKTileProvider tileSource:didFetchTile:forKey:] + 60
6   VectorKit                            0x35a54915 -[VKTileSource fetchedTile:forKey:] + 44
7   VectorKit                            0x35a5489d -[VKTileSource _fetchedTile:] + 224
8   VectorKit                            0x35a54409 __49-[VKTileSource decodeData:downloadKey:sourceKey:]_block_invoke_3 + 109
9   libdispatch.dylib                    0x388780c3 _dispatch_call_block_and_release + 11
10  libdispatch.dylib                    0x3887ce7b _dispatch_queue_drain + 375
11  libdispatch.dylib                    0x38879f93 _dispatch_queue_invoke + 43
12  libdispatch.dylib                    0x3887d745 _dispatch_root_queue_drain + 77
13  libdispatch.dylib                    0x3887d9c5 _dispatch_worker_thread2 + 57
14  libsystem_pthread.dylib              0x389a7dff _pthread_wqthread + 298
15  libsystem_pthread.dylib              0x389a7cc4 start_wqthread + 8

我遇到了类似的问题,我认为这可能与OpenGL在后台绘制有关,据说这可能会引起问题。我希望有更多了解这种情况的人能够回答。 - Matt
我刚刚在调试器附加的情况下启动应用程序时遇到了崩溃,因此即使在新启动时也会发生。查看寄存器没有给我任何提示。 - Jorn van Dijk
1
我也遇到了来自VectorKit的崩溃问题,但是由于缺乏关于VK的任何文档,使得故障排除变得更加困难。如果有任何关于导致VectorKit各种崩溃的信息来源在线上是非常有帮助的。 - RL2000
我看到了各种涉及MKMapSnapshotter的崩溃:http://www.openradar.me/15351647。在iOS 7.1 beta 5中,我认为这个API还没有准备好用于生产。 - Ortwin Gentz
这个问题还在发生吗?你是否已经打开了僵尸模式? - Moshe
2个回答

1
这有多可重复?设备是否正在从睡眠模式中恢复?应用程序在后台运行时屏幕上显示了什么?
ViewController 内,您可以尝试注册 UIApplicationWillResignActiveNotification NSNotification 事件。
当应用程序进入后台时,调用任何 MKMapSnapshotter 上的取消方法。
如果那不起作用,您可以尝试更激烈的措施,例如隐藏视图,以确定它们是否与崩溃有关。

我发现在本地复现很困难,但它在生产环境中相对经常出现。 - Robert Atkins

0

我遇到了同样的问题,经常出现随机崩溃,通常看起来像:

VectorKit 0x10663fe9 -[VKTileProvider tileSource:didFetchTile:forKey:] + 105

我通过删除这行代码来解决了问题:

this.mapSnapshotter.Cancel();

我认为苹果在MKMapSnapshotter取消方法上存在一个bug。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接