Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lldbdplugin crashes for certain D symbols #2

Open
timotheecour opened this issue Feb 27, 2018 · 9 comments
Open

lldbdplugin crashes for certain D symbols #2

timotheecour opened this issue Feb 27, 2018 · 9 comments

Comments

@timotheecour
Copy link
Owner

timotheecour commented Feb 27, 2018

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

@rainers
Copy link

rainers commented Feb 27, 2018

I suspect Runtime.initialize is called from another thread. You'll need to ensure thread_attachThis() has been called on the thread calling GC.malloc.

@timotheecour
Copy link
Owner Author

timotheecour commented Feb 27, 2018

I suspect Runtime.initialize is called from another thread.

no, even when i make sure Runtime.initialize is called just once, it still crashes when in lldb I run:
b TIMBREAK

But indeed issue is to to fact that upon calling this, seems like it's calling from another thread in lldb and that causes issues

You'll need to ensure thread_attachThis() has been called on the thread calling GC.malloc.

now getting:

uncaught exception
core.thread.ThreadError@src/core/thread.d(3062): Unable to suspend thread

when i add:

  import core.thread;
  thread_attachThis();
  GC.collect; // manually added to exhibit bug faster

/cc @rainers
so I'm guessing it means thread_suspend( t.m_tmach ) != KERN_SUCCESS failed
is that because it's run from lldb and these threads can't be suspended for some reason?
not sure how to proceed

@rainers
Copy link

rainers commented Feb 27, 2018

Not sure how well D shared libraries work on OSX to begin with. I'm just guessing wildly, but

  • Runtime.initialize must only be called once
  • thread_attachThis must only be called once per thread (if not paired with thread_detachThis). You can use a TLS variable to check that.
  • if the thread can disppear, it's probably safer to attach/detach within each callback.

@timotheecour
Copy link
Owner Author

Not sure how well D shared libraries work on OSX to begin with. I'm just guessing wildly, but

I also tried with ldc2 and facing same bug; ldc2 should support shared libraries on OSX

Runtime.initialize must only be called once

made sure it is

thread_attachThis must only be called once per thread (if not paired with thread_detachThis). You can use a TLS variable to check that.
if the thread can disppear, it's probably safer to attach/detach within each callback.

I also tried with:

