<div dir="ltr">Hi Greg,<div><br></div><div>It's enumerating the debug registers, which is different than what debugserver does.<div><br></div><div><span id="docs-internal-guid-f247b475-c470-5739-447a-d84c351be3ac"><p dir="ltr" style="margin-top:0pt;margin-bottom:0pt"><font face="Arial"><span style="line-height:13px;white-space:pre-wrap"><  60> read packet: $name:dr0;bitsize:64;offset:848;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo87#b1
<  60> read packet: $name:dr1;bitsize:64;offset:856;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo88#b2
<  60> read packet: $name:dr2;bitsize:64;offset:864;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo89#b3
<  60> read packet: $name:dr3;bitsize:64;offset:872;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo8a#db
<  60> read packet: $name:dr4;bitsize:64;offset:880;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo8b#dc
<  60> read packet: $name:dr5;bitsize:64;offset:888;encoding:uint;format:hex;#5d
<  19> send packet: $qRegisterInfo8c#dd
<  60> read packet: $name:dr6;bitsize:64;offset:896;encoding:uint;format:hex;#5d
<  19> send packet: $qRegisterInfo8d#de
<  60> read packet: $name:dr7;bitsize:64;offset:904;encoding:uint;format:hex;#54
<  19> send packet: $qRegisterInfo8e#df
<   7> read packet: $E45#ae
<br></span></font></p><div>Later on, trying to read these registers returns an error</div><div><br></div><div><span id="docs-internal-guid-f247b475-c473-238e-c252-66d8cf160612"><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p85;thread:71ec;#35</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  68> read packet: $0000000000000000000000000000000000000000000000000000000000000000#00</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p86;thread:71ec;#36</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p87;thread:71ec;#37</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p88;thread:71ec;#38</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p89;thread:71ec;#39</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p8a;thread:71ec;#61</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p8b;thread:71ec;#62</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p8c;thread:71ec;#63</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><  20> send packet: $p8d;thread:71ec;#64</span></p><p dir="ltr" style="line-height:1;margin-top:0pt;margin-bottom:0pt"><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><   7> read packet: $E15#ab</span></p><div><span style="font-size:13px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Arial;font-size:13px;white-space:pre-wrap;background-color:transparent">I can probably fix the register read (not sure) but should I?  These will be used internally by LLDB for watchpoints, right?</span><br></div></span></div><div><br></div></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">> There should be no need to do anything special in GDBRemoteCommunicationServer::</span><span style="font-family:arial,sans-serif;font-size:13px">Handle_qRegisterInfo()</span><br></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px">Then the solution is to remove the debug registers from </span><span style="font-family:arial,sans-serif;font-size:13px">RegisterInfos_x86_64.h</span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 18, 2014 at 11:27 AM, Greg Clayton <span dir="ltr"><<a href="mailto:gclayton@apple.com" target="_blank">gclayton@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">When running qRegisterInfo, there can be no gaps in the register numbering. There should be no need to do anything special in GDBRemoteCommunicationServer::Handle_qRegisterInfo(). The remote llgs should be correctly responding to the qRegisterInfo packet and if it is truthful then there should be no problem. It sounds like the bug is in llgs and it is sending back the wrong responses for qRegisterInfo. Can you elaborate on what is not correct in the qRegisterInfo packets? Maybe attach a log from "log enable -f /tmp/packets.txt gdb-remote packets" and I can tell you more.<br>
<span class="HOEnZb"><font color="#888888"><br>
Greg<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> On Nov 17, 2014, at 7:31 PM, Vince Harron <<a href="mailto:vharron@google.com">vharron@google.com</a>> wrote:<br>
><br>
> Hi Ed/all,<br>
><br>
> I'm working on Linux remote debugging.  I'm getting a failure in one of the TestRegisters.py tests.<br>
><br>
> It stems from the fact that the register context's register list is longer than the number of registers covered by the union of all register sets (CPU/FPU/AVX).  (lldb/source/Plugins/Process/Utility/RegisterInfos_x86_64.h has the x86 debug registers listed)<br>
><br>
> For local debugging, registers are enumerated by set rather than index so we don't see any of those registers.<br>
><br>
> For remote debugging, registers are enumerated by register index so those registers are sent over to the host.  This behavior differs from debugserver.<br>
><br>
> I have a couple of options here<br>
><br>
> 1) I can remove the debug registers from RegisterInfos_x86_64.h.  I'm inclined to do this but they seem be used by FreeBSD but I'm not sure why.<br>
><br>
> 2) I can add a check that the register index being queried is part of a valid register set.  (See patch below)<br>
><br>
> 3) I might be able to make these registers readable/writeable on Linux but I think we'll want to use them internally in LLDB (to implement watchpoints?)  and not display them to users at all.<br>
><br>
> Thoughts?<br>
><br>
> Thanks,<br>
><br>
> Vince<br>
><br>
> GDBRemoteCommunicationServer::Handle_qRegisterInfo (StringExtractorGDBRemote &pa<br>
>      // Ensure we have a thread.<br>
>      NativeThreadProtocolSP thread_sp (m_debugged_process_sp->GetThreadAtIndex (0));<br>
>      if (!thread_sp)<br>
>          return SendErrorResponse (69);<br>
><br>
>      // Get the register context for the first thread.<br>
>      NativeRegisterContextSP reg_context_sp (thread_sp->GetRegisterContext ());<br>
>      if (!reg_context_sp)<br>
>          return SendErrorResponse (69);<br>
><br>
>      // Parse out the register number from the request.<br>
>      packet.SetFilePos (strlen("qRegisterInfo"));<br>
>      const uint32_t reg_index = packet.GetHexMaxU32 (false, std::numeric_limits<uint32_t>::max ());<br>
>      if (reg_index == std::numeric_limits<uint32_t>::max ())<br>
>          return SendErrorResponse (69);<br>
><br>
>      // Return the end of registers response if we've iterated one past the end of the register set.<br>
>      if (reg_index >= reg_context_sp->GetRegisterCount ())<br>
>          return SendErrorResponse (69);<br>
><br>
> +    // Verify that the register index is part of a valid register set<br>
> +    const char* reg_set_name = reg_context_sp->GetRegisterSetNameForRegisterAtIndex(reg_index);<br>
> +    if (!reg_set_name)<br>
> +    {<br>
> +        return SendErrorResponse (69);<br>
> +    }<br>
> +<br>
> +    bool reg_set_available = false;<br>
> +    for (uint32_t reg_set_idx = 0; reg_set_idx < reg_context_sp->GetRegisterSetCount(); reg_set_idx++)<br>
> +    {<br>
> +        const RegisterSet* reg_set = reg_context_sp->GetRegisterSet(reg_set_idx);<br>
> +        if (0 == strcmp(reg_set->name,reg_set_name))<br>
> +        {<br>
> +            reg_set_available = true;<br>
> +            break;<br>
> +        }<br>
> +    }<br>
> +    if (!reg_set_available)<br>
> +    {<br>
> +        return SendErrorResponse (69);<br>
> +    }<br>
> +<br>
>      const RegisterInfo *reg_info = reg_context_sp->GetRegisterInfoAtIndex(reg_index);<br>
>      if (!reg_info)<br>
>          return SendErrorResponse (69);<br>
><br>
>      // Build the reginfos response.<br>
>      StreamGDBRemote response;<br>
><br>
><br>
> --<br>
><br>
> Vince Harron |         Technical Lead Manager |        <a href="mailto:vharron@google.com">vharron@google.com</a> |    <a href="tel:858-442-0868" value="+18584420868">858-442-0868</a><br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> lldb-dev mailing list<br>
> <a href="mailto:lldb-dev@cs.uiuc.edu">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/mailman/listinfo/lldb-dev</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><br><table cellspacing="0" cellpadding="0" style="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">Vince Harron |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px"> Technical Lead Manager |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px"> <a href="mailto:vharron@google.com" target="_blank">vharron@google.com</a> |</td><td nowrap style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px"> 858-442-0868</td></tr></tbody></table><br></div></div>
</div>