VectorKit crash reports with MKMapSnapshotter on iOS
I'm getting different kind of crash reports related to VectorKit
and MKMapSnapShotter
. Crashes occur pretty random, but it seems like they happen most when returning from the background. The device does not send out any memory warnings before it happens.
What's happening here?
I'm using:
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];
});
}];
The most common one is as follows:
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
Some other examples:
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
Solution 1:
How repeatable is this? Is the device coming out of sleep mode? What is on the screen when the App goes into the background?
Within the ViewController
you can try registering the NSNotification
event, UIApplicationWillResignActiveNotification
When the App is going into the background, calling cancel on any MKMapSnapshotter
If that doesn't work, you could attempt more drastic measures, like hiding views, just to identify if they are related to the crash.