[lldb-dev] [PATCH] support for obtaining auxv via gdbserver packet

Greg Clayton gclayton at apple.com
Mon Mar 3 17:02:38 PST 2014


Steve, what is the rationale for having Process::GetAuxvData()? Can we not just keep this as a ProcessGDBRemote only function? Is anyone else besides ProcessGDBRemote going to be able to do anything with this data? If the answer is no, I would prefer to keep this out of Process.cpp/Process.h. If it is only in there to keep from having to cast Process to ProcessGDBRemote, then it definitely should be removed from Process.cpp/.h. I am guessing you have some other idea for this because you added it to the host layer. I don't the see the host layer patch for those parts of the changes. I am not really familiar with the content of the auxv data and I don't know how standardized it is or isn't?

Greg

On Mar 3, 2014, at 3:44 PM, Steve Pucci <spucci at google.com> wrote:

> Hi all,
> 
> This is a patch which allows ProcessGDBServer to obtain the auxv from a remote gdbserver via GDBServerProcessRemote, returning the data as a DataBufferSP.
> 
> The patch includes a small fix to GDBRemoteCommunicationClient::SendPacketsAndConcatenateResponses() to support binary file format packet returns (by not assuming each binary packet is a null-terminated string when concatenating them).
> 
> I've also added a base-class Process::GetAuxvData which delegates to the Host.
> 
> No code currently calls this method.
> 
>  - Steve
> 
> Index: include/lldb/Target/Process.h
> ===================================================================
> --- include/lldb/Target/Process.h	(revision 202766)
> +++ include/lldb/Target/Process.h	(working copy)
> @@ -2063,6 +2063,9 @@
>          return m_unix_signals;
>      }
>  
> +    virtual const lldb::DataBufferSP
> +    GetAuxvData();
> +
>      //==================================================================
>      // Plug-in Process Control Overrides
>      //==================================================================
> Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
> ===================================================================
> --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp	(revision 202766)
> +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp	(working copy)
> @@ -66,6 +66,7 @@
>      m_prepare_for_reg_writing_reply (eLazyBoolCalculate),
>      m_supports_p (eLazyBoolCalculate),
>      m_supports_QSaveRegisterState (eLazyBoolCalculate),
> +    m_supports_qXfer_auxv_read (eLazyBoolCalculate),
>      m_supports_qXfer_libraries_read (eLazyBoolCalculate),
>      m_supports_qXfer_libraries_svr4_read (eLazyBoolCalculate),
>      m_supports_augmented_libraries_svr4_read (eLazyBoolCalculate),
> @@ -187,6 +188,16 @@
>      return (m_supports_qXfer_libraries_read == eLazyBoolYes);
>  }
>  
> +bool
> +GDBRemoteCommunicationClient::GetQXferAuxvReadSupported ()
> +{
> +    if (m_supports_qXfer_auxv_read == eLazyBoolCalculate)
> +    {
> +        GetRemoteQSupported();
> +    }
> +    return (m_supports_qXfer_auxv_read == eLazyBoolYes);
> +}
> +
>  uint64_t
>  GDBRemoteCommunicationClient::GetRemoteMaxPacketSize()
>  {
> @@ -294,6 +305,7 @@
>      m_supports_memory_region_info = eLazyBoolCalculate;
>      m_prepare_for_reg_writing_reply = eLazyBoolCalculate;
>      m_attach_or_wait_reply = eLazyBoolCalculate;
> +    m_supports_qXfer_auxv_read = eLazyBoolCalculate;
>      m_supports_qXfer_libraries_read = eLazyBoolCalculate;
>      m_supports_qXfer_libraries_svr4_read = eLazyBoolCalculate;
>      m_supports_augmented_libraries_svr4_read = eLazyBoolCalculate;
> @@ -320,8 +332,9 @@
>  GDBRemoteCommunicationClient::GetRemoteQSupported ()
>  {
>      // Clear out any capabilities we expect to see in the qSupported response
> +    m_supports_qXfer_auxv_read = eLazyBoolNo;
> +    m_supports_qXfer_libraries_read = eLazyBoolNo;
>      m_supports_qXfer_libraries_svr4_read = eLazyBoolNo;
> -    m_supports_qXfer_libraries_read = eLazyBoolNo;
>      m_supports_augmented_libraries_svr4_read = eLazyBoolNo;
>      m_max_packet_size = UINT64_MAX;  // It's supposed to always be there, but if not, we assume no limit
>  
> @@ -331,6 +344,8 @@
>                                       /*send_async=*/false) == PacketResult::Success)
>      {
>          const char *response_cstr = response.GetStringRef().c_str();
> +        if (::strstr (response_cstr, "qXfer:auxv:read+"))
> +            m_supports_qXfer_auxv_read = eLazyBoolYes;
>          if (::strstr (response_cstr, "qXfer:libraries-svr4:read+"))
>              m_supports_qXfer_libraries_svr4_read = eLazyBoolYes;
>          if (::strstr (response_cstr, "augmented-libraries-svr4-read"))
> @@ -502,11 +517,8 @@
>          {
>              return PacketResult::ErrorReplyInvalid;
>          }
> -        // Skip past m or l
> -        const char *s = this_string.c_str() + 1;
> -
> -        // Concatenate the result so far
> -        response_string += s;
> +        // Concatenate the result so far (skipping 'm' or 'l')
> +        response_string.append(this_string, 1, std::string::npos);
>          if (first_char == 'l')
>              // We're done
>              return PacketResult::Success;
> Index: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
> ===================================================================
> --- source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h	(revision 202766)
> +++ source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h	(working copy)
> @@ -384,6 +384,9 @@
>      SetCurrentThreadForRun (uint64_t tid);
>  
>      bool
> +    GetQXferAuxvReadSupported ();
> +
> +    bool
>      GetQXferLibrariesReadSupported ();
>  
>      bool
> @@ -525,6 +528,7 @@
>      lldb_private::LazyBool m_prepare_for_reg_writing_reply;
>      lldb_private::LazyBool m_supports_p;
>      lldb_private::LazyBool m_supports_QSaveRegisterState;
> +    lldb_private::LazyBool m_supports_qXfer_auxv_read;
>      lldb_private::LazyBool m_supports_qXfer_libraries_read;
>      lldb_private::LazyBool m_supports_qXfer_libraries_svr4_read;
>      lldb_private::LazyBool m_supports_augmented_libraries_svr4_read;
> Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
> ===================================================================
> --- source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp	(revision 202766)
> +++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp	(working copy)
> @@ -281,7 +281,8 @@
>      m_waiting_for_attach (false),
>      m_destroy_tried_resuming (false),
>      m_command_sp (),
> -    m_breakpoint_pc_offset (0)
> +    m_breakpoint_pc_offset (0),
> +    m_breakpoint_trap_opcode_size (0)
>  {
>      m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
>      m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
> @@ -3060,7 +3061,22 @@
>      return m_dyld_ap.get();
>  }
>  
> +const DataBufferSP
> +ProcessGDBRemote::GetAuxvData()
> +{
> +    DataBufferSP buf;
> +    if (m_gdb_comm.GetQXferAuxvReadSupported())
> +    {
> +        std::string response_string;
> +        if (m_gdb_comm.SendPacketsAndConcatenateResponses("qXfer:auxv:read::", response_string) == GDBRemoteCommunication::PacketResult::Success)
> +            buf.reset(new DataBufferHeap(response_string.c_str(), response_string.length()));
> +    }
> +    if (buf.get() != NULL)
> +        return buf;
> +    return Process::GetAuxvData();
> +}
>  
> +
>  class CommandObjectProcessGDBRemotePacketHistory : public CommandObjectParsed
>  {
>  private:
> Index: source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
> ===================================================================
> --- source/Plugins/Process/gdb-remote/ProcessGDBRemote.h	(revision 202766)
> +++ source/Plugins/Process/gdb-remote/ProcessGDBRemote.h	(working copy)
> @@ -299,6 +299,9 @@
>      bool
>      ParseRegisters(lldb_private::ScriptInterpreterObject *registers_array);
>  
> +    virtual const lldb::DataBufferSP
> +    GetAuxvData();
> +
>      //------------------------------------------------------------------
>      /// Broadcaster event bits definitions.
>      //------------------------------------------------------------------
> @@ -341,7 +344,8 @@
>      bool m_destroy_tried_resuming;
>      lldb::CommandObjectSP m_command_sp;
>      int64_t m_breakpoint_pc_offset;
> -    
> +    size_t m_breakpoint_trap_opcode_size;  // If set by Python
> +
>      bool
>      StartAsyncThread ();
>  
> Index: source/Target/Process.cpp
> ===================================================================
> --- source/Target/Process.cpp	(revision 202766)
> +++ source/Target/Process.cpp	(working copy)
> @@ -5973,6 +5973,12 @@
>      target.DidExec();
>  }
>  
> +const DataBufferSP
> +Process::GetAuxvData()
> +{
> +    return lldb_private::Host::GetAuxvData(this);
> +}
> +
>  addr_t
>  Process::ResolveIndirectFunction(const Address *address, Error &error)
>  {
> 
> <patch-auxv-viaPacket.txt>_______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev




More information about the lldb-dev mailing list