[lldb-dev] LLDB Process Attach Failed When Waiting

Jim Ingham via lldb-dev lldb-dev at lists.llvm.org
Tue Jun 5 18:03:46 PDT 2018


Except for Windows and FreeBSD, lldb uses a server program to do the actual debugging - either debugserver on Darwin or lldb-server elsewhere.  The interface to these servers (and to the in-process debugging in Windows & FreeBSD) is abstracted being Process Plugins, which the generic code uses.  Target::Attach is in generic code, it won't know anything about the actual method used to attach, wait for attach, whatever.  That will be dispatched to the currently active ProcessPlugin.

ProcessGDBRemote is the plugin that is used on Linux & Darwin.  It is the code that actually talks to debugserver or lldb-rpc-server from within lldb.  And that's the code in lldb that sends the vAttachWait gdb-remote protocol packet to instruct the above-mentioned servers to implement attach-wait.  That request works on Darwin because debugserver handles the vAttachWait packet, but doesn't work on Linux because lldb-rpc-server doesn't know currently respond to the vAttachWait packet.  So all you should need to do is teach lldb-server to handle the vAttachWait packet.

Jim
  

> On Jun 5, 2018, at 5:44 PM, Ryan Lovelett via lldb-dev <lldb-dev at lists.llvm.org> wrote:
> 
> I think I might be a little lost. I built a lldb in debug mode and I am running lldb in an lldb debugger (very meta).
> 
> Earlier in the thread you said "we need a better error message when vAttachWait returns unsupported" I have found where the error message, e.g., "error: attach failed: lost connection" is constructed. The "attach failed: " comes from here [1] and the "lost connection" comes from here [2].
> 
> What do you mean by "vAttachWait"? Am I missing something obvious?
> 
> It seems like you are expecting lldb-server to be the place where the fix will be implemented. Though in the debugger I'm seeing the method Target::Attach() [3] as the place where the connection attempt is made and fails.
> 
> [1] https://github.com/apple/swift-lldb/blob/a8c149f75a8cba674bead048cd9c80ddc8166a8a/source/Commands/CommandObjectProcess.cpp#L518
> [2] https://github.com/apple/swift-lldb/blob/a8c149f75a8cba674bead048cd9c80ddc8166a8a/source/Target/Target.cpp#L3444-L3445
> [3] https://github.com/apple/swift-lldb/blob/a8c149f75a8cba674bead048cd9c80ddc8166a8a/source/Target/Target.cpp#L3374
> 
> On Mon, Jun 4, 2018, at 7:04 PM, Greg Clayton wrote:
>> I will be too busy this week to get to this, so please do have a stab at it.
>> 
>> Basically the flow that debug server does is:
>> 1 - get a list of all processes whose basename matches and remember those pids so we don't try to attach to them since we are waiting for a new process to show up
>> 2 - poll the OS for the process list and wait for a new pid to show up with the basename and attach to the first one that matches whose pid isn't i the list from step #1
>> 
>> On MacOSX we don't have a way to be notified of new processes are spawned, not sure on other unix variants. If it is possible, we would want change to:
>> 1 - sign up to be notified about new processes
>> 2 - as each process gets launched, check for a match and attach as quickly as possible
>> 
>> Hope this helps and I look forward to seeing your patch!
>> 
>> Greg
>> 
>>> On Jun 4, 2018, at 5:56 AM, Ryan Lovelett <ryan at lovelett.me> wrote:
>>> 
>>> Greg,
>>> 
>>> Is there anything I can do to help you implement or test this feature? Obviously I'm willing to roll-up my sleeves and work on this myself too if you've become more busy than you expected. That happens to us all and I completely understand.
>>> 
>>> Not being able to debug in this manner is blocking me from adding Linux support to a Swift program. As you might imagine, I'm a little antsy to get past this so I can start writing some code. 
>>> 
>>> On Thu, May 31, 2018, at 5:08 PM, Greg Clayton wrote:
>>>> 
>>>> 
>>>>> On May 31, 2018, at 12:40 PM, Ryan Lovelett <ryan at lovelett.me> wrote:
>>>>> 
>>>>> Well at least there is a little good news. I understood way more of those logs than I thought I did.
>>>>> 
>>>>>> So two issues here:
>>>>>> 1 - we need a better error message when vAttachWait returns unsupported
>>>>>> 2 - fix lldb-server to support vAttachWait
>>>>> 
>>>>> A few questions.
>>>>> 
>>>>> What is the protocol here? Can/should I report the issues at https://bugs.llvm.org/ ? Or is that something that a project member needs to do? Assuming that I can, would this be two seperate issues or one "large" issue?
>>>>> 
>>>>> Barring that this is not something someone else might implement better/faster than me. Considering I have zero LLDB development experience is this something that I could tackle?
>>>> 
>>>> I didn't realize this functionality was missing in lldb-server. I can take a stab at implementing it and see what I can do. Stay tuned.
>>>> 
>>>>> 
>>>>> On Thu, May 31, 2018, at 3:02 PM, Greg Clayton wrote:
>>>>>> lldb-server claims it doesn't support it:
>>>>>> 
>>>>>> lldb             <  48> send packet: $vAttachWait;6c616e677365727665722d7377696674#d6
>>>>>> lldb             <   4> read packet: $#00
>>>>>> 
>>>>>> 
>>>>>> Returning the empty packet ("$#00") means it is not supported, but we really should give a better error message than this. 
>>>>>> 
>>>>>> It isn't that hard to implement. It would be easy to copy the code that is in debugserver in DNB.cpp in the DNBProcessAttachWait function. Most of it is probably posix style stuff. 
>>>>>> 
>>>>>> So two issues here:
>>>>>> 1 - we need a better error message when vAttachWait returns unsupported
>>>>>> 2 - fix lldb-server to support vAttachWait
>>>>>> 
>>>>>> Greg
>>>>>> 
>>>>>> 
>>>>>>> On May 31, 2018, at 11:04 AM, Ryan Lovelett <ryan at lovelett.me> wrote:
>>>>>>> 
>>>>>>>> It might be a lldb-server issue?
>>>>>>> 
>>>>>>> How would one go about determining this?
>>>>>>> 
>>>>>>> (lldb) log enable -f /tmp/packates.txt gdb-remote packets
>>>>>>> (lldb) process attach --name "<name>" --waitfor
>>>>>>> error: attach failed: lost connection
>>>>>>> 
>>>>>>> Attached the log output. Maybe it'll make more sense to you than me.
>>>>>>> 
>>>>>>> That escalated quickly. So I've read through that log. I found something that says $qVAttachOrWaitSupported#38 with the following response being $#00. Perhaps I'm reading too much but is it that it's reporting that it is not supported?
>>>>>>> 
>>>>>>> Does lldb-server need to be compiled in a certain way to add support for attach wait?
>>>>>>> 
>>>>>>> On Thu, May 31, 2018, at 1:49 PM, Greg Clayton wrote:
>>>>>>>> Try enabling logging with:
>>>>>>>> 
>>>>>>>> (lldb) log enable -f /tmp/packets.txt gdb-remote packets
>>>>>>>> 
>>>>>>>> And the try the attach. It might be a lldb-server issue?
>>>>>>>> 
>>>>>>>>> On May 31, 2018, at 9:02 AM, Ryan Lovelett via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>>>>>>>> 
>>>>>>>>> I am attempting to use: process attach --name "<name>" --waitfor
>>>>>>>>> 
>>>>>>>>> The problem is that it immediately returns error: attach failed: lost connection.
>>>>>>>>> 
>>>>>>>>> Is this something I can troubleshoot further? Or is this not supported on Linux?
>>>>>>>>> 
>>>>>>>>> -- 
>>>>>>>>> Ryan Lovelett
>>>>>>>>> _______________________________________________
>>>>>>>>> lldb-dev mailing list
>>>>>>>>> lldb-dev at lists.llvm.org
>>>>>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>>>>>> <packates.txt>
> 
> _______________________________________________
> 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