[Lldb-commits] [lldb] r358070 - Minidump: Use llvm parser for reading the ModuleList stream

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed Apr 10 04:07:29 PDT 2019


Author: labath
Date: Wed Apr 10 04:07:28 2019
New Revision: 358070

URL: http://llvm.org/viewvc/llvm-project?rev=358070&view=rev
Log:
Minidump: Use llvm parser for reading the ModuleList stream

In this patch, I just remove the structure definitions for the
ModuleList stream and the associated parsing code. The rest of the code
is converted to work with the definitions in llvm. NFC.

Modified:
    lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
    lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
    lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
    lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
    lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp
    lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp Wed Apr 10 04:07:28 2019
@@ -24,21 +24,6 @@
 using namespace lldb_private;
 using namespace minidump;
 
-const Header *ParseHeader(llvm::ArrayRef<uint8_t> &data) {
-  const Header *header = nullptr;
-  Status error = consumeObject(data, header);
-
-  uint32_t signature = header->Signature;
-  uint32_t version = header->Version & 0x0000ffff;
-  // the high 16 bits of the version field are implementation specific
-
-  if (error.Fail() || signature != Header::MagicSignature ||
-      version != Header::MagicVersion)
-    return nullptr;
-
-  return header;
-}
-
 llvm::Expected<MinidumpParser>
 MinidumpParser::Create(const lldb::DataBufferSP &data_sp) {
   auto ExpectedFile = llvm::object::MinidumpFile::create(
@@ -63,9 +48,9 @@ llvm::ArrayRef<uint8_t> MinidumpParser::
       .getValueOr(llvm::ArrayRef<uint8_t>());
 }
 
-UUID MinidumpParser::GetModuleUUID(const MinidumpModule *module) {
+UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) {
   auto cv_record =
-      GetData().slice(module->CV_record.RVA, module->CV_record.DataSize);
+      GetData().slice(module->CvRecord.RVA, module->CvRecord.DataSize);
 
   // Read the CV record signature
   const llvm::support::ulittle32_t *signature = nullptr;
@@ -284,28 +269,36 @@ llvm::Optional<lldb::pid_t> MinidumpPars
   return llvm::None;
 }
 
-llvm::ArrayRef<MinidumpModule> MinidumpParser::GetModuleList() {
-  llvm::ArrayRef<uint8_t> data = GetStream(StreamType::ModuleList);
-
-  if (data.size() == 0)
+llvm::ArrayRef<minidump::Module> MinidumpParser::GetModuleList() {
+  auto ExpectedModules = GetMinidumpFile().getModuleList();
+  if (ExpectedModules)
+    return *ExpectedModules;
+
+  LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES),
+                 ExpectedModules.takeError(),
+                 "Failed to read module list: {0}");
+  return {};
+}
+
+std::vector<const minidump::Module *> MinidumpParser::GetFilteredModuleList() {
+  Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES);
+  auto ExpectedModules = GetMinidumpFile().getModuleList();
+  if (!ExpectedModules) {
+    LLDB_LOG_ERROR(log, ExpectedModules.takeError(),
+                   "Failed to read module list: {0}");
     return {};
+  }
 
-  return MinidumpModule::ParseModuleList(data);
-}
-
-std::vector<const MinidumpModule *> MinidumpParser::GetFilteredModuleList() {
-  llvm::ArrayRef<MinidumpModule> modules = GetModuleList();
   // map module_name -> filtered_modules index
   typedef llvm::StringMap<size_t> MapType;
   MapType module_name_to_filtered_index;
 
-  std::vector<const MinidumpModule *> filtered_modules;
-  
-  for (const auto &module : modules) {
-    auto ExpectedName = m_file->getString(module.module_name_rva);
+  std::vector<const minidump::Module *> filtered_modules;
+
+  for (const auto &module : *ExpectedModules) {
+    auto ExpectedName = m_file->getString(module.ModuleNameRVA);
     if (!ExpectedName) {
-      LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES),
-                     ExpectedName.takeError(),
+      LLDB_LOG_ERROR(log, ExpectedName.takeError(),
                      "Failed to module name: {0}");
       continue;
     }
@@ -328,7 +321,7 @@ std::vector<const MinidumpModule *> Mini
       // times when they are mapped discontiguously, so find the module with
       // the lowest "base_of_image" and use that as the filtered module.
       auto dup_module = filtered_modules[iter->second];
-      if (module.base_of_image < dup_module->base_of_image)
+      if (module.BaseOfImage < dup_module->BaseOfImage)
         filtered_modules[iter->second] = &module;
     }
   }

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h Wed Apr 10 04:07:28 2019
@@ -52,7 +52,7 @@ public:
 
   llvm::ArrayRef<uint8_t> GetStream(StreamType stream_type);
 
