<div dir="ltr">> <span style="font-family:arial,sans-serif;font-size:12.7272720336914px"> I'm wondering whether whether we need some brave soul, to redesign the current lldb IO handling mechanisms.</span><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br>
</span></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">I'm not sure about the "brave soul" part, but my team may look to take this on.  We're getting hammered by it in several different contexts (i.e. the idea that races here seem to require several one-off fixes to get the handling right).  When we get a few cycles on it we may try to hash out something coherent and propose it here.  (If somebody beats us to it, have at it).</span></div>
<div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">I'm blocked by I think a related issue here, so I may get to this sooner than later.</span></div>
<div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:12.7272720336914px">-Todd</span></div></div><div class="gmail_extra"><br>
<br><div class="gmail_quote">On Thu, Aug 21, 2014 at 12:27 AM, Matthew Gardiner <span dir="ltr"><<a href="mailto:mg11@csr.com" target="_blank">mg11@csr.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Greg,<br>
<br>
If that is the case, then the main thread (i.e. the one running Debugger::ExecuteIOHandler) needs to be blocked until the event arrives.<br>
<br>
Why?<br>
<br>
Because with the existing design once the user has entered their "gdb-remote" command, and completed the connect call,  the main thread goes back to the IOHandlerEditline::Run() loop, sees that IsActive() is true, prints the next prompt, etc.. When I debugged this I didn't see any call to Deactivate or SetIsDone, which would have made IsActive return false. (And then the async DefaultEventHandler awakes and it's output "Process 1 stopped" splats over the prompt).<br>

<br>
If the code is changed so that the edit line IOHandler's IsActive returns false, while an asynchronous event is happening, then I think that the main thread would spin, since the reader_sp->Run() function below:<br>

