Skip to content

Uncaught std::out_of_range from vector-tile feature access (getProperties/getFeature .at()) terminates the app on malformed tiles — analysis against ios-v5.13.0 #4440

Description

@150vb

MapLibre iOS Version

5.13.0

iOS Version

Production crashes across multiple iOS versions.

Device

Various production devices. Not a simulator-only issue.

What happened?

The app crashes with Fatal Exception: std::out_of_range (uncaught) originating from
vector-tile feature access. The host app is Kotlin/Native (KMP), which installs a
process-wide std::terminate handler, so any uncaught C++ exception is fatal.

Correlating the crash logs with the ios-v5.13.0 source, the only std::out_of_range sites in
vendor/vector-tile are the unguarded .at() calls in feature::getProperties()
(keys.at()/values.at()) and layer::getFeature() (features.at()). getGeometries() is already
guarded against malformed geometry, but getProperties() is not. The tile parse path is
wrapped in try/catch, but the synchronous query path (queryRenderedFeatures /
querySourceFeatures -> convertFeature -> getProperties()) is not, so a malformed/truncated
tile can throw an uncaught std::out_of_range and terminate the process.

Previously reported in #2306 (closed with "please upgrade"); this is a source-level
follow-up. Full analysis, stack traces, and suggested fix are below.

Follow-up: uncaught std::out_of_range from vector-tile feature access (defensive gap observed in 5.13.0)

Context / why I'm following up

Related earlier issue: #2306 (closed).

I previously reported this crash (Fatal Exception: std::out_of_range, Crashlytics issue
62751283f37ff98f4a8da99a0ad0ae2e, app 12.2.0) in
#2306. That issue was closed with
a suggestion to upgrade and observe. I have not upgraded yet; instead I went back and did a
source-level investigation, correlating the crash logs against the MapLibre iOS source at
ios-v5.13.0
(commit d92431b404b8, the version we vendor) to provide something more
actionable than a raw Crashlytics trace before deciding whether an upgrade would actually
address it.

All code references below are to ios-v5.13.0 specifically. I have not diffed against
main/newer releases, so if any of this is already fixed upstream, please just point me to
the change.

This is intended as additional material to help re-judge whether there is a real defensive
gap — not to dispute the earlier triage. I've tried to be explicit about what the evidence
does and does not prove.

What the crashes have in common

  • Exception: Fatal Exception: std::out_of_range, uncaught, terminates the process.
  • Framework: the shipped binary is the Mapbox-named GL Native framework.
  • Host app: Kotlin/Native (KMP). It installs a process-wide std::set_terminate handler
    (visible as TerminateHandler::kotlinHandler). Any uncaught C++ exception anywhere in
    the process is therefore fatal — there is no "failed to load tile" degradation path.
  • Intermittent, production-only. Only reproduces against certain live/cached vector tiles;
    we cannot reproduce on demand locally.

Evidence 1 — the originally-filed crash (app 12.2.0)

The most useful frame in that report is the live worker stack, which shows the throw site
directly:

com.mapbox.mbgl.Worker 1
0  mapbox::vector_tile::feature::getValue(std::string const&) const + 356
1  mbgl::VectorTileFeature::getValue(std::string const&) const + 56
2  mbgl::style::expression::featurePropertyAsExpressionValue(...) + 60
3  mbgl::style::expression::filterEqualsCompoundExpression()::$_62::__invoke(...)
4  ...Signature<...>::applyImpl<0ul, 1ul>(...)
5  mbgl::style::expression::BasicComparison::evaluate(...)
6  mbgl::style::expression::Any::evaluate(...)
7  mbgl::style::expression::All::evaluate(...)
8  mbgl::style::Filter::operator()(...) const
9  mbgl::SymbolLayout::SymbolLayout(...)
10 mbgl::SymbolLayerFactory::createLayout(...)
11 mbgl::LayerManager::createLayout(...)
12 mbgl::GeometryTileWorker::parse() + 1532
13 mbgl::GeometryTileWorker::setLayers(...)

