[Lldb-commits] [PATCH] D32585: Implementation of remote packets for Trace data.
Zachary Turner via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Fri Apr 28 09:02:33 PDT 2017
zturner added inline comments.
================
Comment at: docs/lldb-gdb-remote.txt:214
+//
+// BRIEF
+// Packet for starting tracing of type lldb::TraceType. The following
----------------
I just noticed that none of our documentation uses doxygen? Weird.
================
Comment at: include/lldb/Host/common/NativeProcessProtocol.h:396
+ virtual size_t GetTraceData(lldb::user_id_t uid, lldb::tid_t thread,
+ Error &error, void *buf, size_t buf_size,
+ size_t offset = 0) {
----------------
clayborg wrote:
> labath wrote:
> > llvm::MutableArrayRef<uint8_t> instead of buf+size pair. Maybe we could even pass in a reference to the MutableArrayRef so that the function can truncate it to the actual size?
> This is ok for internal functions. If we use a reference to a llvm::MutableArrayRef<> then we can return Error as the in/out mutable array ref reference can be updated with the right size right?
Agreed.
```
virtual Error GetTraceData(user_id_t uid, tid_t thread, MutableArrayRef<uint8_t> &Buffer, size_t offset=0);
```
================
Comment at: include/lldb/Host/common/NativeProcessProtocol.h:429-430
+ //------------------------------------------------------------------
+ virtual void GetTraceConfig(lldb::user_id_t uid, lldb::tid_t threadid,
+ Error &error, TraceOptions &config) {
+ error.SetErrorString("Not implemented");
----------------
`virtual Error GetTraceConfig(user_id_t uid, tid_ threadid, TraceOptions &config)`
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1110-1111
+
+ if (log)
+ log->Printf("GDBRemoteCommunicationServerLLGS::%s called", __FUNCTION__);
+
----------------
Can you use `LLDB_LOG()` macros here (and everywhere else in this patch)?
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1113-1116
+ if (packet.GetStringRef().find("QTrace:1:type:") != 0)
+ return SendIllFormedResponse(packet, "QTrace:1: Ill formed packet ");
+
+ packet.SetFilePos(strlen("QTrace:1:type:"));
----------------
Can you add a function to `StringExtractor` that looks like this:
```
bool consume_front(StringRef Str) {
StringRef S = GetStringRef();
if (!S.starts_with(Str))
return false;
m_index += Str.size();
return true;
}
```
Then you can change these 3 lines to:
```
if (!packet.consume_front("QTrace:1:type:"))
return SendIllFormedResponse(packet, "QTrace:1: Ill formed packet ");
```
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1138
+
+ StructuredData::DictionarySP custom_params(new StructuredData::Dictionary());
+ llvm::StringRef name, value;
----------------
Please use `auto custom_params = llvm::make_shared<StructuredData::Dictionary>();`
as it is more efficient from a memory standpoint.
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1161
+ if (buffersize == std::numeric_limits<uint64_t>::max() ||
+ packet.GetBytesLeft() != 0) {
+
----------------
Can you use `!packet.empty()`
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1201-1203
+ if (packet.GetStringRef().find("qTrace:conf:read:userid:") != 0)
+ return SendIllFormedResponse(packet, "qTrace: Ill formed packet ");
+ packet.SetFilePos(strlen("qTrace:conf:read:userid:"));
----------------
Use the `consume_front()` function I proposed earlier.
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1285-1287
+ if (packet.GetStringRef().find("QTrace:0:userid:") != 0)
+ return SendIllFormedResponse(packet, "QTrace:0: Ill formed packet ");
+ packet.SetFilePos(strlen("QTrace:0:userid:"));
----------------
`consume_front()`
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1344-1352
+ if (packet.GetStringRef().find("qTrace:buffer:read:userid:") == 0) {
+ tracetype = BufferData;
+ packet.SetFilePos(strlen("qTrace:buffer:read:userid:"));
+ } else if (packet.GetStringRef().find("qTrace:meta:read:userid:") == 0) {
+ tracetype = MetaData;
+ packet.SetFilePos(strlen("qTrace:meta:read:userid:"));
+ } else {
----------------
`consume_front`
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1391
+
+ if (error_encountered || packet.GetBytesLeft() != 0 ||
+ byte_count == std::numeric_limits<size_t>::max() ||
----------------
`!packet.empty()`
================
Comment at: source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:1410-1411
+ if (tracetype == BufferData)
+ filled_data = m_debugged_process_sp->GetTraceData(
+ uid, tid, error, buf.data(), byte_count, offset);
+ else if (tracetype == MetaData)
----------------
If you make the change suggested earlier to convert this function to use array ref, then this line would be written:
```
MutableArrayRef<uint8_t> FilledData(buf);
if (tracetype == BufferData)
error = m_debugged_process_sp->GetTraceData(uid, tid, FilledData, offset);
else
error = m_debugged_process_sp->GetTraceMetaData(uid, tid, FilledData, offset);
```
================
Comment at: source/Plugins/Process/gdb-remote/ProcessGDBRemote.h:181-182
+
+ virtual void StopTrace(lldb::user_id_t uid, lldb::tid_t thread_id,
+ Error &error) override;
+
----------------
Return the `Error` instead of taking it as an output parameter.
================
Comment at: source/Plugins/Process/gdb-remote/ProcessGDBRemote.h:185
+ virtual size_t GetData(lldb::user_id_t uid, lldb::tid_t thread_id,
+ Error &error, void *buf, size_t size,
+ size_t offset = 0) override;
----------------
labath wrote:
> MutableArrayRef
Also, return the `Error` as before.
================
Comment at: source/Plugins/Process/gdb-remote/ProcessGDBRemote.h:188-197
+ virtual size_t GetMetaData(lldb::user_id_t uid, lldb::tid_t thread_id,
+ Error &error, void *buf, size_t size,
+ size_t offset = 0) override;
+
+ size_t GetTraceData(StreamString &packet, lldb::user_id_t uid,
+ lldb::tid_t thread_id, Error &error, void *buf,
+ size_t size, size_t offset = 0);
----------------
Same in all of these cases. Try to return `Error` objects whenever possible.
Also remove the `virtual` keyword from all of these. They are already marked `override`, so `virtual` is redundant.
https://reviews.llvm.org/D32585
More information about the lldb-commits
mailing list