-  UUID GetModuleUUID(const MinidumpModule* module);
+  UUID GetModuleUUID(const minidump::Module *module);
 
   llvm::ArrayRef<MinidumpThread> GetThreads();
 
@@ -70,13 +70,13 @@ public:
 
   llvm::Optional<lldb::pid_t> GetPid();
 
-  llvm::ArrayRef<MinidumpModule> GetModuleList();
+  llvm::ArrayRef<minidump::Module> GetModuleList();
 
   // There are cases in which there is more than one record in the ModuleList
   // for the same module name.(e.g. when the binary has non contiguous segments)
   // So this function returns a filtered module list - if it finds records that
   // have the same name, it keeps the copy with the lowest load address.
-  std::vector<const MinidumpModule *> GetFilteredModuleList();
+  std::vector<const minidump::Module *> GetFilteredModuleList();
 
   const MinidumpExceptionStream *GetExceptionStream();
 

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp Wed Apr 10 04:07:28 2019
@@ -84,33 +84,6 @@ LinuxProcStatus::Parse(llvm::ArrayRef<ui
 
 lldb::pid_t LinuxProcStatus::GetPid() const { return pid; }
 
-// Module stuff
-const MinidumpModule *MinidumpModule::Parse(llvm::ArrayRef<uint8_t> &data) {
-  const MinidumpModule *module = nullptr;
-  Status error = consumeObject(data, module);
-  if (error.Fail())
-    return nullptr;
-
-  return module;
-}
-
-llvm::ArrayRef<MinidumpModule>
-MinidumpModule::ParseModuleList(llvm::ArrayRef<uint8_t> &data) {
-  const auto orig_size = data.size();
-  const llvm::support::ulittle32_t *modules_count;
-  Status error = consumeObject(data, modules_count);
-  if (error.Fail() || *modules_count * sizeof(MinidumpModule) > data.size())
-    return {};
-  
-  // Compilers might end up padding an extra 4 bytes depending on how the
-  // structure is padded by the compiler and the #pragma pack settings.
-  if (4 + *modules_count * sizeof(MinidumpModule) < orig_size)
-    data = data.drop_front(4);
-  
-  return llvm::ArrayRef<MinidumpModule>(
-      reinterpret_cast<const MinidumpModule *>(data.data()), *modules_count);
-}
-
 // Exception stuff
 const MinidumpExceptionStream *
 MinidumpExceptionStream::Parse(llvm::ArrayRef<uint8_t> &data) {

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h Wed Apr 10 04:07:28 2019
@@ -228,46 +228,6 @@ private:
   LinuxProcStatus() = default;
 };
 
-// MinidumpModule stuff
-struct MinidumpVSFixedFileInfo {
-  llvm::support::ulittle32_t signature;
-  llvm::support::ulittle32_t struct_version;
-  llvm::support::ulittle32_t file_version_hi;
-  llvm::support::ulittle32_t file_version_lo;
-  llvm::support::ulittle32_t product_version_hi;
-  llvm::support::ulittle32_t product_version_lo;
-  // file_flags_mask - identifies valid bits in fileFlags
-  llvm::support::ulittle32_t file_flags_mask;
-  llvm::support::ulittle32_t file_flags;
-  llvm::support::ulittle32_t file_os;
-  llvm::support::ulittle32_t file_type;
-  llvm::support::ulittle32_t file_subtype;
-  llvm::support::ulittle32_t file_date_hi;
-  llvm::support::ulittle32_t file_date_lo;
-};
-static_assert(sizeof(MinidumpVSFixedFileInfo) == 52,
-              "sizeof MinidumpVSFixedFileInfo is not correct!");
-
-struct MinidumpModule {
-  llvm::support::ulittle64_t base_of_image;
-  llvm::support::ulittle32_t size_of_image;
-  llvm::support::ulittle32_t checksum;
-  llvm::support::ulittle32_t time_date_stamp;
-  llvm::support::ulittle32_t module_name_rva;
-  MinidumpVSFixedFileInfo version_info;
-  LocationDescriptor CV_record;
-  LocationDescriptor misc_record;
-  llvm::support::ulittle32_t reserved0[2];
-  llvm::support::ulittle32_t reserved1[2];
-
-  static const MinidumpModule *Parse(llvm::ArrayRef<uint8_t> &data);
-
-  static llvm::ArrayRef<MinidumpModule>
-  ParseModuleList(llvm::ArrayRef<uint8_t> &data);
-};
-static_assert(sizeof(MinidumpModule) == 108,
-              "sizeof MinidumpVSFixedFileInfo is not correct!");
-
 // Exception stuff
 struct MinidumpException {
   enum : unsigned {

Modified: lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp Wed Apr 10 04:07:28 2019
@@ -348,18 +348,17 @@ bool ProcessMinidump::UpdateThreadList(T
 }
 
 void ProcessMinidump::ReadModuleList() {
-  std::vector<const MinidumpModule *> filtered_modules =
+  std::vector<const minidump::Module *> filtered_modules =
       m_minidump_parser->GetFilteredModuleList();
 
   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
 
   for (auto module : filtered_modules) {
     std::string name = cantFail(m_minidump_parser->GetMinidumpFile().getString(
-        module->module_name_rva));
+        module->ModuleNameRVA));
     LLDB_LOG(log, "found module: name: {0} {1:x10}-{2:x10} size: {3}", name,
-             module->base_of_image,
-             module->base_of_image + module->size_of_image,
-             module->size_of_image);
+             module->BaseOfImage, module->BaseOfImage + module->SizeOfImage,
+             module->SizeOfImage);
 
     // check if the process is wow64 - a 32 bit windows process running on a
     // 64 bit windows
@@ -417,12 +416,12 @@ void ProcessMinidump::ReadModuleList() {
                name);
 
       module_sp = Module::CreateModuleFromObjectFile<PlaceholderObjectFile>(
-          module_spec, module->base_of_image, module->size_of_image);
+          module_spec, module->BaseOfImage, module->SizeOfImage);
       GetTarget().GetImages().Append(module_sp, true /* notify */);
     }
 
     bool load_addr_changed = false;