So in that build, the exception was thrown from feature value access during filter
evaluation
, inside SymbolLayout::SymbolLayout, on the tile parse path.

The main thread shows the terminate being delivered:

CFRunLoopRunSpecific -> objc_exception_rethrow -> __cxa_rethrow -> std::__terminate
-> TerminateHandler::kotlinHandler -> FIRCLSTerminateHandler

Evidence 2 — newer crashes (different app, same class)

We have four more recent traces (issue 8a3647...) from another app embedding the same
framework, same exception class. Their concurrent worker stacks show the same family of
parse-time feature access:

mapbox::vector_tile::layer::layer(...)      -> VectorTileData::getLayer(...) -> GeometryTileWorker::parse()
mapbox::vector_tile::feature::feature(...)  -> VectorTileLayer::getFeature(...) -> PatternLayout<FillBucket, ...> -> parse()
mapbox::vector_tile::feature::feature(...)  -> VectorTileLayer::getFeature(...) -> PatternLayout<LineBucket, ...> -> parse()
featurePropertyAsExpressionValue(...)       -> Filter::operator()(...) -> SymbolLayout::SymbolLayout(...) -> parse()

Same main-thread terminate delivery via CFRunLoopRunSpecific -> objc_exception_rethrow.

Full crash trace — issue 8a3647..., session ef679..., app 15.0.1 (19472)
# Crashlytics - Stack trace
# Application: my-app-bundle-id
# Platform: apple
# Version: 15.0.1 (19472)
# Issue: 8a3647f99fc8a4a47c8174d15810f0b7
# Session: 0ae2a8ace897440a8530016395c7e3db_DNE_0_v2
# Date: Thu Nov 21 2024 16:40:15 GMT+0900 (Japan Standard Time)

Fatal Exception: std::out_of_range


Crashed: com.google.firebase.crashlytics.ios.exception
0  Mitsui Shopping Park           0x872c0 FIRCLSProcessRecordAllThreads + 392 (FIRCLSProcess.c:392)
1  Mitsui Shopping Park           0x876a0 FIRCLSProcessRecordAllThreads + 423 (FIRCLSProcess.c:423)
2  Mitsui Shopping Park           0x9570c FIRCLSHandler + 34 (FIRCLSHandler.m:34)
3  Mitsui Shopping Park           0x95510 __FIRCLSExceptionRecord_block_invoke + 240 (FIRCLSException.mm:240)
4  libdispatch.dylib              0x3dd4 _dispatch_client_callout + 20
5  libdispatch.dylib              0x132c4 _dispatch_lane_barrier_sync_invoke_and_complete + 56
6  Mitsui Shopping Park           0x9448c FIRCLSExceptionRecord + 242 (FIRCLSException.mm:242)
7  Mitsui Shopping Park           0x94200 FIRCLSTerminateHandler() + 423 (FIRCLSException.mm:423)
8  MspMultiplatform               0x13b1154 (anonymous namespace)::TerminateHandler::queuedHandler()::'lambda'()::operator()() const + 22
9  MspMultiplatform               0x13b1090 void (anonymous namespace)::$_0::operator()<(anonymous namespace)::TerminateHandler::queuedHandler()::'lambda'()>((anonymous namespace)::TerminateHandler::queuedHandler()::'lambda'()) + 52
10 MspMultiplatform               0x13b105c (anonymous namespace)::TerminateHandler::queuedHandler() + 10
11 MspMultiplatform               0x13b0d98 (anonymous namespace)::TerminateHandler::kotlinHandler() + 392
12 libc++abi.dylib                0x14068 std::__terminate(void (*)()) + 16
13 libc++abi.dylib                0x1760c __cxa_increment_exception_refcount + 202
14 libobjc.A.dylib                0x2f0b4 objc_exception_rethrow + 44
15 CoreFoundation                 0x52d88 CFRunLoopRunSpecific + 784
16 GraphicsServices               0x11a8 GSEventRunModal + 164
17 UIKitCore                      0x40aae8 -[UIApplication _run] + 888
18 UIKitCore                      0x4bed98 UIApplicationMain + 340
19 Mitsui Shopping Park           0x81c0 main + 13 (main.swift:13)
20 ???                            0x1b0ad3154 (シンボルが不足しています)