extern(C)
char* lldbd_demangle(size_t length, const(char)* mangled){
  if(!thread_isMainThread){
    thread_attachThis();
    scope(exit){  thread_detachThis();  }
  }
...

but same bug

@timotheecour
Copy link
Owner Author

timotheecour commented Feb 28, 2018

depending on how i set things up i can also get:

    frame #0: 0x00007fff728ef562 libsystem_kernel.dylib __workq_kernreturn + 10
    frame #1: 0x00007fff72a2a06a libsystem_pthread.dylib _pthread_wqthread + 1035
    frame #2: 0x00007fff72a29c4d libsystem_pthread.dylib start_wqthread + 13
* thread #8, name = 'task-pool.worker', stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
  * frame #0: 0x000000011e670d05 liblldbdplugin.dylib _D4core6thread15scanAllTypeImplFNbMDFNbEQBmQBk8ScanTypePvQcZvQgZv + 85
    frame #1: 0x000000011e670cab liblldbdplugin.dylib _D4core6thread18thread_scanAllTypeUNbMDFNbEQBpQBn8ScanTypePvQcZvZ__T9__lambda2TQvZQoMFNbQBeZv + 35
    frame #2: 0x000000011e6707d8 liblldbdplugin.dylib _D4core6thread18callWithStackShellFNbMDFNbPvZvZv + 48
    frame #3: 0x000000011e670c82 liblldbdplugin.dylib thread_scanAllType + 34
    frame #4: 0x000000011e670e42 liblldbdplugin.dylib thread_scanAll + 34
    frame #5: 0x000000011e67a62d liblldbdplugin.dylib _D2gc4impl12conservativeQw3Gcx7markAllMFNbbZv + 33
    frame #6: 0x000000011e67afa1 liblldbdplugin.dylib _D2gc4impl12conservativeQw3Gcx11fullcollectMFNbbZm + 597
    frame #7: 0x000000011e67d6f5 liblldbdplugin.dylib _D2gc4impl12conservativeQw14ConservativeGC__T9runLockedS_DQCeQCeQCcQCnQBs11fullCollectMFNbZ2goFNbPSQDtQDtQDrQEc3GcxZmTQvZQCyMFNbKQBgZm + 73
    frame #8: 0x000000011e677d45 liblldbdplugin.dylib _D2gc4impl12conservativeQw14ConservativeGC11fullCollectMFNbZm + 13
    frame #9: 0x000000011e677d26 liblldbdplugin.dylib _D2gc4impl12conservativeQw14ConservativeGC7collectMFNbZv + 14
    frame #10: 0x000000011e675d95 liblldbdplugin.dylib gc_collect + 21
    frame #11: 0x000000011e66e10d liblldbdplugin.dylib _D4core6memory2GC7collectFNbZv + 9
    frame #12: 0x000000011e6535ae liblldbdplugin.dylib lldbd_demangle + 494 at /Users/timothee/git_clone//timotheecour//dtools/dtools/lldbdplugin.d:127
    frame #13: 0x0000000100e4d1b0 liblldb.7.0.0.dylib lldb_private::DLanguage::demangle(mangled=0x00007001a6fb6428) + 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=0x00007001a6fb6428, 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=0x0000000118f9c800, cu_language=eLanguageTypeD, fixed_form_sizes=0x00007001a6fb68e8, cu_offset=0, func_basenames=0x0000000118f9c6d0, func_fullnames=0x0000000118f9c6f0, func_methods=0x0000000118f9c890, func_selectors=0x0000000118f9c8b0, objc_class_selectors=0x0000000118f9c8d0, globals=0x0000000118f9c8f0, types=0x0000000118f9c910, namespaces=0x0000000118f9c930) + 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=0x0000000118f9c800, func_basenames=0x0000000118f9c6d0, func_fullnames=0x0000000118f9c6f0, func_methods=0x0000000118f9c890, func_selectors=0x0000000118f9c8b0, objc_class_selectors=0x0000000118f9c8d0, globals=0x0000000118f9c8f0, types=0x0000000118f9c910, namespaces=0x0000000118f9c930) + 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=0x00007ffeefbf3cc0, 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=140732920708288, 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=0x00007ffeefbf3c90, 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=0x000000011c798918)> 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=0x000000011c798918)> 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=0x000000011c798918, __bound_args=0x000000011c798930, __args=0x00007001a6fb6b78)> 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=0x000000011c798918)> 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=0x000000011c798918)> 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=0x000000011c798910)() + 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=0x000000011c7988d0)() 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=0x000000011c7988d0)() + 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=0x00007001a6fb6de8)> 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=0x00007001a6fb6de8)> 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=0x00007001a6fb6de8)> 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=0x00007001a6fb6de0)() + 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=0x00007001a6fb6de0)() 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=0x000000011c7989d0) + 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=0x000000011c7989d0) + 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

( + other threads managed by lldb)

@timotheecour
Copy link
Owner Author

EDIT: I fixed this issue by patching demangle to make it nogc ; will push new code soon

@timotheecour
Copy link
Owner Author

timotheecour commented Mar 9, 2018

fixed in a1bd6e9

but not sure what caused this bug or if there was another way to fix it

the modification to core.demangle using getDst was needed to:

  • avoid this bug that caused a crash for symbols exceeding minBufSize
  • avoid reallocations in subsequent calls

since lldb seems to call the plugin a large number of times when b FOO is called, each call being in a different (short lived?) thread, I made the destination buffer allocated via realloc using a __gshared buffer and lots of ugly casts. It seems to work in all my tests, but is ugly (and not sure about safety); any help improving that aspect would be welcome!

@jacob-carlborg
Copy link

Not sure how well D shared libraries work on OSX to begin with. I'm just guessing wildly, but

DMD does not support dynamic libraries on macOS but LDC does.

Runtime.initialize must only be called once

The runtime has a guard for that.

@timotheecour
Copy link
Owner Author

see my comment above:

I also tried with ldc2 and facing same bug; ldc2 should support shared libraries on OSX

note that a1bd6e9
avoids the bug altogether but still curious about why the bug was there

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants