https://github.com/Jlalond created https://github.com/llvm/llvm-project/pull/120166
In #119598 my recent TLS feature seems to break crashpad symbols. I have a few ideas on how this is happening, but for now as a mitigation I'm checking if the Minidump was LLDB generated, and if so leveraging the dynamic loader. >From 697cf020203bcdee2289e5ba03dcd0d7f459aa90 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Mon, 16 Dec 2024 16:04:01 -0800 Subject: [PATCH] Make workaround for the Dynamic loader issue --- .../Minidump/MinidumpFileBuilder.cpp | 4 +- .../Process/minidump/MinidumpParser.cpp | 25 ++- .../Plugins/Process/minidump/MinidumpParser.h | 8 +- .../Process/minidump/ProcessMinidump.cpp | 205 +++++++++--------- .../Process/minidump/ProcessMinidump.h | 7 +- llvm/include/llvm/BinaryFormat/Minidump.h | 4 + 6 files changed, 137 insertions(+), 116 deletions(-) diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp index bcac5edbc1a793..a4541f8bddf1a2 100644 --- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp +++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp @@ -918,8 +918,8 @@ Status MinidumpFileBuilder::DumpHeader() const { 0u), // not used in most of the writers header.TimeDateStamp = static_cast<llvm::support::ulittle32_t>(std::time(nullptr)); - header.Flags = - static_cast<llvm::support::ulittle64_t>(0u); // minidump normal flag + header.Flags = static_cast<llvm::support::ulittle64_t>( + llvm::minidump::Header::LLDB_HEADER_FLAG); Status error; size_t bytes_written; diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp index afc095ddbb2f91..6a328b3b841ed0 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp @@ -20,8 +20,8 @@ #include <algorithm> #include <map> #include <optional> -#include <vector> #include <utility> +#include <vector> using namespace lldb_private; using namespace minidump; @@ -45,6 +45,10 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetData() { m_data_sp->GetByteSize()); } +const llvm::minidump::Header *MinidumpParser::GetHeader() const { + return reinterpret_cast<llvm::minidump::Header *>(m_file.get()); +} + llvm::ArrayRef<uint8_t> MinidumpParser::GetStream(StreamType stream_type) { return m_file->getRawStream(stream_type).value_or(llvm::ArrayRef<uint8_t>()); } @@ -70,8 +74,7 @@ UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) { if (GetArchitecture().GetTriple().isOSBinFormatELF()) { if (pdb70_uuid->Age != 0) return UUID(pdb70_uuid, sizeof(*pdb70_uuid)); - return UUID(&pdb70_uuid->Uuid, - sizeof(pdb70_uuid->Uuid)); + return UUID(&pdb70_uuid->Uuid, sizeof(pdb70_uuid->Uuid)); } return UUID(*pdb70_uuid); } else if (cv_signature == CvSignature::ElfBuildId) @@ -453,10 +456,12 @@ MinidumpParser::FindMemoryRange(lldb::addr_t addr) { if (!GetStream(StreamType::Memory64List).empty()) { llvm::Error err = llvm::Error::success(); - for (const auto &memory_desc : GetMinidumpFile().getMemory64List(err)) { - if (memory_desc.first.StartOfMemoryRange <= addr - && addr < memory_desc.first.StartOfMemoryRange + memory_desc.first.DataSize) { - return minidump::Range(memory_desc.first.StartOfMemoryRange, memory_desc.second); + for (const auto &memory_desc : GetMinidumpFile().getMemory64List(err)) { + if (memory_desc.first.StartOfMemoryRange <= addr && + addr < memory_desc.first.StartOfMemoryRange + + memory_desc.first.DataSize) { + return minidump::Range(memory_desc.first.StartOfMemoryRange, + memory_desc.second); } } @@ -490,7 +495,8 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetMemory(lldb::addr_t addr, return range->range_ref.slice(offset, overlap); } -llvm::iterator_range<FallibleMemory64Iterator> MinidumpParser::GetMemory64Iterator(llvm::Error &err) { +llvm::iterator_range<FallibleMemory64Iterator> +MinidumpParser::GetMemory64Iterator(llvm::Error &err) { llvm::ErrorAsOutParameter ErrAsOutParam(&err); return m_file->getMemory64List(err); } @@ -602,8 +608,7 @@ std::pair<MemoryRegionInfos, bool> MinidumpParser::BuildMemoryRegions() { case StreamType::ST: \ return #ST -llvm::StringRef -MinidumpParser::GetStreamTypeAsString(StreamType stream_type) { +llvm::StringRef MinidumpParser::GetStreamTypeAsString(StreamType stream_type) { switch (stream_type) { ENUM_TO_CSTR(Unused); ENUM_TO_CSTR(ThreadList); diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h index f0b6e6027c52f0..e13065264668c2 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h @@ -47,7 +47,8 @@ struct Range { } }; -using FallibleMemory64Iterator = llvm::object::MinidumpFile::FallibleMemory64Iterator; +using FallibleMemory64Iterator = + llvm::object::MinidumpFile::FallibleMemory64Iterator; using ExceptionStreamsIterator = llvm::object::MinidumpFile::ExceptionStreamsIterator; @@ -56,6 +57,8 @@ class MinidumpParser { static llvm::Expected<MinidumpParser> Create(const lldb::DataBufferSP &data_buf_sp); + const llvm::minidump::Header *GetHeader() const; + llvm::ArrayRef<uint8_t> GetData(); llvm::ArrayRef<uint8_t> GetStream(StreamType stream_type); @@ -96,7 +99,8 @@ class MinidumpParser { /// complete (includes all regions mapped into the process memory). std::pair<MemoryRegionInfos, bool> BuildMemoryRegions(); - llvm::iterator_range<FallibleMemory64Iterator> GetMemory64Iterator(llvm::Error &err); + llvm::iterator_range<FallibleMemory64Iterator> + GetMemory64Iterator(llvm::Error &err); static llvm::StringRef GetStreamTypeAsString(StreamType stream_type); diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp index 5b0df72130c161..e03e91887781d8 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp @@ -138,7 +138,8 @@ lldb::ProcessSP ProcessMinidump::CreateInstance(lldb::TargetSP target_sp, return nullptr; lldbassert(DataPtr->GetByteSize() == header_size); - if (identify_magic(toStringRef(DataPtr->GetData())) != llvm::file_magic::minidump) + if (identify_magic(toStringRef(DataPtr->GetData())) != + llvm::file_magic::minidump) return nullptr; auto AllData = @@ -344,6 +345,23 @@ ArchSpec ProcessMinidump::GetArchitecture() { return ArchSpec(triple); } +bool ProcessMinidump::IsLLDBMinidump() const { + const llvm::minidump::Header *header = m_minidump_parser->GetHeader(); + if (!header) + return false; + return (header->Flags & llvm::minidump::Header::LLDB_HEADER_FLAG) == 0; +} + +DynamicLoader *ProcessMinidump::GetDynamicLoader() { + // This is a workaround for the dynamic loader not playing nice in issue + // #119598. The specific reason we use the dynamic loader is to get the TLS + // info sections, which we can assume are not being written to the minidump + // unless it's an LLDB generate minidump. + if (IsLLDBMinidump()) + return PostMortemProcess::GetDynamicLoader(); + return nullptr; +} + DataExtractor ProcessMinidump::GetAuxvData() { std::optional<llvm::ArrayRef<uint8_t>> auxv = m_minidump_parser->GetStream(StreamType::LinuxAuxv); @@ -487,8 +505,8 @@ void ProcessMinidump::ReadModuleList() { Log *log = GetLog(LLDBLog::DynamicLoader); for (auto module : filtered_modules) { - std::string name = cantFail(m_minidump_parser->GetMinidumpFile().getString( - module->ModuleNameRVA)); + std::string name = cantFail( + m_minidump_parser->GetMinidumpFile().getString(module->ModuleNameRVA)); const uint64_t load_addr = module->BaseOfImage; const uint64_t load_size = module->SizeOfImage; LLDB_LOG(log, "found module: name: {0} {1:x10}-{2:x10} size: {3}", name, @@ -507,8 +525,8 @@ void ProcessMinidump::ReadModuleList() { Status error; // Try and find a module with a full UUID that matches. This function will // add the module to the target if it finds one. - lldb::ModuleSP module_sp = GetTarget().GetOrCreateModule(module_spec, - true /* notify */, &error); + lldb::ModuleSP module_sp = + GetTarget().GetOrCreateModule(module_spec, true /* notify */, &error); if (module_sp) { LLDB_LOG(log, "Full uuid match for {0}.", name); } else { @@ -532,9 +550,8 @@ void ProcessMinidump::ReadModuleList() { // we don't then we will end up setting the load address of a different // ObjectFilePlaceholder and an assertion will fire. auto *objfile = module_sp->GetObjectFile(); - if (objfile && - objfile->GetPluginName() == - ObjectFilePlaceholder::GetPluginNameStatic()) { + if (objfile && objfile->GetPluginName() == + ObjectFilePlaceholder::GetPluginNameStatic()) { if (((ObjectFilePlaceholder *)objfile)->GetBaseImageAddress() != load_addr) module_sp.reset(); @@ -564,8 +581,7 @@ void ProcessMinidump::ReadModuleList() { } bool load_addr_changed = false; - module_sp->SetLoadAddress(GetTarget(), load_addr, false, - load_addr_changed); + module_sp->SetLoadAddress(GetTarget(), load_addr, false, load_addr_changed); } } @@ -593,10 +609,10 @@ JITLoaderList &ProcessMinidump::GetJITLoaders() { return *m_jit_loaders_up; } -#define INIT_BOOL(VAR, LONG, SHORT, DESC) \ - VAR(LLDB_OPT_SET_1, false, LONG, SHORT, DESC, false, true) -#define APPEND_OPT(VAR) \ - m_option_group.Append(&VAR, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1) +#define INIT_BOOL(VAR, LONG, SHORT, DESC) \ + VAR(LLDB_OPT_SET_1, false, LONG, SHORT, DESC, false, true) +#define APPEND_OPT(VAR) \ + m_option_group.Append(&VAR, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1) class CommandObjectProcessMinidumpDump : public CommandObjectParsed { private: @@ -657,55 +673,50 @@ class CommandObjectProcessMinidumpDump : public CommandObjectParsed { // If no options were set, then dump everything m_dump_all.GetOptionValue().SetCurrentValue(true); } - bool DumpAll() const { - return m_dump_all.GetOptionValue().GetCurrentValue(); - } + bool DumpAll() const { return m_dump_all.GetOptionValue().GetCurrentValue(); } bool DumpDirectory() const { - return DumpAll() || - m_dump_directory.GetOptionValue().GetCurrentValue(); + return DumpAll() || m_dump_directory.GetOptionValue().GetCurrentValue(); } bool DumpLinux() const { return DumpAll() || m_dump_linux_all.GetOptionValue().GetCurrentValue(); } bool DumpLinuxCPUInfo() const { return DumpLinux() || - m_dump_linux_cpuinfo.GetOptionValue().GetCurrentValue(); + m_dump_linux_cpuinfo.GetOptionValue().GetCurrentValue(); } bool DumpLinuxProcStatus() const { return DumpLinux() || - m_dump_linux_proc_status.GetOptionValue().GetCurrentValue(); + m_dump_linux_proc_status.GetOptionValue().GetCurrentValue(); } bool DumpLinuxProcStat() const { return DumpLinux() || - m_dump_linux_proc_stat.GetOptionValue().GetCurrentValue(); + m_dump_linux_proc_stat.GetOptionValue().GetCurrentValue(); } bool DumpLinuxLSBRelease() const { return DumpLinux() || - m_dump_linux_lsb_release.GetOptionValue().GetCurrentValue(); + m_dump_linux_lsb_release.GetOptionValue().GetCurrentValue(); } bool DumpLinuxCMDLine() const { return DumpLinux() || - m_dump_linux_cmdline.GetOptionValue().GetCurrentValue(); + m_dump_linux_cmdline.GetOptionValue().GetCurrentValue(); } bool DumpLinuxEnviron() const { return DumpLinux() || - m_dump_linux_environ.GetOptionValue().GetCurrentValue(); + m_dump_linux_environ.GetOptionValue().GetCurrentValue(); } bool DumpLinuxAuxv() const { - return DumpLinux() || - m_dump_linux_auxv.GetOptionValue().GetCurrentValue(); + return DumpLinux() || m_dump_linux_auxv.GetOptionValue().GetCurrentValue(); } bool DumpLinuxMaps() const { - return DumpLinux() || - m_dump_linux_maps.GetOptionValue().GetCurrentValue(); + return DumpLinux() || m_dump_linux_maps.GetOptionValue().GetCurrentValue(); } bool DumpLinuxProcUptime() const { return DumpLinux() || - m_dump_linux_proc_uptime.GetOptionValue().GetCurrentValue(); + m_dump_linux_proc_uptime.GetOptionValue().GetCurrentValue(); } bool DumpLinuxProcFD() const { return DumpLinux() || - m_dump_linux_proc_fd.GetOptionValue().GetCurrentValue(); + m_dump_linux_proc_fd.GetOptionValue().GetCurrentValue(); } bool DumpFacebook() const { return DumpAll() || m_fb_all.GetOptionValue().GetCurrentValue(); @@ -743,60 +754,59 @@ class CommandObjectProcessMinidumpDump : public CommandObjectParsed { bool DumpFacebookLogcat() const { return DumpFacebook() || m_fb_logcat.GetOptionValue().GetCurrentValue(); } + public: CommandObjectProcessMinidumpDump(CommandInterpreter &interpreter) - : CommandObjectParsed(interpreter, "process plugin dump", - "Dump information from the minidump file.", nullptr), - m_option_group(), - INIT_BOOL(m_dump_all, "all", 'a', - "Dump the everything in the minidump."), - INIT_BOOL(m_dump_directory, "directory", 'd', - "Dump the minidump directory map."), - INIT_BOOL(m_dump_linux_cpuinfo, "cpuinfo", 'C', - "Dump linux /proc/cpuinfo."), - INIT_BOOL(m_dump_linux_proc_status, "status", 's', - "Dump linux /proc/<pid>/status."), - INIT_BOOL(m_dump_linux_lsb_release, "lsb-release", 'r', - "Dump linux /etc/lsb-release."), - INIT_BOOL(m_dump_linux_cmdline, "cmdline", 'c', - "Dump linux /proc/<pid>/cmdline."), - INIT_BOOL(m_dump_linux_environ, "environ", 'e', - "Dump linux /proc/<pid>/environ."), - INIT_BOOL(m_dump_linux_auxv, "auxv", 'x', - "Dump linux /proc/<pid>/auxv."), - INIT_BOOL(m_dump_linux_maps, "maps", 'm', - "Dump linux /proc/<pid>/maps."), - INIT_BOOL(m_dump_linux_proc_stat, "stat", 'S', - "Dump linux /proc/<pid>/stat."), - INIT_BOOL(m_dump_linux_proc_uptime, "uptime", 'u', - "Dump linux process uptime."), - INIT_BOOL(m_dump_linux_proc_fd, "fd", 'f', - "Dump linux /proc/<pid>/fd."), - INIT_BOOL(m_dump_linux_all, "linux", 'l', - "Dump all linux streams."), - INIT_BOOL(m_fb_app_data, "fb-app-data", 1, - "Dump Facebook application custom data."), - INIT_BOOL(m_fb_build_id, "fb-build-id", 2, - "Dump the Facebook build ID."), - INIT_BOOL(m_fb_version, "fb-version", 3, - "Dump Facebook application version string."), - INIT_BOOL(m_fb_java_stack, "fb-java-stack", 4, - "Dump Facebook java stack."), - INIT_BOOL(m_fb_dalvik, "fb-dalvik-info", 5, - "Dump Facebook Dalvik info."), - INIT_BOOL(m_fb_unwind, "fb-unwind-symbols", 6, - "Dump Facebook unwind symbols."), - INIT_BOOL(m_fb_error_log, "fb-error-log", 7, - "Dump Facebook error log."), - INIT_BOOL(m_fb_app_state, "fb-app-state-log", 8, - "Dump Facebook java stack."), - INIT_BOOL(m_fb_abort, "fb-abort-reason", 9, - "Dump Facebook abort reason."), - INIT_BOOL(m_fb_thread, "fb-thread-name", 10, - "Dump Facebook thread name."), - INIT_BOOL(m_fb_logcat, "fb-logcat", 11, - "Dump Facebook logcat."), - INIT_BOOL(m_fb_all, "facebook", 12, "Dump all Facebook streams.") { + : CommandObjectParsed(interpreter, "process plugin dump", + "Dump information from the minidump file.", + nullptr), + m_option_group(), INIT_BOOL(m_dump_all, "all", 'a', + "Dump the everything in the minidump."), + INIT_BOOL(m_dump_directory, "directory", 'd', + "Dump the minidump directory map."), + INIT_BOOL(m_dump_linux_cpuinfo, "cpuinfo", 'C', + "Dump linux /proc/cpuinfo."), + INIT_BOOL(m_dump_linux_proc_status, "status", 's', + "Dump linux /proc/<pid>/status."), + INIT_BOOL(m_dump_linux_lsb_release, "lsb-release", 'r', + "Dump linux /etc/lsb-release."), + INIT_BOOL(m_dump_linux_cmdline, "cmdline", 'c', + "Dump linux /proc/<pid>/cmdline."), + INIT_BOOL(m_dump_linux_environ, "environ", 'e', + "Dump linux /proc/<pid>/environ."), + INIT_BOOL(m_dump_linux_auxv, "auxv", 'x', + "Dump linux /proc/<pid>/auxv."), + INIT_BOOL(m_dump_linux_maps, "maps", 'm', + "Dump linux /proc/<pid>/maps."), + INIT_BOOL(m_dump_linux_proc_stat, "stat", 'S', + "Dump linux /proc/<pid>/stat."), + INIT_BOOL(m_dump_linux_proc_uptime, "uptime", 'u', + "Dump linux process uptime."), + INIT_BOOL(m_dump_linux_proc_fd, "fd", 'f', + "Dump linux /proc/<pid>/fd."), + INIT_BOOL(m_dump_linux_all, "linux", 'l', "Dump all linux streams."), + INIT_BOOL(m_fb_app_data, "fb-app-data", 1, + "Dump Facebook application custom data."), + INIT_BOOL(m_fb_build_id, "fb-build-id", 2, + "Dump the Facebook build ID."), + INIT_BOOL(m_fb_version, "fb-version", 3, + "Dump Facebook application version string."), + INIT_BOOL(m_fb_java_stack, "fb-java-stack", 4, + "Dump Facebook java stack."), + INIT_BOOL(m_fb_dalvik, "fb-dalvik-info", 5, + "Dump Facebook Dalvik info."), + INIT_BOOL(m_fb_unwind, "fb-unwind-symbols", 6, + "Dump Facebook unwind symbols."), + INIT_BOOL(m_fb_error_log, "fb-error-log", 7, + "Dump Facebook error log."), + INIT_BOOL(m_fb_app_state, "fb-app-state-log", 8, + "Dump Facebook java stack."), + INIT_BOOL(m_fb_abort, "fb-abort-reason", 9, + "Dump Facebook abort reason."), + INIT_BOOL(m_fb_thread, "fb-thread-name", 10, + "Dump Facebook thread name."), + INIT_BOOL(m_fb_logcat, "fb-logcat", 11, "Dump Facebook logcat."), + INIT_BOOL(m_fb_all, "facebook", 12, "Dump all Facebook streams.") { APPEND_OPT(m_dump_all); APPEND_OPT(m_dump_directory); APPEND_OPT(m_dump_linux_cpuinfo); @@ -899,8 +909,7 @@ class CommandObjectProcessMinidumpDump : public CommandObjectParsed { if (DumpLinuxProcFD()) DumpTextStream(StreamType::LinuxProcFD, "/proc/PID/fd"); if (DumpFacebookAppData()) - DumpTextStream(StreamType::FacebookAppCustomData, - "Facebook App Data"); + DumpTextStream(StreamType::FacebookAppCustomData, "Facebook App Data"); if (DumpFacebookBuildID()) { auto bytes = minidump.GetStream(StreamType::FacebookBuildID); if (bytes.size() >= 4) { @@ -917,26 +926,21 @@ class CommandObjectProcessMinidumpDump : public CommandObjectParsed { DumpTextStream(StreamType::FacebookAppVersionName, "Facebook Version String"); if (DumpFacebookJavaStack()) - DumpTextStream(StreamType::FacebookJavaStack, - "Facebook Java Stack"); + DumpTextStream(StreamType::FacebookJavaStack, "Facebook Java Stack"); if (DumpFacebookDalvikInfo()) - DumpTextStream(StreamType::FacebookDalvikInfo, - "Facebook Dalvik Info"); + DumpTextStream(StreamType::FacebookDalvikInfo, "Facebook Dalvik Info"); if (DumpFacebookUnwindSymbols()) DumpBinaryStream(StreamType::FacebookUnwindSymbols, "Facebook Unwind Symbols Bytes"); if (DumpFacebookErrorLog()) - DumpTextStream(StreamType::FacebookDumpErrorLog, - "Facebook Error Log"); + DumpTextStream(StreamType::FacebookDumpErrorLog, "Facebook Error Log"); if (DumpFacebookAppStateLog()) DumpTextStream(StreamType::FacebookAppStateLog, "Faceook Application State Log"); if (DumpFacebookAbortReason()) - DumpTextStream(StreamType::FacebookAbortReason, - "Facebook Abort Reason"); + DumpTextStream(StreamType::FacebookAbortReason, "Facebook Abort Reason"); if (DumpFacebookThreadName()) - DumpTextStream(StreamType::FacebookThreadName, - "Facebook Thread Name"); + DumpTextStream(StreamType::FacebookThreadName, "Facebook Thread Name"); if (DumpFacebookLogcat()) DumpTextStream(StreamType::FacebookLogcat, "Facebook Logcat"); } @@ -945,11 +949,12 @@ class CommandObjectProcessMinidumpDump : public CommandObjectParsed { class CommandObjectMultiwordProcessMinidump : public CommandObjectMultiword { public: CommandObjectMultiwordProcessMinidump(CommandInterpreter &interpreter) - : CommandObjectMultiword(interpreter, "process plugin", - "Commands for operating on a ProcessMinidump process.", - "process plugin <subcommand> [<subcommand-options>]") { - LoadSubCommand("dump", - CommandObjectSP(new CommandObjectProcessMinidumpDump(interpreter))); + : CommandObjectMultiword( + interpreter, "process plugin", + "Commands for operating on a ProcessMinidump process.", + "process plugin <subcommand> [<subcommand-options>]") { + LoadSubCommand("dump", CommandObjectSP(new CommandObjectProcessMinidumpDump( + interpreter))); } ~CommandObjectMultiwordProcessMinidump() override = default; diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h b/lldb/source/Plugins/Process/minidump/ProcessMinidump.h index 3d235670a33abc..1cc1e8addb15d9 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.h @@ -53,6 +53,8 @@ class ProcessMinidump : public PostMortemProcess { Status DoLoadCore() override; + DynamicLoader *GetDynamicLoader() override; + // Returns AUXV structure found in the core file lldb_private::DataExtractor GetAuxvData() override; @@ -74,8 +76,8 @@ class ProcessMinidump : public PostMortemProcess { ArchSpec GetArchitecture(); - Status GetMemoryRegions( - lldb_private::MemoryRegionInfos ®ion_list) override; + Status + GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override; bool GetProcessInfo(ProcessInstanceInfo &info) override; @@ -113,6 +115,7 @@ class ProcessMinidump : public PostMortemProcess { std::optional<MemoryRegionInfos> m_memory_regions; void BuildMemoryRegions(); + bool IsLLDBMinidump() const; }; } // namespace minidump diff --git a/llvm/include/llvm/BinaryFormat/Minidump.h b/llvm/include/llvm/BinaryFormat/Minidump.h index 03497d4c5fa66f..75762d3196dfcd 100644 --- a/llvm/include/llvm/BinaryFormat/Minidump.h +++ b/llvm/include/llvm/BinaryFormat/Minidump.h @@ -32,6 +32,10 @@ LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); struct Header { static constexpr uint32_t MagicSignature = 0x504d444d; // PMDM static constexpr uint16_t MagicVersion = 0xa793; + // We set all the high bits flag to indicate this is from LLDB. + // We don't want to conflict with anything Microsoft is using the flags for + // and the highest bits are not currently being used. + static const uint32_t LLDB_HEADER_FLAG = 0xF0000000; support::ulittle32_t Signature; // The high 16 bits of version field are implementation specific. The low 16 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits