Author: labath Date: Mon Apr 8 02:53:03 2019 New Revision: 357896 URL: http://llvm.org/viewvc/llvm-project?rev=357896&view=rev Log: MinidumpParser: parse SystemInfo stream via llvm
I also update the tests for SystemInfo parsing to use the yaml2minidump capabilities in llvm instead of relying on checked-in binaries. Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h 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=357896&r1=357895&r2=357896&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp Mon Apr 8 02:53:03 2019 @@ -12,6 +12,7 @@ #include "Plugins/Process/Utility/LinuxProcMaps.h" #include "lldb/Utility/LLDBAssert.h" +#include "lldb/Utility/Log.h" // C includes // C++ includes @@ -180,29 +181,19 @@ MinidumpParser::GetThreadContextWow64(co // stored in the first slot of the 64-bit TEB (wow64teb.Reserved1[0]). } -const SystemInfo *MinidumpParser::GetSystemInfo() { - llvm::ArrayRef<uint8_t> data = GetStream(StreamType::SystemInfo); - - if (data.size() == 0) - return nullptr; - const SystemInfo *system_info; - - Status error = consumeObject(data, system_info); - if (error.Fail()) - return nullptr; - - return system_info; -} - ArchSpec MinidumpParser::GetArchitecture() { if (m_arch.IsValid()) return m_arch; // Set the architecture in m_arch - const SystemInfo *system_info = GetSystemInfo(); + llvm::Expected<const SystemInfo &> system_info = m_file->getSystemInfo(); - if (!system_info) + if (!system_info) { + LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS), + system_info.takeError(), + "Failed to read SystemInfo stream: {0}"); return m_arch; + } // TODO what to do about big endiand flavors of arm ? // TODO set the arm subarch stuff if the minidump has info about it 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=357896&r1=357895&r2=357896&view=diff ============================================================================== --- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h (original) +++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h Mon Apr 8 02:53:03 2019 @@ -64,8 +64,6 @@ public: llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td); - const SystemInfo *GetSystemInfo(); - ArchSpec GetArchitecture(); const MinidumpMiscInfo *GetMiscInfo(); Modified: lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp?rev=357896&r1=357895&r2=357896&view=diff ============================================================================== --- lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp (original) +++ lldb/trunk/unittests/Process/minidump/MinidumpParserTest.cpp Mon Apr 8 02:53:03 2019 @@ -51,6 +51,22 @@ public: ASSERT_GT(parser->GetData().size(), 0UL); } + llvm::Error SetUpFromYaml(llvm::StringRef yaml) { + std::string data; + llvm::raw_string_ostream os(data); + if (llvm::Error E = llvm::MinidumpYAML::writeAsBinary(yaml, os)) + return E; + + os.flush(); + auto data_buffer_sp = + std::make_shared<DataBufferHeap>(data.data(), data.size()); + auto expected_parser = MinidumpParser::Create(std::move(data_buffer_sp)); + if (!expected_parser) + return expected_parser.takeError(); + parser = std::move(*expected_parser); + return llvm::Error::success(); + } + llvm::Optional<MinidumpParser> parser; }; @@ -159,7 +175,22 @@ TEST_F(MinidumpParserTest, GetMemoryList } TEST_F(MinidumpParserTest, GetArchitecture) { - SetUpData("linux-x86_64.dmp"); + ASSERT_THAT_ERROR(SetUpFromYaml(R"( +--- !minidump +Streams: + - Type: SystemInfo + Processor Arch: AMD64 + Processor Level: 6 + Processor Revision: 16130 + Number of Processors: 1 + Platform ID: Linux + CPU: + Vendor ID: GenuineIntel + Version Info: 0x00000000 + Feature Info: 0x00000000 +... +)"), + llvm::Succeeded()); ASSERT_EQ(llvm::Triple::ArchType::x86_64, parser->GetArchitecture().GetMachine()); ASSERT_EQ(llvm::Triple::OSType::Linux, @@ -404,15 +435,37 @@ TEST_F(MinidumpParserTest, GetMemoryRegi } // Windows Minidump tests -// fizzbuzz_no_heap.dmp is copied from the WinMiniDump tests TEST_F(MinidumpParserTest, GetArchitectureWindows) { - SetUpData("fizzbuzz_no_heap.dmp"); + ASSERT_THAT_ERROR(SetUpFromYaml(R"( +--- !minidump +Streams: + - Type: SystemInfo + Processor Arch: X86 + Processor Level: 6 + Processor Revision: 15876 + Number of Processors: 32 + Product type: 1 + Major Version: 6 + Minor Version: 1 + Build Number: 7601 + Platform ID: Win32NT + CSD Version: Service Pack 1 + Suite Mask: 0x0100 + CPU: + Vendor ID: GenuineIntel + Version Info: 0x000306E4 + Feature Info: 0xBFEBFBFF + AMD Extended Features: 0x771EEC80 +... +)"), + llvm::Succeeded()); ASSERT_EQ(llvm::Triple::ArchType::x86, parser->GetArchitecture().GetMachine()); ASSERT_EQ(llvm::Triple::OSType::Win32, parser->GetArchitecture().GetTriple().getOS()); } +// fizzbuzz_no_heap.dmp is copied from the WinMiniDump tests TEST_F(MinidumpParserTest, GetLinuxProcStatusWindows) { SetUpData("fizzbuzz_no_heap.dmp"); llvm::Optional<LinuxProcStatus> proc_status = parser->GetLinuxProcStatus(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits