[Lldb-commits] [PATCH] D24385: MinidumpParsing: pid, modules, exceptions

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Fri Sep 9 09:20:49 PDT 2016


zturner added inline comments.

================
Comment at: source/Plugins/Process/minidump/MinidumpParser.cpp:88-89
@@ +87,4 @@
+MinidumpParser::GetMinidumpString(uint32_t rva) {
+  llvm::ArrayRef<uint8_t> arr_ref(m_data_sp->GetBytes() + rva,
+                                  m_data_sp->GetByteSize() - rva);
+  return MinidumpString::Parse(arr_ref);
----------------
This is fine, but I prefer to avoid the math wherever possible since it makes code slightly more difficult to read.  I would write this as:

```
auto arr_ref = m_data_sp->GetData().drop_front(rva);
```

================
Comment at: source/Plugins/Process/minidump/MinidumpParser.cpp:171
@@ +170,3 @@
+llvm::Optional<LinuxProcStatus> MinidumpParser::GetLinuxProcStatus() {
+  llvm::Optional<llvm::ArrayRef<uint8_t>> data =
+      GetStream(MinidumpStreamType::LinuxProcStatus);
----------------
Same as before, an `Optional<ArrayRef>` seems a bit redundant.  I would just return an empty `ArrayRef` to represent it not being there.  I dont' think there's a valid case for a strema to actually be present, but be 0 bytes in length.

================
Comment at: source/Plugins/Process/minidump/MinidumpParser.cpp:202
@@ +201,3 @@
+
+  return MinidumpModule::ParseModuleList(data.getValue());
+}
----------------
It will do this parsing every time you ask for the module list.  How about storing a `std::vector<const MinidumpModule *>` in the `MinidumpParser` class and then you can return an `ArrayRef<const MinidumpModule*>` to it.  So it's lazy evaluation, only done once, with the side benefit of allowing you to return an `ArrayRef<T>` instead of a more complicated `Optional<vector<T>>`

================
Comment at: source/Plugins/Process/minidump/MinidumpParser.h:47
@@ -45,1 +46,3 @@
 
+  llvm::Optional<const MinidumpString> GetMinidumpString(uint32_t rva);
+
----------------
There's a lot of `Optional`'s here.  Is it really possible for any subset of these to be optional?  Or is it more like if you find one, you will find them all?

================
Comment at: source/Plugins/Process/minidump/MinidumpParser.h:61
@@ +60,3 @@
+
+  llvm::Optional<std::vector<const MinidumpModule *>> GetModuleList();
+
----------------
I would drop the `Optional` here and return `ArrayRef<const MinidumpModule*>`.  Returning an entire vector by value is wasteful on the stack.  Using an `ArrayRef` makes it very lightweight, while still providing value-like semantics in that you won't be able to modify the underlyign container.  Also, if its size is 0, you can treat that the same as if the `Optional` did not have a value.

================
Comment at: source/Plugins/Process/minidump/MinidumpTypes.cpp:21
@@ +20,3 @@
+llvm::StringRef
+lldb_private::minidump::consumeString(llvm::ArrayRef<uint8_t> &Buffer) {
+  return llvm::StringRef(reinterpret_cast<const char *>(Buffer.data()),
----------------
labath wrote:
> This is not consistent with the consumeObject function, which also drops the consumed bytes from the buffer.
Is this logic correct?  A buffer may be arbitrarily large and have more data in it besides the string.  Perhaps you need to search forward for a null terminator, then only return that portion of the string, then drop that many bytes (plus the null terminator) from the input buffer?

================
Comment at: source/Plugins/Process/minidump/MinidumpTypes.h:223
@@ +222,3 @@
+
+  static llvm::Optional<const MinidumpString>
+  Parse(llvm::ArrayRef<uint8_t> &data);
----------------
labath wrote:
> MinidumpString is just a wrapper around the std::string. Why not return the string directly? (Also the "const" there is unnecessary).
Agree, the `MinidumpString` class seems unnecessary to me.  Just make `parseMinidumpString` be a file static global function and return an `std::string`.

================
Comment at: source/Plugins/Process/minidump/MinidumpTypes.h:299
@@ -282,1 +298,3 @@
+  llvm::support::ulittle32_t
+      flags1; // represent what info in the struct is valid
   llvm::support::ulittle32_t process_id;
----------------
labath wrote:
> this is oddly formatted now.
Probably because the comment passed 80 columns.  I would put the comment on a new line above the field to fix this.


https://reviews.llvm.org/D24385





More information about the lldb-commits mailing list