diff options
Diffstat (limited to 'lldb/source/Plugins/Process')
5 files changed, 36 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index b3916cc913f7..5f85f99ce7bd 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -1031,6 +1031,8 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) { std::vector<uint8_t> ph_bytes; ph_bytes.resize(elf_header.e_phentsize); + lldb::addr_t base_addr = 0; + bool found_first_load_segment = false; for (unsigned int i = 0; i < elf_header.e_phnum; ++i) { byte_read = ReadMemory(ph_addr + i * elf_header.e_phentsize, ph_bytes.data(), elf_header.e_phentsize, error); @@ -1041,6 +1043,11 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) { offset = 0; elf::ELFProgramHeader program_header; program_header.Parse(program_header_data, &offset); + if (program_header.p_type == llvm::ELF::PT_LOAD && + !found_first_load_segment) { + base_addr = program_header.p_vaddr; + found_first_load_segment = true; + } if (program_header.p_type != llvm::ELF::PT_NOTE) continue; @@ -1049,7 +1056,7 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) { // We need to slide the address of the p_vaddr as these values don't get // relocated in memory. - const lldb::addr_t vaddr = program_header.p_vaddr + address; + const lldb::addr_t vaddr = program_header.p_vaddr + address - base_addr; byte_read = ReadMemory(vaddr, note_bytes.data(), program_header.p_memsz, error); if (byte_read != program_header.p_memsz) diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp index afc095ddbb2f..94c0a5f11e43 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp @@ -49,6 +49,11 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetStream(StreamType stream_type) { return m_file->getRawStream(stream_type).value_or(llvm::ArrayRef<uint8_t>()); } +std::optional<llvm::ArrayRef<uint8_t>> +MinidumpParser::GetRawStream(StreamType stream_type) { + return m_file->getRawStream(stream_type); +} + UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) { auto cv_record = GetData().slice(module->CvRecord.RVA, module->CvRecord.DataSize); @@ -651,6 +656,7 @@ MinidumpParser::GetStreamTypeAsString(StreamType stream_type) { ENUM_TO_CSTR(FacebookAbortReason); ENUM_TO_CSTR(FacebookThreadName); ENUM_TO_CSTR(FacebookLogcat); + ENUM_TO_CSTR(LLDBGenerated); } return "unknown stream type"; } diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h index f0b6e6027c52..2c5e6f19ff9a 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h @@ -59,6 +59,7 @@ public: llvm::ArrayRef<uint8_t> GetData(); llvm::ArrayRef<uint8_t> GetStream(StreamType stream_type); + std::optional<llvm::ArrayRef<uint8_t>> GetRawStream(StreamType stream_type); UUID GetModuleUUID(const minidump::Module *module); diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp index 5b0df72130c1..05b3bb9f54f9 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp @@ -354,6 +354,22 @@ DataExtractor ProcessMinidump::GetAuxvData() { GetAddressByteSize(), GetAddressByteSize()); } +bool ProcessMinidump::IsLLDBMinidump() { + std::optional<llvm::ArrayRef<uint8_t>> lldb_generated_section = + m_minidump_parser->GetRawStream(StreamType::LLDBGenerated); + return lldb_generated_section.has_value(); +} + +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; +} + void ProcessMinidump::BuildMemoryRegions() { if (m_memory_regions) return; diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h b/lldb/source/Plugins/Process/minidump/ProcessMinidump.h index 3d235670a33a..ad8d0ed7a483 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.h @@ -53,6 +53,8 @@ public: Status DoLoadCore() override; + DynamicLoader *GetDynamicLoader() override; + // Returns AUXV structure found in the core file lldb_private::DataExtractor GetAuxvData() override; @@ -74,8 +76,8 @@ public: 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 @@ private: std::optional<MemoryRegionInfos> m_memory_regions; void BuildMemoryRegions(); + bool IsLLDBMinidump(); }; } // namespace minidump |
