I don't know what:

    event_thread = LLDBListenerThread(debugger)

does, but from your little sketch it looks like you are starting up a thread 
listening on this debugger, and so far as I can see you destroy the debugger 
out from under it without ever closing down that thread.  That doesn't seem 
like a good idea.

Jim




> On Feb 4, 2016, at 5:27 PM, Jeffrey Tan via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Hi,
> 
> I am revising our lldb automation tests into async mode. However, I found it 
> randomly crashes depends on timing. And the crash happens mostly while 
> launching lldb twice in a row. I have narrowed down the code into a simple 
> repro below. Any assumption I made wrong with the LLDB API here?
> 
> The crash stack seems to be not consistently. In the small repro below, the 
> crash stack is:
> Crashed Thread:        0  Dispatch queue: com.apple.main-thread
> 
> Exception Type:        EXC_BAD_ACCESS (SIGSEGV)
> Exception Codes:       EXC_I386_GPFLT
> 
> Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
> 0   _lldb.so                          0x00000001088c7179 
> EventMatcher::operator()(std::__1::shared_ptr<lldb_private::Event> const&) 
> const + 21
> 1   _lldb.so                          0x00000001088c65d2 
> lldb_private::Listener::FindNextEventInternal(lldb_private::Broadcaster*, 
> lldb_private::ConstString const*, unsigned int, unsigned int, 
> std::__1::shared_ptr<lldb_private::Event>&, bool) + 176
> 2   _lldb.so                          0x00000001088c6952 
> lldb_private::Listener::WaitForEventsInternal(lldb_private::TimeValue const*, 
> lldb_private::Broadcaster*, lldb_private::ConstString const*, unsigned int, 
> unsigned int, std::__1::shared_ptr<lldb_private::Event>&) + 134
> 3   _lldb.so                          0x00000001088c6ae9 
> lldb_private::Listener::WaitForEventForBroadcasterWithType(lldb_private::TimeValue
>  const*, lldb_private::Broadcaster*, unsigned int, 
> std::__1::shared_ptr<lldb_private::Event>&) + 27
> 4   _lldb.so                          0x0000000108abce6c 
> lldb_private::Process::WaitForStateChangedEvents(lldb_private::TimeValue 
> const*, std::__1::shared_ptr<lldb_private::Event>&, lldb_private::Listener*) 
> + 112
> 5   _lldb.so                          0x0000000108abcc95 
> lldb_private::Process::WaitForProcessToStop(lldb_private::TimeValue const*, 
> std::__1::shared_ptr<lldb_private::Event>*, bool, lldb_private::Listener*, 
> lldb_private::Stream*) + 377
> 6   _lldb.so                          0x0000000108ac516a 
> lldb_private::Process::HaltForDestroyOrDetach(std::__1::shared_ptr<lldb_private::Event>&)
>  + 216
> 7   _lldb.so                          0x0000000108abc8b0 
> lldb_private::Process::Destroy(bool) + 146
> 8   _lldb.so                          0x0000000108abc56d 
> lldb_private::Process::Finalize() + 91
> 9   _lldb.so                          0x00000001088b63c4 
> lldb_private::Debugger::Clear() + 148
> 10  _lldb.so                          0x00000001088b61fd 
> lldb_private::Debugger::Destroy(std::__1::shared_ptr<lldb_private::Debugger>&)
>  + 37
> 11  _lldb.so                          0x0000000106bdb144 
> lldb::SBDebugger::Destroy(lldb::SBDebugger&) + 116
> 12  _lldb.so                          0x0000000106c23daf 
> _wrap_SBDebugger_Destroy(_object*, _object*) + 120
> 13  org.python.python                 0x00000001058dd75f PyEval_EvalFrameEx + 
> 12761
> 
> while in the real unit test it is crashing at:
> Thread 12 Crashed:
> 0   libsystem_kernel.dylib            0x00007fff8635a286 __pthread_kill + 10
> 1   libsystem_c.dylib                 0x00007fff919409b3 abort + 129
> 2   libc++abi.dylib                   0x00007fff8a94ea21 abort_message + 257
> 3   libc++abi.dylib                   0x00007fff8a9769d1 
> default_terminate_handler() + 267
> 4   libobjc.A.dylib                   0x00007fff935e77eb _objc_terminate() + 
> 124
> 5   libc++abi.dylib                   0x00007fff8a9740a1 
> std::__terminate(void (*)()) + 8
> 6   libc++abi.dylib                   0x00007fff8a973b30 __cxa_throw + 121
> 7   com.apple.LLDB.framework          0x000000010b994c6b 
> std::__1::shared_ptr<lldb_private::Process>::shared_ptr<lldb_private::Process>(std::__1::weak_ptr<lldb_private::Process>
>  const&, std::__1::enable_if<is_convertible<lldb_private::Process*, 
> lldb_private::Process*>::value, 
> std::__1::shared_ptr<lldb_private::Process>::__nat>::type) + 99
> 8   com.apple.LLDB.framework          0x000000010b8ac762 
> lldb_private::Process::AppendSTDOUT(char const*, unsigned long) + 86
> 9   com.apple.LLDB.framework          0x000000010b6951d7 
> lldb_private::Communication::ReadThread(void*) + 287
> 10  libsystem_pthread.dylib           0x00007fff8d92c05a _pthread_body + 131
> 11  libsystem_pthread.dylib           0x00007fff8d92bfd7 _pthread_start + 176
> 
> 
> ================Repro Code====================
> 
> def wait_for_process_stop(process):
>     while not process.is_stopped:
>         time.sleep(0.1)
> 
> def launch_debugging(debugger, stop_at_entry):
>     error = lldb.SBError()
>     listener = lldb.SBListener('Chrome Dev Tools Listener')
>     target = debugger.GetSelectedTarget()
>     process = target.Launch (listener,
>                     None,      # argv
>                     None,      # envp
>                     None,      # stdin_path
>                     None,      # stdout_path
>                     None,      # stderr_path
>                     None,      # working directory
>                     0,         # launch flags
>                     stop_at_entry,      # Stop at entry
>                     error)     # error
>     print 'Launch result: %s' % str(error)
>     event_thread = LLDBListenerThread(debugger)
>     event_thread.start()
>     return process
> 
> def do_test():
>     debugger = lldb.SBDebugger.Create()
>     debugger.SetAsync(True)
>     target = debugger.CreateTargetWithFileAndArch(executable_path, 
> lldb.LLDB_ARCH_DEFAULT)
> 
>     process = launch_debugging(debugger, stop_at_entry=True)
> 
>     wait_for_process_stop(process) # wait for entry breakpoint.
>     target.BreakpointCreateByName('main')
>     process.Continue()
>     wait_for_process_stop(process) # wait for main breakpoint.
>     lldb.SBDebugger.Destroy(debugger)
> 
> def main():
>     do_test()
>     do_test()
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to