GC Timer thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd598 std::__1::condition_variable::__do_timed_wait(std::__1::unique_lock<std::__1::mutex>&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000000l>>>) + 100
3  MspMultiplatform               0x1397100 void kotlin::RepeatedTimer<kotlin::steady_clock>::Run<kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()>(kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()&&) + 260
4  MspMultiplatform               0x13973a4 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (*)(kotlin::ScopedThread::attributes, void (kotlin::RepeatedTimer<kotlin::steady_clock>::*&&)(kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()&&) noexcept, kotlin::RepeatedTimer<kotlin::steady_clock>*&&, kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()&&), kotlin::ScopedThread::attributes, void (kotlin::RepeatedTimer<kotlin::steady_clock>::*)(kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()&&) noexcept, kotlin::RepeatedTimer<kotlin::steady_clock>*, kotlin::gc::internal::GCSchedulerDataWithTimer<kotlin::steady_clock>::GCSchedulerDataWithTimer(kotlin::gc::GCSchedulerConfig&, std::__1::function<void ()>)::'lambda'()>>(void*) + 112
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

GC thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  MspMultiplatform               0x139a9fc std::__1::invoke_result<kotlin::gc::ConcurrentMarkAndSweep::ConcurrentMarkAndSweep(kotlin::mm::ObjectFactory<kotlin::gc::ConcurrentMarkAndSweep>&, kotlin::gc::GCScheduler&)::$_3>::type kotlin::ScopedThread::Run<kotlin::gc::ConcurrentMarkAndSweep::ConcurrentMarkAndSweep(kotlin::mm::ObjectFactory<kotlin::gc::ConcurrentMarkAndSweep>&, kotlin::gc::GCScheduler&)::$_3>(kotlin::ScopedThread::attributes, kotlin::gc::ConcurrentMarkAndSweep::ConcurrentMarkAndSweep(kotlin::mm::ObjectFactory<kotlin::gc::ConcurrentMarkAndSweep>&, kotlin::gc::GCScheduler&)::$_3&&) + 228
4  MspMultiplatform               0x139baf0 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (*)(kotlin::ScopedThread::attributes, kotlin::gc::ConcurrentMarkAndSweep::ConcurrentMarkAndSweep(kotlin::mm::ObjectFactory<kotlin::gc::ConcurrentMarkAndSweep>&, kotlin::gc::GCScheduler&)::$_3&&), kotlin::ScopedThread::attributes, kotlin::gc::ConcurrentMarkAndSweep::ConcurrentMarkAndSweep(kotlin::mm::ObjectFactory<kotlin::gc::ConcurrentMarkAndSweep>&, kotlin::gc::GCScheduler&)::$_3>>(void*) + 104
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

com.apple.uikit.eventfetch-thread
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  Foundation                     0xc7b5c -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 212
8  Foundation                     0xc79ac -[NSRunLoop(NSRunLoop) runUntilDate:] + 64
9  UIKitCore                      0x41e81c -[UIEventFetcher threadMain] + 420
10 Foundation                     0xde428 __NSThread__start__ + 732
11 libsystem_pthread.dylib        0x606c _pthread_start + 136
12 libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