-    module_sp->SetLoadAddress(GetTarget(), module->base_of_image, false,
+    module_sp->SetLoadAddress(GetTarget(), module->BaseOfImage, false,
                               load_addr_changed);
   }
 }

Modified: lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp?rev=358070&r1=358069&r2=358070&view=diff
==============================================================================
--- lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp (original)
+++ lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp Wed Apr 10 04:07:28 2019
@@ -132,10 +132,10 @@ TEST_F(MinidumpParserTest, GetModuleList
   SetUpData("module-list-not-padded.dmp");
   auto module_list = parser->GetModuleList();
   ASSERT_EQ(2UL, module_list.size());
-  EXPECT_EQ(0x1000UL, module_list[0].base_of_image);
-  EXPECT_EQ(0x2000UL, module_list[0].size_of_image);
-  EXPECT_EQ(0x5000UL, module_list[1].base_of_image);
-  EXPECT_EQ(0x3000UL, module_list[1].size_of_image);
+  EXPECT_EQ(0x1000UL, module_list[0].BaseOfImage);
+  EXPECT_EQ(0x2000UL, module_list[0].SizeOfImage);
+  EXPECT_EQ(0x5000UL, module_list[1].BaseOfImage);
+  EXPECT_EQ(0x3000UL, module_list[1].SizeOfImage);
 }
 
 TEST_F(MinidumpParserTest, GetModuleListPadded) {
@@ -144,10 +144,10 @@ TEST_F(MinidumpParserTest, GetModuleList
   SetUpData("module-list-padded.dmp");
   auto module_list = parser->GetModuleList();
   ASSERT_EQ(2UL, module_list.size());
-  EXPECT_EQ(0x1000UL, module_list[0].base_of_image);
-  EXPECT_EQ(0x2000UL, module_list[0].size_of_image);
-  EXPECT_EQ(0x5000UL, module_list[1].base_of_image);
-  EXPECT_EQ(0x3000UL, module_list[1].size_of_image);
+  EXPECT_EQ(0x1000UL, module_list[0].BaseOfImage);
+  EXPECT_EQ(0x2000UL, module_list[0].SizeOfImage);
+  EXPECT_EQ(0x5000UL, module_list[1].BaseOfImage);
+  EXPECT_EQ(0x3000UL, module_list[1].SizeOfImage);
 }
 
 TEST_F(MinidumpParserTest, GetMemoryListNotPadded) {
@@ -220,10 +220,10 @@ TEST_F(MinidumpParserTest, GetPid) {
 
 TEST_F(MinidumpParserTest, GetModuleList) {
   SetUpData("linux-x86_64.dmp");
-  llvm::ArrayRef<MinidumpModule> modules = parser->GetModuleList();
+  llvm::ArrayRef<minidump::Module> modules = parser->GetModuleList();
   ASSERT_EQ(8UL, modules.size());
   const auto &getName = [&](size_t i) {
-    return parser->GetMinidumpFile().getString(modules[i].module_name_rva);
+    return parser->GetMinidumpFile().getString(modules[i].ModuleNameRVA);
   };
 
   EXPECT_THAT_EXPECTED(
@@ -248,15 +248,15 @@ TEST_F(MinidumpParserTest, GetModuleList
 
 TEST_F(MinidumpParserTest, GetFilteredModuleList) {
   SetUpData("linux-x86_64_not_crashed.dmp");
-  llvm::ArrayRef<MinidumpModule> modules = parser->GetModuleList();
-  std::vector<const MinidumpModule *> filtered_modules =
+  llvm::ArrayRef<minidump::Module> modules = parser->GetModuleList();
+  std::vector<const minidump::Module *> filtered_modules =
       parser->GetFilteredModuleList();
   EXPECT_EQ(10UL, modules.size());
   EXPECT_EQ(9UL, filtered_modules.size());
   std::vector<std::string> names;
-  for (const MinidumpModule *m : filtered_modules)
+  for (const minidump::Module *m : filtered_modules)
     names.push_back(
-        cantFail(parser->GetMinidumpFile().getString(m->module_name_rva)));
+        cantFail(parser->GetMinidumpFile().getString(m->ModuleNameRVA)));
 
   EXPECT_EQ(1u, llvm::count(names, "/tmp/test/linux-x86_64_not_crashed"));
 }
@@ -496,10 +496,10 @@ TEST_F(MinidumpParserTest, GetPidWow64)
 
 TEST_F(MinidumpParserTest, GetModuleListWow64) {
   SetUpData("fizzbuzz_wow64.dmp");
-  llvm::ArrayRef<MinidumpModule> modules = parser->GetModuleList();
+  llvm::ArrayRef<minidump::Module> modules = parser->GetModuleList();
   ASSERT_EQ(16UL, modules.size());
   const auto &getName = [&](size_t i) {
-    return parser->GetMinidumpFile().getString(modules[i].module_name_rva);
+    return parser->GetMinidumpFile().getString(modules[i].ModuleNameRVA);
   };
 
   EXPECT_THAT_EXPECTED(
@@ -654,11 +654,11 @@ TEST_F(MinidumpParserTest, MinidumpDupli
   // That we end up with one module in the filtered list with the
   // range [0x1000-0x2000). MinidumpParser::GetFilteredModuleList() is
   // trying to ensure that if we have the same module mentioned more than
-  // one time, we pick the one with the lowest base_of_image.
-  std::vector<const MinidumpModule *> filtered_modules =
+  // one time, we pick the one with the lowest BaseOfImage.
+  std::vector<const minidump::Module *> filtered_modules =
       parser->GetFilteredModuleList();
   EXPECT_EQ(1u, filtered_modules.size());
-  EXPECT_EQ(0x0000000000001000u, filtered_modules[0]->base_of_image);
+  EXPECT_EQ(0x0000000000001000u, filtered_modules[0]->BaseOfImage);
 }
 
 TEST_F(MinidumpParserTest, MinidumpModuleOrder) {
@@ -670,17 +670,17 @@ TEST_F(MinidumpParserTest, MinidumpModul
   // and in the same order. Previous versions of the
   // MinidumpParser::GetFilteredModuleList() function would sort all images
   // by address and modify the order of the modules.
-  std::vector<const MinidumpModule *> filtered_modules =
+  std::vector<const minidump::Module *> filtered_modules =
       parser->GetFilteredModuleList();
   llvm::Optional<std::string> name;
   EXPECT_EQ(2u, filtered_modules.size());
-  EXPECT_EQ(0x0000000000002000u, filtered_modules[0]->base_of_image);
+  EXPECT_EQ(0x0000000000002000u, filtered_modules[0]->BaseOfImage);
   EXPECT_THAT_EXPECTED(
-      parser->GetMinidumpFile().getString(filtered_modules[0]->module_name_rva),
+      parser->GetMinidumpFile().getString(filtered_modules[0]->ModuleNameRVA),
       llvm::HasValue("/tmp/a"));
-  EXPECT_EQ(0x0000000000001000u, filtered_modules[1]->base_of_image);
+  EXPECT_EQ(0x0000000000001000u, filtered_modules[1]->BaseOfImage);
   EXPECT_THAT_EXPECTED(
-      parser->GetMinidumpFile().getString(filtered_modules[1]->module_name_rva),
+      parser->GetMinidumpFile().getString(filtered_modules[1]->ModuleNameRVA),
       llvm::HasValue("/tmp/b"));
 }
 




More information about the lldb-commits mailing list