[lldb-dev] remote server crash -> lldb waits forever in accept()

Chris Bieneman via lldb-dev lldb-dev at lists.llvm.org
Fri Apr 28 14:20:37 PDT 2017


Ultimately I think the solution here is two changes

(1) We should add a timeout to MainLoop so that it doesn't wait forever unless we really want to wait forever.
(2) MainLoop can exit on sigint for any platform that has ppoll, pselect, or kevent, so we should probably set that up too.

-Chris


> On Apr 28, 2017, at 11:06 AM, Jim Ingham via lldb-dev <lldb-dev at lists.llvm.org> wrote:
> 
> Seems to me a better UI would be to make ^C interrupt this wait.  That seems to me better than putting in some arbitrary timeout.
> 
> Jim
> 
>> On Apr 28, 2017, at 10:21 AM, Ted Woodward via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>> 
>> Hi Chris, Pavel,
>> 
>> I've got a problem launching the hexagon simulator from lldb. It's launched
>> the same way that debugserver/lldb-server is launched, with reverse connect
>> on a TCP socket. The user can modify the simulator command line (using
>> target.run-args), and can easily give a set of options that the simulator
>> can't handle. In this case the simulator quits before connecting to lldb,
>> and lldb will wait forever for the connection, since TCPSocket::Accept has
>> no timeout.
>> 
>> Currently I have a select call before the accept, to make sure there is
>> activity on the socket. This doesn't feel right with the new changes using
>> MainLoop, so I wanted to see what the list thinks. I believe it will happen
>> any time that debugserver/lldb-server quits or crashes before connecting.
>> That should be easy to test.
>> 
>> This is what I use, right before the call to accept_loop.Run in
>> TCPSocket::Accept:
>> 
>>   NativeSocket accept_socket = -1;
>>   fd_set readset;
>>   FD_ZERO(&readset);
>>   for (auto socket : m_listen_sockets) {
>>     auto fd = socket.first;
>>     FD_SET(fd, &readset);
>>     if (fd > accept_socket)
>>       accept_socket = fd;
>>   }
>>   struct timeval timeout = {10, 0};
>>   int result = ::select(accept_socket + 1, &readset, NULL, NULL,
>> &timeout);
>>   if (result == 0) {
>>     printf("error: timeout waiting for remote server to connect!\n");
>>     error.SetErrorString("timeout waiting for remote server to connect");
>>     return error;
>>   } else if (result < 0) {
>>     printf("error: remote server does not exist!\n");
>>     SetLastError(error);
>>     return error;
>>   }
>> 
>> 
>> Any thoughts this issue?
>> 
>> Ted
>> 
>> --
>> Qualcomm Innovation Center, Inc.
>> The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a
>> Linux Foundation Collaborative Project
>> 
>> 
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev



More information about the lldb-dev mailing list