com.google.GDTCORFlatFileStorage
0  libsystem_kernel.dylib         0x6ed4 mkdir + 8
1  Foundation                     0x128128 __49-[NSFileManager _URLForReplacingItemAtURL:error:]_block_invoke_2 + 36
2  Foundation                     0x128078 __49-[NSFileManager _URLForReplacingItemAtURL:error:]_block_invoke + 248
3  Foundation                     0x126d34 -[NSFileManager _URLForReplacingItemAtURL:error:] + 1420
4  Foundation                     0x1f038 _NSCreateTemporaryFile_Protected + 168
5  Foundation                     0x20758 _NSWriteDataToFileWithExtendedAttributes + 436
6  Mitsui Shopping Park           0xc4c50 GDTCORWriteDataToFile + 301 (GDTCORPlatform.m:301)
7  Mitsui Shopping Park           0xbda30 __47-[GDTCORFlatFileStorage storeEvent:onComplete:]_block_invoke.42 + 171 (GDTCORFlatFileStorage.m:171)
8  libdispatch.dylib              0x213c _dispatch_call_block_and_release + 32
9  libdispatch.dylib              0x3dd4 _dispatch_client_callout + 20
10 libdispatch.dylib              0xb400 _dispatch_lane_serial_drain + 748
11 libdispatch.dylib              0xbf30 _dispatch_lane_invoke + 380
12 libdispatch.dylib              0x16cb4 _dispatch_root_queue_drain_deferred_wlh + 288
13 libdispatch.dylib              0x16528 _dispatch_workloop_worker_thread + 404
14 libsystem_pthread.dylib        0x4934 _pthread_wqthread + 288
15 libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

com.google.firebase.crashlytics.MachExceptionServer
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  Mitsui Shopping Park           0x95cc8 FIRCLSMachExceptionServer + 192 (FIRCLSMachException.c:192)
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0x13b55fc Worker::processQueueElement(bool) + 808
4  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x1450 __workq_kernreturn + 8
1  libsystem_pthread.dylib        0x4980 _pthread_wqthread + 364
2  libsystem_pthread.dylib        0x10cc start_wqthread + 8

Thread
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  KarteCrashReporting            0x17fa8 exception_server_thread + 188
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

JavaScriptCore libpas scavenger
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  JavaScriptCore                 0x15672a4 scavenger_thread_main + 1512
3  libsystem_pthread.dylib        0x606c _pthread_start + 136
4  libsystem_pthread.dylib        0x10d8 thread_start + 8

