<div dir="ltr"><div><div><div><div><div><div><div><div><div>I have some code which worked under LLVM+LLDB 3.6.0 which runs as follows: its purpose is to run some code, and print a backtrace if the code segfaults. My approach was:<br></div>- fork<br></div>- the child runs the main part of the program. <br></div>- the parent creates a debugger and attaches to the child. The child is continued and allowed to run until either it terminates or faults.<br><br></div>This code worked in 3.6.0:<br><br>    switch (pid = fork()) {<br>        case -1:<br>            return; // no trace<br><br>        case 0:<br>            // child<br>fprintf(stderr, "child 1\n");<br>            //pause();<br>fprintf(stderr, "child 2\n");<br>            signal(SIGUSR1, SIG_DFL);<br>fprintf(stderr, "child 3\n");<br>            return;<br><br>        default:<br>            // parent: create debugger<br>            {<br>                StateType       state;<br>                //SBAttachInfo    ai(pid);<br><br>                SBDebugger::Initialize();<br>                m_Debugger = SBDebugger::Create(false);<br>                if (!m_Debugger.IsValid())<br>                    fprintf (stderr, "error: failed to create a debugger object\n");<br>                m_Debugger.SetAsync(false);<br>                m_Listener = m_Debugger.GetListener();<br>                m_Target = m_Debugger.CreateTarget(exec_name);<br>fprintf(stderr, "parent 1\n");<br>                //m_Target.Attach(ai, m_Error);<br>                m_Target.AttachToProcessWithID(m_Listener, pid, m_Error);<br>fprintf(stderr, "parent 2\n");<br><br><br></div>Under LLVM+LLDB 3.7.1, I see the following instead:<br></div>- the child runs to completion (child 1/2/3 messages print out).<br></div>- the parent hangs in attach (parent 1 prints out but parent 2 does not)<br><br></div>Debugging the whole thing under GDB (unsure how reliable this is, but the hang happens w/o GDB as well) shows:<br><br>child 1<br>child 2<br>child 3<br></div>[ child prints out other stuff and runs happily ]<br><div>parent 1<br></div><div>[ child terminates ]<br></div><div>[New Thread 0x7fffed043700 (LWP 470)]<br>[New Thread 0x7fffec842700 (LWP 472)]<br>[Thread 0x7fffec842700 (LWP 472) exited]<br>^C<br>Program received signal SIGINT, Interrupt.<br>0x00007ffff2bd566b in pthread_join (threadid=140737169864448, thread_return=0x0)<br>    at pthread_join.c:92<br>92      pthread_join.c: No such file or directory.<br>(gdb) bt<br>#0  0x00007ffff2bd566b in pthread_join (threadid=140737169864448, <br>    thread_return=0x0) at pthread_join.c:92<br>#1  0x00007ffff5f8247c in lldb_private::HostThreadPosix::Join(void**) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#2  0x00007ffff5f7034d in lldb_private::HostThread::Join(void**) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#3  0x00007ffff610802e in lldb_private::process_gdb_remote::GDBRemoteCommunication::StartDebugserverProcess(char const*, unsigned short, lldb_private::ProcessLaunchInfo&, unsigned short&) () from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#4  0x00007ffff612f5c0 in lldb_private::process_gdb_remote::ProcessGDBRemote::LaunchAndConnectToDebugserver(lldb_private::ProcessInfo const&) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#5  0x00007ffff612fbde in lldb_private::process_gdb_remote::ProcessGDBRemote::DoAttachToProcessWithID(unsigned long, lldb_private::ProcessAttachInfo const&) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#6  0x00007ffff623efa5 in lldb_private::Process::Attach(lldb_private::ProcessAttachInfo&) () from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#7  0x00007ffff7025cc4 in PlatformPOSIX::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Debugger&, lldb_private::Target*, lldb_private::Error&) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#8  0x00007ffff626ef52 in lldb_private::Target::Attach(lldb_private::ProcessAttachInfo&, lldb_private::Stream*) () from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#9  0x00007ffff5d4a4d7 in (anonymous namespace)::AttachToProcess(lldb_private::ProcessAttachInfo&, lldb_private::Target&) ()<br>   from /tools/llvm/3.7.1dbg/lib/liblldb.so<br>#10 0x00007ffff5d4a149 in lldb::SBTarget::Attach(lldb::SBAttachInfo&, lldb::SBError&) () from /tools/llvm/3.7.1dbg/lib/liblldb.so<br><br></div><div>Target is Ubuntu LTS 14.04 on x86_64.<br><br></div><div>Has anything changed in the API over the past year? It looks like LLDB is creating a server internally; it is terminating quickly for some reason, and the LLDB parent is waiting forever for its server.<br><br></div></div>