Labeling crash in runtime sdk 100.2.1

1057
7
05-04-2018 06:27 AM
CalebPourchot
New Contributor III

I'm using the arc gis runtime sdk for .net 100.2.1 on a Xamarin.Forms project. I have reports on my microsoft appcenter of crashes that I can't reproduce. They are only occurring on the iOS version and they seem to be related to labeling of features. I'm hoping the crash dump will give somebody enough information to steer me in the right direction to get a handle on the issue. The one bit I can offer is that i have a mode in the app where points will be added and removed to the map fairly frequently as the user's location changes. 

Here's the dump from appcenter:

Esri_runtimecore::Labeling::Label_engine_2D_::remove_label_class(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, std::__1::__tree_node<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, void*>*, long> >)

SIGSEGV

BACKGROUND THREAD 8 - CRASHED
  • 0
    ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_2D_::remove_label_class(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, std::__1::__tree_node<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, void*>*, long> >)
  • 1
    ArcGIS-arm
    std::__1::__function::__func<Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>::schedule_remove_label_class(int const&)::'lambda'(Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>&), std::__1::allocator<Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>::schedule_remove_label_class(int const&)::'lambda'(Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>&)>, bool (Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>&)>::operator()(Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>&)
  • 2
    ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_<(Esri_runtimecore::Labeling::Dimension)2>::update_labels()
  • 3
    ArcGIS-arm
    std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2, std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2>, unsigned char ()>::operator()()
  • 4
    ArcGIS-arm
    pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, Esri_runtimecore::Map_renderer::Label_layer::prepare(std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Drawable::Render_properties>&, std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Display_properties> const&)::$_2, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const
  • 5
    ArcGIS-arm
    pplx::details::_TaskProcHandle::_RunChoreBridge(void*)
  • 6
    ArcGIS-arm
    Esri_runtimecore::Common::Core_scheduler::bridge_proc_(void*)
  • 7
    ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::process_message_(std::__1::shared_ptr<Esri_runtimecore::Common::Message_queue::Message> const&)
  • 8
    ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::execute_()
  • 9
    ArcGIS-arm
    Esri_runtimecore::Common::Thread::thread_proc(Esri_runtimecore::Common::Thread*)
  • 10
    ArcGIS-arm
    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 (*)(Esri_runtimecore::Common::Thread*), Esri_runtimecore::Common::Thread*> >(void*)
  • 11
    libsystem_pthread.dylib
    _pthread_body
  • 12
    libsystem_pthread.dylib
    _pthread_start
  • 13
    libsystem_pthread.dylib
    thread_start
0 Kudos
7 Replies
MichaelBranscomb
Esri Frequent Contributor

Hi,

Please can you share a repro app? 

Cheers

Mike

0 Kudos
CalebPourchot
New Contributor III

I wish I could. I can not reproduce the crash. This is just a report i'm

getting from the field. I'm just looking for anything that might steer me

towards how to repro it or speculation about what it could possibly be.

Thanks,

Caleb

0 Kudos
MichaelBranscomb
Esri Frequent Contributor

Hi,

We've taken a look at the labeling code in the area covered by the call stack and can see a couple of opportunities to make some improvements, although not exactly why it crashed in this case, or why it would be more common on iOS. I've submitted an issue in our internal bug tracking system for further investigation and will update this thread when I have some more news.

Cheers

Mike 

0 Kudos
MichaelBranscomb
Esri Frequent Contributor

Hi,

Based on the crash dump we have identified a potential threading issue in this area of code and made a fix that will be included in the next release (anticipated to ship in late-Q2 / early-Q3).

Cheers

Mike

0 Kudos
CalebPourchot
New Contributor III

That's great news.

Thanks Mike

Caleb

0 Kudos
MichaelBranscomb
Esri Frequent Contributor

Hi,

This should have been resolved in the recent 100.3 release. Please let us know if you see any further issues.

Cheers

Mike

0 Kudos
CalebPourchot
New Contributor III

Hi Michael,