GC finalizer processor
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  MspMultiplatform               0x139bcd8 std::__1::invoke_result<kotlin::gc::FinalizerProcessor::StartFinalizerThreadIfNone()::$_0>::type kotlin::ScopedThread::Run<kotlin::gc::FinalizerProcessor::StartFinalizerThreadIfNone()::$_0>(kotlin::ScopedThread::attributes, kotlin::gc::FinalizerProcessor::StartFinalizerThreadIfNone()::$_0&&) + 220
4  MspMultiplatform               0x139bfa8 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, void (*)(kotlin::ScopedThread::attributes, kotlin::gc::FinalizerProcessor::StartFinalizerThreadIfNone()::$_0&&), kotlin::ScopedThread::attributes, kotlin::gc::FinalizerProcessor::StartFinalizerThreadIfNone()::$_0>>(void*) + 104
5  libsystem_pthread.dylib        0x606c _pthread_start + 136
6  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.apple.NSURLConnectionLoader
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CFNetwork                      0xfdc7c _CFHostIsDomainTopLevel + 108176
8  Foundation                     0xde428 __NSThread__start__ + 732
9  libsystem_pthread.dylib        0x606c _pthread_start + 136
10 libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.AssetFileSource
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x167a8 mbgl::util::Thread<mbgl::AssetFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()::operator()() + 192
9  Mapbox                         0x16610 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::AssetFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()>>(void*) + 52
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.OnlineFileSource
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x4ff94 mbgl::util::Thread<mbgl::OnlineFileSourceThread>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()::operator()() + 136
9  Mapbox                         0x4fe34 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::OnlineFileSourceThread>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()>>(void*) + 52
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.DatabaseFileSource
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x1cb08 mbgl::util::Thread<mbgl::DatabaseFileSourceThread>::Thread<std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>&&)::'lambda'()::operator()() + 128
9  Mapbox                         0x1ca48 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::DatabaseFileSourceThread>::Thread<std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>&&)::'lambda'()>>(void*) + 44
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.LocalFileSource
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x243e0 mbgl::util::Thread<mbgl::LocalFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()::operator()() + 140
9  Mapbox                         0x2427c void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::LocalFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()>>(void*) + 52
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.MBTilesFileSource
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x33098 mbgl::util::Thread<mbgl::MBTilesFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()::operator()() + 192
9  Mapbox                         0x32f00 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::MBTilesFileSource::Impl>::Thread<std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<mbgl::ResourceOptions, mbgl::ClientOptions>&&)::'lambda'()>>(void*) + 52
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.ResourceLoaderThread
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CoreFoundation                 0xc0f04 CFRunLoopRun + 64
8  Mapbox                         0x2a2d8 mbgl::util::Thread<mbgl::MainResourceLoaderThread>::Thread<std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>>&&)::'lambda'()::operator()() + 180
9  Mapbox                         0x2a160 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::util::Thread<mbgl::MainResourceLoaderThread>::Thread<std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>>>(std::__1::function<void ()>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::tuple<std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>, std::__1::shared_ptr<mbgl::FileSource>>&&)::'lambda'()>>(void*) + 52
10 libsystem_pthread.dylib        0x606c _pthread_start + 136
11 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.Worker 1
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  Mapbox                         0x331f08 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::ThreadedSchedulerBase::makeSchedulerThread(unsigned long)::$_0>>(void*) + 428
4  libsystem_pthread.dylib        0x606c _pthread_start + 136
5  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.Worker 2
0  Mapbox                         0x306dd4 mapbox::vector_tile::layer::layer(protozero::data_view const&) + 184
1  Mapbox                         0x305b9c mbgl::VectorTileData::getLayer(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&) const + 380
2  Mapbox                         0x2f8398 mbgl::GeometryTileWorker::parse() + 944
3  Mapbox                         0x2f7f5c mbgl::GeometryTileWorker::setData(std::__1::unique_ptr<mbgl::GeometryTileData const, std::__1::default_delete<mbgl::GeometryTileData const>>, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>, unsigned long long) + 212
4  Mapbox                         0x2d52b0 void mbgl::MessageImpl<mbgl::GeometryTileWorker, void (mbgl::GeometryTileWorker::*)(std::__1::unique_ptr<mbgl::GeometryTileData const, std::__1::default_delete<mbgl::GeometryTileData const>>, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>, unsigned long long), std::__1::tuple<std::__1::unique_ptr<mbgl::GeometryTileData const, std::__1::default_delete<mbgl::GeometryTileData const>>, std::__1::set<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>>>, unsigned long long>>::invoke<0ul, 1ul, 2ul>(std::__1::integer_sequence<unsigned long, 0ul, 1ul, 2ul>) + 132
5  Mapbox                         0x56710 mbgl::Mailbox::receive() + 484
6  Mapbox                         0x56a54 mbgl::Mailbox::maybeReceive(std::__1::weak_ptr<mbgl::Mailbox> const&) + 48
7  Mapbox                         0x33202c void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::ThreadedSchedulerBase::makeSchedulerThread(unsigned long)::$_0>>(void*) + 720
8  libsystem_pthread.dylib        0x606c _pthread_start + 136
9  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.Worker 3
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  Mapbox                         0x331f08 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::ThreadedSchedulerBase::makeSchedulerThread(unsigned long)::$_0>>(void*) + 428
4  libsystem_pthread.dylib        0x606c _pthread_start + 136
5  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.Worker 4
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  Mapbox                         0x331f08 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::ThreadedSchedulerBase::makeSchedulerThread(unsigned long)::$_0>>(void*) + 428
4  libsystem_pthread.dylib        0x606c _pthread_start + 136
5  libsystem_pthread.dylib        0x10d8 thread_start + 8

