Skip to content

lldbdplugin crashes for certain D symbols #2

Open
@timotheecour

Description

@timotheecour

for https://github.com/timotheecour/dtools/blob/master/dtools/lldbdplugin.d:

not sure why i get this crash:

(lldb) b TIMBREAK
_Dmain
_D4vibe4data4bson14BsonSerializer__T18endWriteArrayEntryTSQCeQCc13serialization__T9SubTraitsTSQDoQDmQBk__T6TraitsTAfSQElQEjQCh13DefaultPolicyVS6dproto10attributes6PackedS0VSQBeQBa10ProtoFieldS2a5_666c6f6174i6ZQDzTfZQFdZQHbMFNaNbNiNfmZv
Process 70349 stopped
* thread #8, name = 'task-pool.worker', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
    frame #0: 0x0000000118d51858 liblldbdplugin.dylib _D4core6thread7suspendFNbCQyQv6ThreadZb + 32
liblldbdplugin.dylib`_D4core6thread7suspendFNbCQyQv6ThreadZb:
->  0x118d51858 <+32>: cmpq   $0x0, 0x18(%rbx)
    0x118d5185d <+37>: je     0x118d5186a               ; <+50>
    0x118d5185f <+39>: leaq   0x50(%rbx), %rdi
    0x118d51863 <+43>: callq  0x118d701ba               ; symbol stub for: _D4core6atomic__T10atomicLoadVEQBdQBb11MemoryOrderi3TbZQBmFNaNbNiNfKOxbZb
Target 0: (lldb) stopped.
(lldb) bt
* thread #8, name = 'task-pool.worker', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
  * frame #0: 0x0000000118d51858 liblldbdplugin.dylib _D4core6thread7suspendFNbCQyQv6ThreadZb + 32
    frame #1: 0x0000000118d51abd liblldbdplugin.dylib thread_suspendAll + 73
    frame #2: 0x0000000118d5a7fa liblldbdplugin.dylib _D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm + 158
    frame #3: 0x0000000118d59052 liblldbdplugin.dylib _D2gc4impl12conservativeQw3Gcx8bigAllocMFNbmKmkxC8TypeInfoZPv + 598
    frame #4: 0x0000000118d5c84f liblldbdplugin.dylib _D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs12mallocNoSyncMFNbmkKmxC8TypeInfoZPvS_DQEgQEgQEeQEp10mallocTimelS_DQFiQFiQFgQFr10numMallocslTmTkTmTxQCzZQFcMFNbKmKkKmKxQDsZQDl + 171
    frame #5: 0x0000000118d56653 liblldbdplugin.dylib _D2gc4impl12conservativeQw14ConservativeGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_ + 115
    frame #6: 0x0000000118d5587b liblldbdplugin.dylib gc_qalloc + 51
    frame #7: 0x0000000118d5e63c liblldbdplugin.dylib _D2gc4impl5protoQo7ProtoGC6qallocMFNbmkxC8TypeInfoZS4core6memory8BlkInfo_ + 48
    frame #8: 0x0000000118d5587b liblldbdplugin.dylib gc_qalloc + 51
    frame #9: 0x0000000118d624f4 liblldbdplugin.dylib _D2rt8lifetime12__arrayAllocFNaNbmxC8TypeInfoxQlZS4core6memory8BlkInfo_ + 236
    frame #10: 0x0000000118d64d11 liblldbdplugin.dylib _d_arraysetlengthiT + 2845
    frame #11: 0x0000000118d4e565 liblldbdplugin.dylib _D4core8demangle__T8DemangleTSQBcQBa7NoHooksZQBa__T10doDemangleSQCkQCi__TQCcTQBwZQCk16parseMangledNameZQCaMFNaNbNfZAa + 197
    frame #12: 0x0000000118d416fb liblldbdplugin.dylib lldbd_demangle + 395
    frame #13: 0x0000000100e4d1b0 liblldb.7.0.0.dylib lldb_private::DLanguage::demangle(mangled=0x0000700006f34428) + 144 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Plugins/Language/D/DLanguage.cpp:116
    frame #14: 0x000000010043707a liblldb.7.0.0.dylib lldb_private::Mangled::GetDemangledName(this=0x0000700006f34428, language=eLanguageTypeD) const + 698 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Core/Mangled.cpp:330
    frame #15: 0x0000000101244bc0 liblldb.7.0.0.dylib DWARFCompileUnit::IndexPrivate(dwarf_cu=0x000000011c4678a0, cu_language=eLanguageTypeD, fixed_form_sizes=0x0000700006f348e8, cu_offset=0, func_basenames=0x000000011c466e40, func_fullnames=0x000000011c467930, func_methods=0x000000011c467950, func_selectors=0x000000011c467970, objc_class_selectors=0x000000011c467990, globals=0x000000011c4679b0, types=0x000000011c4679d0, namespaces=0x000000011c4679f0) + 4080 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp:857
    frame #16: 0x0000000101243a6a liblldb.7.0.0.dylib DWARFCompileUnit::Index(this=0x000000011c4678a0, func_basenames=0x000000011c466e40, func_fullnames=0x000000011c467930, func_methods=0x000000011c467950, func_selectors=0x000000011c467970, objc_class_selectors=0x000000011c467990, globals=0x000000011c4679b0, types=0x000000011c4679d0, namespaces=0x000000011c4679f0) + 538 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp:621
    frame #17: 0x00000001012ced50 liblldb.7.0.0.dylib SymbolFileDWARF::Index(this=0x00007ffeefbf3ce0, cu_idx=0)::$_2::operator()(unsigned long) const + 416 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:2029
    frame #18: 0x00000001012ceba8 liblldb.7.0.0.dylib void llvm::function_ref<void (unsigned long)>::callback_fn<SymbolFileDWARF::Index(callable=140732920708320, params=0)::$_2>(long, unsigned long) + 40 at /Users/timothee/git_clone/llvm/build/../include/llvm/ADT/STLExtras.h:98
    frame #19: 0x000000010062f64a liblldb.7.0.0.dylib llvm::function_ref<void (unsigned long)>::operator(this=0x00007ffeefbf3cb0, params=0)(unsigned long) const + 58 at /Users/timothee/git_clone/llvm/build/../include/llvm/ADT/STLExtras.h:115
    frame #20: 0x000000010062f5e2 liblldb.7.0.0.dylib lldb_private::TaskMapOverInt(this=0x000000011c467a78)> const&)::$_0::operator()() const + 258 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Host/common/TaskPool.cpp:107
    frame #21: 0x000000010062f4b8 liblldb.7.0.0.dylib std::__1::__packaged_task_func<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>, std::__1::allocator<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&> >, void ()>::operator()() [inlined] decltype(__f=0x000000011c467a78)> const&)::$_0&>(fp)(std::__1::forward<>(fp0))) std::__1::__invoke<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&) + 120 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:4291
    frame #22: 0x000000010062f4a7 liblldb.7.0.0.dylib std::__1::__packaged_task_func<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>, std::__1::allocator<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&> >, void ()>::operator()() [inlined] std::__1::__bind_return<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0, std::__1::tuple<>, std::__1::tuple<>, __is_valid_bind_return<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0, std::__1::tuple<>, std::__1::tuple<> >::value>::type std::__1::__apply_functor<lldb_private::TaskMapOverInt(__f=0x000000011c467a78, __bound_args=0x000000011c467a90, __args=0x0000700006f34b78)> const&)::$_0, std::__1::tuple<>, std::__1::tuple<> >(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&, std::__1::tuple<>&, std::__1::__tuple_indices<>, std::__1::tuple<>&&) + 8 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:2206
    frame #23: 0x000000010062f49f liblldb.7.0.0.dylib std::__1::__packaged_task_func<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>, std::__1::allocator<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&> >, void ()>::operator()() [inlined] std::__1::__bind_return<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0, std::__1::tuple<>, std::__1::tuple<>, __is_valid_bind_return<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0, std::__1::tuple<>, std::__1::tuple<> >::value>::type std::__1::__bind<lldb_private::TaskMapOverInt(this=0x000000011c467a78)> const&)::$_0&>::operator()<>() + 31 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:2239
    frame #24: 0x000000010062f480 liblldb.7.0.0.dylib std::__1::__packaged_task_func<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>, std::__1::allocator<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&> >, void ()>::operator()() [inlined] decltype(__f=0x000000011c467a78)> const&)::$_0&>&>(fp)(std::__1::forward<>(fp0))) std::__1::__invoke<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>&>(std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>&&&) + 20 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:4291
    frame #25: 0x000000010062f46c liblldb.7.0.0.dylib std::__1::__packaged_task_func<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>, std::__1::allocator<std::__1::__bind<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&> >, void ()>::operator(this=0x000000011c467a70)() + 44 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/future:1824
    frame #26: 0x00000001012d21f9 liblldb.7.0.0.dylib std::__1::packaged_task<void ()>::operator()() [inlined] std::__1::__packaged_task_function<void ()>::operator(this=0x000000011c467a30)() const + 297 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/future:2001
    frame #27: 0x00000001012d21ec liblldb.7.0.0.dylib std::__1::packaged_task<void ()>::operator(this=0x000000011c467a30)() + 284 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/future:2221
    frame #28: 0x00000001006309a0 liblldb.7.0.0.dylib std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(this=0x0000700006f34de8)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()::operator()() const + 32 at /Users/timothee/git_clone/llvm/build/../tools/lldb/include/lldb/Host/TaskPool.h:66
    frame #29: 0x000000010063096d liblldb.7.0.0.dylib void std::__1::__invoke_void_return_wrapper<void>::__call<std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()&>(std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()&&&) [inlined] decltype(__f=0x0000700006f34de8)> const&)::$_0&>(fp)(std::__1::forward<>(fp0))) std::__1::__invoke<std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&) + 45 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/type_traits:4291
    frame #30: 0x000000010063095c liblldb.7.0.0.dylib void std::__1::__invoke_void_return_wrapper<void>::__call<std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(__args=0x0000700006f34de8)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()&>(std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()&&&) + 28 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/__functional_base:359
    frame #31: 0x0000000100630769 liblldb.7.0.0.dylib std::__1::__function::__func<std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'(), std::__1::allocator<std::__1::future<std::__1::result_of<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0& ()>::type> lldb_private::TaskPool::AddTask<lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&>(lldb_private::TaskMapOverInt(unsigned long, unsigned long, llvm::function_ref<void (unsigned long)> const&)::$_0&&&)::'lambda'()>, void ()>::operator(this=0x0000700006f34de0)() + 41 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:1552
    frame #32: 0x00000001010f4ed5 liblldb.7.0.0.dylib std::__1::function<void ()>::operator(this=0x0000700006f34de0)() const + 53 at /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/functional:1903
    frame #33: 0x000000010062cdb6 liblldb.7.0.0.dylib lldb_private::(anonymous namespace)::TaskPoolImpl::Worker(pool=0x00000001091b25e0)::TaskPoolImpl*) + 422 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Host/common/TaskPool.cpp:93
    frame #34: 0x0000000100628cc5 liblldb.7.0.0.dylib lldb_private::(anonymous namespace)::TaskPoolImpl::WorkerPtr(pool=0x00000001091b25e0) + 21 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Host/common/TaskPool.cpp:77
    frame #35: 0x000000010060da2e liblldb.7.0.0.dylib lldb_private::HostNativeThreadBase::ThreadCreateTrampoline(arg=0x000000011c467b30) + 158 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Host/common/HostNativeThreadBase.cpp:66
    frame #36: 0x00000001006a0a50 liblldb.7.0.0.dylib lldb_private::HostThreadMacOSX::ThreadCreateTrampoline(arg=0x000000011c467b30) + 160 at /Users/timothee/git_clone/llvm/build/../tools/lldb/source/Host/macosx/HostThreadMacOSX.mm:69
    frame #37: 0x00007fff72a2a6c1 libsystem_pthread.dylib _pthread_body + 340
    frame #38: 0x00007fff72a2a56d libsystem_pthread.dylib _pthread_start + 377
    frame #39: 0x00007fff72a29c5d libsystem_pthread.dylib thread_start + 13

workaround: avoid the reallocations with for example:
enum L_max=1_000_000;

of course, this only hides the underlying issue and doesn't completely remove the problem

NOTE
I couldn't reproduce without using lldb to call into the shared library lldbdplugin (ie, if I call the shared library directly, it doesn't crash)

NOTE
auto status = thread_suspend( t.m_tmach );
gives status:268435459 which is invalid value of kern_return_t enum

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions