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.