com.apple.CFNetwork.CustomProtocols
0  libsystem_kernel.dylib         0x16c8 mach_msg2_trap + 8
1  libsystem_kernel.dylib         0x4ec8 mach_msg2_internal + 80
2  libsystem_kernel.dylib         0x4de0 mach_msg_overwrite + 436
3  libsystem_kernel.dylib         0x4c20 mach_msg + 24
4  CoreFoundation                 0x53f5c __CFRunLoopServiceMachPort + 160
5  CoreFoundation                 0x53600 __CFRunLoopRun + 1208
6  CoreFoundation                 0x52cd8 CFRunLoopRunSpecific + 608
7  CFNetwork                      0xfdc7c _CFHostIsDomainTopLevel + 108176
8  Foundation                     0xde428 __NSThread__start__ + 732
9  libsystem_pthread.dylib        0x606c _pthread_start + 136
10 libsystem_pthread.dylib        0x10d8 thread_start + 8

com.mapbox.mbgl.Worker 1
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  libc++.1.dylib                 0xd504 std::__1::condition_variable::wait(std::__1::unique_lock<std::__1::mutex>&) + 28
3  Mapbox                         0x331f08 void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct>>, mbgl::ThreadedSchedulerBase::makeSchedulerThread(unsigned long)::$_0>>(void*) + 428
4  libsystem_pthread.dylib        0x606c _pthread_start + 136
5  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Thread
0  libsystem_kernel.dylib         0x708c __psynch_cvwait + 8
1  libsystem_pthread.dylib        0x36e4 _pthread_cond_wait + 1228
2  MspMultiplatform               0x13b6440 (anonymous namespace)::waitInNativeState(_opaque_pthread_cond_t*, _opaque_pthread_mutex_t*, unsigned long long, unsigned long long*) + 176
3  MspMultiplatform               0xfbfc4 kfun:kotlinx.coroutines#runBlocking$default(kotlin.coroutines.CoroutineContext?;kotlin.coroutines.SuspendFunction1<kotlinx.coroutines.CoroutineScope,0:0>;kotlin.Int){0§<kotlin.Any?>}0:0 + 2060
4  MspMultiplatform               0x10116c kfun:kotlinx.coroutines.MultiWorkerDispatcher.$<init>$lambda$1$lambda$0$FUNCTION_REFERENCE$3.$<bridge-UNN>invoke(){}#internal + 188
5  MspMultiplatform               0x13b5984 Worker::processQueueElement(bool) + 1712
6  MspMultiplatform               0x13b5244 (anonymous namespace)::workerRoutine(void*) + 108
7  libsystem_pthread.dylib        0x606c _pthread_start + 136
8  libsystem_pthread.dylib        0x10d8 thread_start + 8

Source-level analysis against ios-v5.13.0

A. Where std::out_of_range can originate

In vendor/vector-tile/include/mapbox/vector_tile.hpp, the only .at() (i.e.
std::out_of_range) sites are:

  • feature::getProperties():

    properties.emplace(layer_.keys.at(tag_key), parseValue(layer_.values.at(tag_val)));
  • layer::getFeature(std::size_t i):

    inline protozero::data_view const& layer::getFeature(std::size_t i) const {
        return features.at(i);
    }

Note: in 5.13.0, feature::getValue() and the geometry command parser throw
std::runtime_error (bounds checked with explicit throw std::runtime_error(...)), not
std::out_of_range. So the originally-filed trace (throw in getValue) corresponds to a
build whose getValue differed from 5.13.0. However, the out_of_range-producing .at()
sites in getProperties() / getFeature() are present and unguarded in 5.13.0.

B. Geometry access is guarded, property access is not

src/mbgl/tile/vector_tile_data.cpp already tolerates malformed geometry:

const GeometryCollection& VectorTileFeature::getGeometries() const {
    ...
    try {
        lines = feature.getGeometries<GeometryCollection>(scale);
    } catch (const std::runtime_error& ex) {          // guarded
        Log::Error(Event::ParseTile, "Could not get geometries: %s", ex.what());
        lines = GeometryCollection();
    }
    ...
}