<br>
void<br>
Debugger::ExecuteIOHanders()<br>
{<br>
    while (1)<br>
    {<br>
        IOHandlerSP reader_sp(m_input_reader_<u></u>stack.Top());<br>
        if (!reader_sp)<br>
            break;<br>
<br>
        reader_sp->Activate();<br>
        reader_sp->Run();<br>
        reader_sp->Deactivate();<br>
<br>
would immediately return. That's why I'm thinking the main thread probably should block until the last issued command has completed.<br>
<br>
Out of interest, I did research your "If someone is grabbing the event manually by hijacking events" point. But when stopped state is detected (i.e. the reply to ?) in GDBRemote and Broadcaster::<u></u>PrivateBroadcastEvent is called, there is no hijacking_listener. Indeed the execution path is that as indicated by the --><br>

<br>
    if (hijacking_listener)<br>
    {<br>
        if (unique && hijacking_listener-><u></u>PeekAtNextEventForBroadcasterW<u></u>ithType (this, event_type))<br>
            return;<br>
        hijacking_listener->AddEvent (event_sp);<br>
    }<br>
    else<br>
    {<br>
        collection::iterator pos, end = m_listeners.end();<br>
        // Iterate through all listener/mask pairs<br>
        for (pos = m_listeners.begin(); pos != end; ++pos)<br>
        {<br>
            // If the listener's mask matches any bits that we just set, then<br>
            // put the new event on its event queue.<br>
            if (event_type & pos->second)<br>
            {<br>
                if (unique && pos->first-><u></u>PeekAtNextEventForBroadcasterW<u></u>ithType (this, event_type))<br>
                    continue;<br>
---->         pos->first->AddEvent (event_sp);<br>
<br>
So my contention is that in the case of gdb-connect the initial stop state should either be delivered/printed sychronously in the Process::ConnectRemote (i.e. in the mainthread context) or that the main thread should block until either the event arrives, or for some other reason the command last issued by the user is deemed to be "complete".<br>

<br>
thanks<br>
Matt<br>
<br>
<br>
<br>
Greg Clayton wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">
The event should get delivered to the Debugger thread that is waiting for events and it should coordinate with the top io handler when printing it. If someone is grabbing the event manually by hijacking events, then we need to fix that code to send the event on to the unhijacked main event loop.<br>

<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Aug 20, 2014, at 1:42 AM, Matthew Gardiner <<a href="mailto:mg11@csr.com" target="_blank">mg11@csr.com</a>> wrote:<br>
<br>
Hi folks<br>
<br>
I have been seeing another issue with the display of the lldb prompt. This time it's when I do "target create elf-file", then "gdb-remote port-number". After the "gdb-remote" command I see the fact that my process is stopped, e.g.<br>

<br>
Process 1 stopped<br>
<br>
on the screen. But no (lldb) prompt.<br>
<br>
Some investigation revealed that what's *probably* happening is the main thread after processing the "gdb-remote" returns to it's IOHandler, which then prints (lldb). However, the inferior's state changes seem to delivered to stdout via a different thread, basically one which sits in Debugger::DefaultEventHandler. This subsequent output then, I think, overwrites the previous (lldb) prompt.<br>

<br>
Now in my (and presumably other people's) situation, this issue is compounded by the speed of the TCP/IP connection to the gdbserver stub, the "poll the hardware" nature of my stub, and the fact the hardware is actually simulated - yes over a TCP/IP socket.<br>

<br>
FWIW, I resolved this by a horrible (POSIX only) hack, of sleeping for 300ms at the bottom of the CommandInterpreter::<u></u>HandleCommand function.<br>
<br>
@@ -9,6 +9,8 @@<br>
<br>
#include "lldb/lldb-python.h"<br>
<br>
+#include <poll.h> // MG for prompt bugs<br>
+<br>
#include <string><br>
#include <vector><br>
#include <stdlib.h><br>
@@ -1916,6 +1918,9 @@<br>
     if (log)<br>
       log->Printf ("HandleCommand, command %s", (result.Succeeded() ? "succeeded" : "did not succeed"));<br>
<br>
+    // MG wait for remote connects etc. to complete<br>
+    poll(0,0,300);<br>
+<br>
     return result.Succeeded();<br>
}<br>
<br>
<br>
But this is horrid. Given this, and other prompt issues, I'm wondering whether whether we need some brave soul, to redesign the current lldb IO handling mechanisms.<br>
<br>
Matt<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom<br>

More information can be found at <a href="http://www.csr.com" target="_blank">www.csr.com</a>. Keep up to date with CSR on our technical blog, <a href="http://www.csr.com/blog" target="_blank">www.csr.com/blog</a>, CSR people blog, <a href="http://www.csr.com/people" target="_blank">www.csr.com/people</a>, YouTube, <a href="http://www.youtube.com/user/CSRplc" target="_blank">www.youtube.com/user/CSRplc</a>, Facebook, <a href="http://www.facebook.com/pages/CSR/191038434253534" target="_blank">www.facebook.com/pages/CSR/<u></u>191038434253534</a>, or follow us on Twitter at <a href="http://www.twitter.com/CSR_plc" target="_blank">www.twitter.com/CSR_plc</a>.<br>

New for 2014, you can now access the wide range of products powered by aptX at <a href="http://www.aptx.com" target="_blank">www.aptx.com</a>.<br>
______________________________<u></u>_________________<br>
lldb-dev mailing list<br>
<a href="mailto:lldb-dev@cs.uiuc.edu" target="_blank">lldb-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/lldb-dev</a><br>
</blockquote>
<br>
<br></div></div>
  To report this email as spam click <a href="https://www.mailcontrol.com/sr/KlrpNQ2fxpfGX2PQPOmvUmkxeMeR4!FmRCejA7xH8n6hToChZw9ceRgscvXSUhTVQMiZOyHYW0uU8yB5sLY89Q==" target="_blank">https://www.mailcontrol.com/<u></u>sr/<u></u>KlrpNQ2fxpfGX2PQPOmvUmkxeMeR4!<u></u>FmRCejA7xH8n6hToChZw9ceRgscvXS<u></u>UhTVQMiZOyHYW0uU8yB5sLY89Q==</a> .<br>

</blockquote><div class="HOEnZb"><div class="h5">
<br>
______________________________<u></u>_________________<br>
lldb-dev mailing list<br>
<a href="mailto:lldb-dev@cs.uiuc.edu" target="_blank">lldb-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/lldb-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr"><table cellspacing="0" cellpadding="0" style="color:rgb(136,136,136);font-family:'Times New Roman'"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small">
<td nowrap style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px">Todd Fiala |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Software Engineer |</td>
<td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:tfiala@google.com" style="color:rgb(17,85,204)" target="_blank"><span style="background-color:rgb(255,255,204);color:rgb(34,34,34);background-repeat:initial initial">tfiala@google.com</span></a> |</td>
<td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"><font color="#1155cc"> <a>650-943-3180</a></font></td></tr></tbody></table><br></div>
</div>