I'm still seeing a lot of these turning up in my iOS logs with version 100.4:

  • ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_2D_::remove_label_class(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, std::__1::__tree_node<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, void*>*, long> >)
  • ArcGIS-arm
    std::__1::__function::__func<Esri_runtimecore::Labeling::Label_engine_::schedule_remove_label_class(int const&)::$_10, std::__1::allocator<Esri_runtimecore::Labeling::Label_engine_::schedule_remove_label_class(int const&)::$_10>, bool (Esri_runtimecore::Labeling::Label_engine_&)>::operator()(Esri_runtimecore::Labeling::Label_engine_&)
  • ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_::update_labels()
  • ArcGIS-arm
    std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2, std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2>, unsigned char ()>::operator()()
  • ArcGIS-arm
    pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, Esri_runtimecore::Map_renderer::Label_layer::prepare(std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Drawable::Render_properties>&, std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Display_properties> const&)::$_2, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const
  • ArcGIS-arm
    pplx::details::_TaskProcHandle::_RunChoreBridge(void*)
  • ArcGIS-arm
    Esri_runtimecore::Common::Core_scheduler::bridge_proc_(void*)
  • ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::process_message_(std::__1::shared_ptr<Esri_runtimecore::Common::Message_queue::Message> const&)
  • ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::execute_()
  • ArcGIS-arm
    Esri_runtimecore::Common::Thread::thread_proc(Esri_runtimecore::Common::Thread*)
  • ArcGIS-arm
    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 (*)(Esri_runtimecore::Common::Thread*), Esri_runtimecore::Common::Thread*> >(void*)
  • libsystem_pthread.dylib
    _pthread_body
  • libsystem_pthread.dylib
    _pthread_start
  • libsystem_pthread.dylib
    thread_start

and...

  • ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_::remove_graphic_label(int)
  • ArcGIS-arm
    std::__1::function<void (int)>::operator()(int) const
  • ArcGIS-arm
    Esri_runtimecore::Labeling::Feature_family::remove_labels(Esri_runtimecore::Labeling::Label_class_ const&, std::__1::function<void (Esri_runtimecore::Labeling::Label_family&)> const&, std::__1::function<void (int)> const&)
  • ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_2D_::remove_label_class(std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, std::__1::__tree_node<std::__1::__value_type<int, std::__1::shared_ptr<Esri_runtimecore::Labeling::Label_class_> >, void*>*, long> >)
  • ArcGIS-arm
    std::__1::__function::__func<Esri_runtimecore::Labeling::Label_engine_::schedule_remove_label_class(int const&)::$_10, std::__1::allocator<Esri_runtimecore::Labeling::Label_engine_::schedule_remove_label_class(int const&)::$_10>, bool (Esri_runtimecore::Labeling::Label_engine_&)>::operator()(Esri_runtimecore::Labeling::Label_engine_&)
  • ArcGIS-arm
    Esri_runtimecore::Labeling::Label_engine_::update_labels()
  • ArcGIS-arm
    std::__1::__function::__func<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2, std::__1::allocator<pplx::details::_MakeVoidToUnitFunc(std::__1::function<void ()> const&)::$_2>, unsigned char ()>::operator()()
  • ArcGIS-arm
    pplx::details::_PPLTaskHandle<unsigned char, pplx::task<unsigned char>::_InitialTaskHandle<void, Esri_runtimecore::Map_renderer::Label_layer::prepare(std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Drawable::Render_properties>&, std::__1::shared_ptr<Esri_runtimecore::Map_renderer::Display_properties> const&)::$_2, pplx::details::_TypeSelectorNoAsync>, pplx::details::_TaskProcHandle>::invoke() const
  • ArcGIS-arm
    pplx::details::_TaskProcHandle::_RunChoreBridge(void*)
  • ArcGIS-arm
    Esri_runtimecore::Common::Core_scheduler::bridge_proc_(void*)
  • ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::process_message_(std::__1::shared_ptr<Esri_runtimecore::Common::Message_queue::Message> const&)
  • ArcGIS-arm
    Esri_runtimecore::Common::Queued_thread::execute_()
  • ArcGIS-arm
    Esri_runtimecore::Common::Thread::thread_proc(Esri_runtimecore::Common::Thread*)
  • ArcGIS-arm
    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 (*)(Esri_runtimecore::Common::Thread*), Esri_runtimecore::Common::Thread*> >(void*)
  • libsystem_pthread.dylib
    _pthread_body
0 Kudos