But the sibling getProperties() has no equivalent guard:

const PropertyMap& VectorTileFeature::getProperties() const {
    if (!properties) {
        properties = feature.getProperties();   // may throw std::out_of_range, unguarded
    }
    return *properties;
}

C. Parse path is caught; query path is not

  • Parse path (worker): GeometryTileWorker::setData / setLayers / coalesced / symbolDependenciesChanged all wrap parse() in try { ... } catch (...) and route to
    GeometryTile::onError -> RenderSource::onTileError -> RenderOrchestrator::onTileError -> Observer::onResourceError. In Continuous mode Map::Impl::onResourceError does not
    rethrow. So in 5.13.0, an exception thrown during parse (the path both crash datasets show)
    should be caught and logged rather than terminating.

  • Query path (synchronous, caller thread): queryRenderedFeatures /
    querySourceFeatures are not wrapped:

    src/mbgl/tile/geometry_tile.cpp, GeometryTile::querySourceFeatures:

    for (std::size_t i = 0; i < featureCount; i++) {
        auto feature = layer->getFeature(i);                  // features.at(i)
        if (options.filter && !(*options.filter)(...)) continue;
        result.emplace_back(convertFeature(*feature, id.canonical));  // -> getProperties() -> keys.at()/values.at()
    }

    src/mbgl/geometry/feature_index.cpp, FeatureIndex::query:

    geometryTileFeature = sourceLayer->getFeature(indexedFeature.index);  // features.at()
    ...
    Feature feature = convertFeature(*geometryTileFeature, tileID);       // -> getProperties()

    convertFeature (src/mbgl/tile/geometry_tile_data.cpp) unconditionally calls
    getProperties(). On iOS these are reached synchronously from
    -[MGLMapView visibleFeaturesAtPoint:...] / visibleFeaturesInRect:...
    (queryRenderedFeatures) and
    -[MGLVectorTileSource featuresInSourceLayersWithIdentifiers:predicate:]
    (querySourceFeatures), with no exception guard in the Objective-C bridge either. On a
    malformed tile, an std::out_of_range on this path is uncaught and — for a host with a
    global terminate handler — fatal.

What this suggests (stated conservatively)

  1. The exception class comes from vector-tile feature access on malformed/truncated/
    schema-mismatched tiles (.at() in getProperties() / getFeature(); older builds also
    via getValue).
  2. In 5.13.0 the parse path is guarded via try/catch (...), but the query path is
    not, and getProperties() is not individually guarded the way getGeometries() is.
  3. For any embedder that treats uncaught C++ exceptions as fatal (Kotlin/Native here, but the
    same applies to other terminate-handler setups), the unguarded query path is a latent
    hard crash on bad tile data.

I cannot 100% attribute the live production crash to the query path vs. the parse path
without symbolication of the exact shipped framework. But the code gap in 5.13.0 is
demonstrable
, and it is the same exception class.

Questions

  1. Is uncaught std::out_of_range from feature::getProperties() / layer::getFeature()
    considered a defect, given getGeometries() is already guarded against malformed data?
  2. Should the query paths (GeometryTile::querySourceFeatures, FeatureIndex::query,
    convertFeature) tolerate a malformed feature by skipping it instead of propagating?
  3. If the intended contract is "the reader is never handed a malformed tile", where should
    embedders rely on that being enforced? Today geometry is tolerated but properties are not,
    which reads as inconsistent.

Suggested direction (for discussion, not a demand)

  • Mirror the existing getGeometries() handling in VectorTileFeature::getProperties():
    catch std::exception, log via Event::ParseTile, return empty/partial properties.
  • Optionally guard the per-feature bodies in GeometryTile::querySourceFeatures and
    FeatureIndex::query so one bad feature is skipped rather than aborting/propagating.

Steps to reproduce

Intermittent, production-only; not deterministically reproducible for us.

Relevant log output

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions