[lldb-dev] "reg read -a" and x86 drN registers

Vince Harron vharron at google.com
Tue Nov 18 11:51:26 PST 2014


Hi Greg,

It's enumerating the debug registers, which is different than what
debugserver does.

< 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
Later on, trying to read these registers returns an error

<  20> send packet: $p85;thread:71ec;#35

<  68> read packet:
$0000000000000000000000000000000000000000000000000000000000000000#00

<  20> send packet: $p86;thread:71ec;#36

<   7> read packet: $E15#ab

<  20> send packet: $p87;thread:71ec;#37

<   7> read packet: $E15#ab

<  20> send packet: $p88;thread:71ec;#38

<   7> read packet: $E15#ab

<  20> send packet: $p89;thread:71ec;#39

<   7> read packet: $E15#ab

<  20> send packet: $p8a;thread:71ec;#61

<   7> read packet: $E15#ab

<  20> send packet: $p8b;thread:71ec;#62

<   7> read packet: $E15#ab

<  20> send packet: $p8c;thread:71ec;#63

<   7> read packet: $E15#ab

<  20> send packet: $p8d;thread:71ec;#64

<   7> read packet: $E15#ab

I can probably fix the register read (not sure) but should I? These will be
used internally by LLDB for watchpoints, right?

> There should be no need to do anything special in
GDBRemoteCommunicationServer::Handle_qRegisterInfo()

Then the solution is to remove the debug registers from
RegisterInfos_x86_64.h



On Tue, Nov 18, 2014 at 11:27 AM, Greg Clayton <gclayton at apple.com> wrote:

> 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.
>
> Greg
>
> > On Nov 17, 2014, at 7:31 PM, Vince Harron <vharron at google.com> wrote:
> >
> > Hi Ed/all,
> >
> > I'm working on Linux remote debugging.  I'm getting a failure in one of
> the TestRegisters.py tests.
> >
> > 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)
> >
> > For local debugging, registers are enumerated by set rather than index
> so we don't see any of those registers.
> >
> > For remote debugging, registers are enumerated by register index so
> those registers are sent over to the host.  This behavior differs from
> debugserver.
> >
> > I have a couple of options here
> >
> > 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.
> >
> > 2) I can add a check that the register index being queried is part of a
> valid register set.  (See patch below)
> >
> > 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.
> >
> > Thoughts?
> >
> > Thanks,
> >
> > Vince
> >
> > GDBRemoteCommunicationServer::Handle_qRegisterInfo
> (StringExtractorGDBRemote &pa
> >      // Ensure we have a thread.
> >      NativeThreadProtocolSP thread_sp
> (m_debugged_process_sp->GetThreadAtIndex (0));
> >      if (!thread_sp)
> >          return SendErrorResponse (69);
> >
> >      // Get the register context for the first thread.
> >      NativeRegisterContextSP reg_context_sp
> (thread_sp->GetRegisterContext ());
> >      if (!reg_context_sp)
> >          return SendErrorResponse (69);
> >
> >      // Parse out the register number from the request.
> >      packet.SetFilePos (strlen("qRegisterInfo"));
> >      const uint32_t reg_index = packet.GetHexMaxU32 (false,
> std::numeric_limits<uint32_t>::max ());
> >      if (reg_index == std::numeric_limits<uint32_t>::max ())
> >          return SendErrorResponse (69);
> >
> >      // Return the end of registers response if we've iterated one past
> the end of the register set.
> >      if (reg_index >= reg_context_sp->GetRegisterCount ())
> >          return SendErrorResponse (69);
> >
> > +    // Verify that the register index is part of a valid register set
> > +    const char* reg_set_name =
> reg_context_sp->GetRegisterSetNameForRegisterAtIndex(reg_index);
> > +    if (!reg_set_name)
> > +    {
> > +        return SendErrorResponse (69);
> > +    }
> > +
> > +    bool reg_set_available = false;
> > +    for (uint32_t reg_set_idx = 0; reg_set_idx <
> reg_context_sp->GetRegisterSetCount(); reg_set_idx++)
> > +    {
> > +        const RegisterSet* reg_set =
> reg_context_sp->GetRegisterSet(reg_set_idx);
> > +        if (0 == strcmp(reg_set->name,reg_set_name))
> > +        {
> > +            reg_set_available = true;
> > +            break;
> > +        }
> > +    }
> > +    if (!reg_set_available)
> > +    {
> > +        return SendErrorResponse (69);
> > +    }
> > +
> >      const RegisterInfo *reg_info =
> reg_context_sp->GetRegisterInfoAtIndex(reg_index);
> >      if (!reg_info)
> >          return SendErrorResponse (69);
> >
> >      // Build the reginfos response.
> >      StreamGDBRemote response;
> >
> >
> > --
> >
> > Vince Harron |         Technical Lead Manager |
> vharron at google.com |    858-442-0868
> >
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>
>


-- 

Vince Harron | Technical Lead Manager | vharron at google.com | 858-442-0868
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20141118/7bcb6fe2/attachment.html>


More information about the lldb-dev mailing list