Closed samfader closed 5 years ago
Did you have any packs before trying to add a pack?
I did not, @1ec5.
@1ec5 the call stack doesn't look right:
2 CoreFoundation 0x00007fff2b2e0d7d +[NSException raise:format:] + 205 3 Foundation 0x00007fff2d414786 -[NSKeyValueSlowMutableArray _raiseNilValueExceptionWithSelector:] + 114 4 Foundation 0x00007fff2d3a7274 -[NSKeyValueSlowMutableArray count] + 83 5 Foundation 0x00007fff2d36a653 -[NSKeyValueNotifyingMutableArray addObject:] + 69 6 Mapbox 0x0000000102b18cb0 _Z45MBGLCustomGeometrySourceOptionsFromDictionaryP12NSDictionaryIP8NSStringP11objc_objectE + 62989 7 libdispatch.dylib 0x00007fff52fd85fa _dispatch_call_block_and_r
@asheemmamoowala, this is one of a series of recent crash reports on both iOS and macOS that include Z45MBGLCustomGeometrySourceOptionsFromDictionaryP12NSDictionaryIP8NSStringP11objc_objectE
. Other examples include mapbox/mapbox-events-ios#54 and #12533.
But I wouldn’t pay too much attention to that. It’s most likely a red herring caused by a quirk in symbol visibility. Notice the huge offset for that symbol; the actual function isn’t nearly that long.
At the moment, I’m pretty sure the issue lies with the shared iOS/macOS offline map code, not macosapp or core GL. Unfortunately, I’m unable to reproduce the issue, with or without existing offline packs, but I do sometimes notice stale cells in the Offline Packs panel’s table as the pack statuses load.
Based on this exception message:
*** -[NSKeyValueSlowMutableArray count]: value for key packs of object 0x60000025f9e0 is nil
the issue is with the MGLOfflineStorage.packs
property (in code shared with iOS), to which macosapp binds an array controller:
Somehow MGLOfflineStorage.packs
is returning nil
. This is concerning, because +[MGLOfflineStorage sharedOfflineStorage]
should always return the same singleton object that persists for the lifetime of the application, the binding is to the packs
key path rather than the array currently at that key path, and nullability auditing should ensure that this property is never set to nil
.
As bindings and other KVO are really, really good at catching race conditions, I’m assuming there’s some sort of race condition triggered by -[MGLOfflineStorage reloadPacks]
.
/cc @julianrex @fabian-guerra
If there’s an error getting the packs for some reason, -[MGLOfflineStorage getPacksWithCompletionHandler:]
will pass an NSError object but no packs
array into the completion handler:
Yet -[MGLOfflineStorage reloadPacks]
ignores the error and unconditionally sets MGLOfflineStorage.packs
to the array passed into the completion handler, even if that array is nil
:
I’m a little surprised that the compiler doesn’t issue a nullability warning in this case, but maybe that’s because of the C++ lambda and running static analysis would uncover the problem. In any case, a speculative fix would be to set MGLOfflineStorage.packs
only if the packs
parameter is non-nil.
Not running into this using version 0.12.0 of the macOS app; closing.
Steps to reproduce
Expected behavior
An offline pack is downloaded with the given name.
Actual behavior
The app crashes. Full stacktrace here:
stacktrace
``` Process: Mapbox GL [53106] Path: /Applications/Mapbox GL.app/Contents/MacOS/Mapbox GL Identifier: com.mapbox.MapboxGL Version: 0.1.0 (1) Code Type: X86-64 (Native) Parent Process: ??? [1] Responsible: Mapbox GL [53106] User ID: 501 Date/Time: 2018-09-11 17:19:19.373 -0700 OS Version: Mac OS X 10.13.6 (17G65) Report Version: 12 Bridge OS Version: 3.0 (14Y664) Anonymous UUID: 2857C1C1-0F80-53CB-768E-C1BB880DAC92 Sleep/Wake UUID: 8B955F36-D63C-4E3E-ADF0-B145A54B618E Time Awake Since Boot: 130000 seconds Time Since Wake: 2300 seconds System Integrity Protection: enabled Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000, 0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY Application Specific Information: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSKeyValueSlowMutableArray count]: value for key packs of object 0x60000025f9e0 is nil' abort() called terminating with uncaught exception of type NSException Application Specific Backtrace 1: 0 CoreFoundation 0x00007fff2b24f2db __exceptionPreprocess + 171 1 libobjc.A.dylib 0x00007fff523f0c76 objc_exception_throw + 48 2 CoreFoundation 0x00007fff2b2e0d7d +[NSException raise:format:] + 205 3 Foundation 0x00007fff2d414786 -[NSKeyValueSlowMutableArray _raiseNilValueExceptionWithSelector:] + 114 4 Foundation 0x00007fff2d3a7274 -[NSKeyValueSlowMutableArray count] + 83 5 Foundation 0x00007fff2d36a653 -[NSKeyValueNotifyingMutableArray addObject:] + 69 6 Mapbox 0x0000000102b18cb0 _Z45MBGLCustomGeometrySourceOptionsFromDictionaryP12NSDictionaryIP8NSStringP11objc_objectE + 62989 7 libdispatch.dylib 0x00007fff52fd85fa _dispatch_call_block_and_release + 12 8 libdispatch.dylib 0x00007fff52fd0db8 _dispatch_client_callout + 8 9 libdispatch.dylib 0x00007fff52fdc395 _dispatch_main_queue_callback_4CF + 1148 10 CoreFoundation 0x00007fff2b207c19 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 11 CoreFoundation 0x00007fff2b1c9dfa __CFRunLoopRun + 2586 12 CoreFoundation 0x00007fff2b1c9153 CFRunLoopRunSpecific + 483 13 HIToolbox 0x00007fff2a4b3d96 RunCurrentEventLoopInMode + 286 14 HIToolbox 0x00007fff2a4b3b06 ReceiveNextEventCommon + 613 15 HIToolbox 0x00007fff2a4b3884 _BlockUntilNextEventMatchingListInModeWithFilter + 64 16 AppKit 0x00007fff28764a73 _DPSNextEvent + 2085 17 AppKit 0x00007fff28efae34 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044 18 AppKit 0x00007fff28759885 -[NSApplication run] + 764 19 AppKit 0x00007fff28728a72 NSApplicationMain + 804 20 libdyld.dylib 0x00007fff5300a015 start + 1 Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libsystem_kernel.dylib 0x00007fff5315ab66 __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff53325080 pthread_kill + 333 2 libsystem_c.dylib 0x00007fff530b61ae abort + 127 3 libc++abi.dylib 0x00007fff50fb0f8f abort_message + 245 4 libc++abi.dylib 0x00007fff50fb112b default_terminate_handler() + 265 5 libobjc.A.dylib 0x00007fff523f2ea3 _objc_terminate() + 97 6 libc++abi.dylib 0x00007fff50fcc7c9 std::__terminate(void (*)()) + 8 7 libc++abi.dylib 0x00007fff50fcc843 std::terminate() + 51 8 libdispatch.dylib 0x00007fff52fd0dcc _dispatch_client_callout + 28 9 libdispatch.dylib 0x00007fff52fdc395 _dispatch_main_queue_callback_4CF + 1148 10 com.apple.CoreFoundation 0x00007fff2b207c19 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9 11 com.apple.CoreFoundation 0x00007fff2b1c9dfa __CFRunLoopRun + 2586 12 com.apple.CoreFoundation 0x00007fff2b1c9153 CFRunLoopRunSpecific + 483 13 com.apple.HIToolbox 0x00007fff2a4b3d96 RunCurrentEventLoopInMode + 286 14 com.apple.HIToolbox 0x00007fff2a4b3b06 ReceiveNextEventCommon + 613 15 com.apple.HIToolbox 0x00007fff2a4b3884 _BlockUntilNextEventMatchingListInModeWithFilter + 64 16 com.apple.AppKit 0x00007fff28764a73 _DPSNextEvent + 2085 17 com.apple.AppKit 0x00007fff28efae34 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 3044 18 com.apple.AppKit 0x00007fff28759885 -[NSApplication run] + 764 19 com.apple.AppKit 0x00007fff28728a72 NSApplicationMain + 804 20 libdyld.dylib 0x00007fff5300a015 start + 1 Thread 1:: com.mapbox.mbgl.Worker 1 0 libsystem_kernel.dylib 0x00007fff5315aa16 __psynch_cvwait + 10 1 libsystem_pthread.dylib 0x00007fff53323589 _pthread_cond_wait + 732 2 libc++.1.dylib 0x00007fff50f5ecb0 std::__1::condition_variable::wait(std::__1::unique_lockConfiguration
iOS/macOS versions: macOS 0.10.0