https://github.com/splhack created https://github.com/llvm/llvm-project/pull/117070
Addressing two issues on ELF core debugging 1. ProcessElfCore::FindBuidIdInCoreMemory reads wrong address for ELF header (fixed by @clayborg) 2. DynamicLoader does not use ProcessElfCore NT_FILE entries to get UUID. Add FindBuildId to get UUID from Process. >From 179a68a91a0a3eddead9bbf47f70d7a33dbc8018 Mon Sep 17 00:00:00 2001 From: Kazuki Sakamoto <sakam...@splhack.org> Date: Wed, 20 Nov 2024 13:49:26 -0800 Subject: [PATCH] [lldb] Fix ELF core debugging Addressing two issues on ELF core debugging 1. ProcessElfCore::FindBuidIdInCoreMemory reads wrong address for ELF header (fixed by @clayborg) 2. DynamicLoader does not use ProcessElfCore NT_FILE entries to get UUID. Add FindBuildId to get UUID from Process. --- lldb/include/lldb/Target/Process.h | 2 ++ lldb/source/Core/DynamicLoader.cpp | 4 ++++ .../source/Plugins/Process/elf-core/ProcessElfCore.cpp | 10 +++++++++- lldb/source/Plugins/Process/elf-core/ProcessElfCore.h | 3 +++ lldb/source/Target/Process.cpp | 5 +++++ 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index b8c53a474ba6b9..2f0cf78f260c5a 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -1380,6 +1380,8 @@ class Process : public std::enable_shared_from_this<Process>, virtual bool GetProcessInfo(ProcessInstanceInfo &info); + virtual lldb_private::UUID FindBuildId(const llvm::StringRef path); + /// Get the exit status for a process. /// /// \return diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp index 68d6ab0850853f..cc396e92721123 100644 --- a/lldb/source/Core/DynamicLoader.cpp +++ b/lldb/source/Core/DynamicLoader.cpp @@ -157,6 +157,10 @@ DynamicLoader::GetSectionListFromModule(const ModuleSP module) const { ModuleSP DynamicLoader::FindModuleViaTarget(const FileSpec &file) { Target &target = m_process->GetTarget(); ModuleSpec module_spec(file, target.GetArchitecture()); + if (UUID uuid = m_process->FindBuildId(file.GetPath())) { + // Process may have the UUID for the module, e.g. ELF core. + module_spec.GetUUID().SetFromStringRef(uuid.GetAsString()); + } if (ModuleSP module_sp = target.GetImages().FindFirstModule(module_spec)) return module_sp; diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index 7955594bf5d94c..8ad6b83d77effe 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -281,6 +281,13 @@ void ProcessElfCore::UpdateBuildIdForNTFileEntries() { } } +UUID ProcessElfCore::FindBuildId(const llvm::StringRef path) { + for (NT_FILE_Entry &entry : m_nt_file_entries) + if (path == entry.path) + return entry.uuid; + return UUID(); +} + lldb_private::DynamicLoader *ProcessElfCore::GetDynamicLoader() { if (m_dyld_up.get() == nullptr) m_dyld_up.reset(DynamicLoader::FindPlugin( @@ -1034,7 +1041,8 @@ UUID ProcessElfCore::FindBuidIdInCoreMemory(lldb::addr_t address) { std::vector<uint8_t> note_bytes; note_bytes.resize(program_header.p_memsz); - byte_read = ReadMemory(program_header.p_vaddr, note_bytes.data(), + const lldb::addr_t program_header_vaddr = program_header.p_vaddr + address; + byte_read = ReadMemory(program_header_vaddr, note_bytes.data(), program_header.p_memsz, error); if (byte_read != program_header.p_memsz) continue; diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h index 280c61ed376396..303f18249a976e 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h @@ -97,6 +97,9 @@ class ProcessElfCore : public lldb_private::PostMortemProcess { bool GetProcessInfo(lldb_private::ProcessInstanceInfo &info) override; + // Returns the gnu uuid from matched NT_FILE entry + lldb_private::UUID FindBuildId(const llvm::StringRef path) override; + protected: void Clear(); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 9125ceca74a003..d2921f623bbefc 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -6080,6 +6080,11 @@ bool Process::GetProcessInfo(ProcessInstanceInfo &info) { return platform_sp->GetProcessInfo(GetID(), info); } +lldb_private::UUID Process::FindBuildId(const llvm::StringRef path) { + lldb_private::UUID invalid_uuid; + return invalid_uuid; +} + ThreadCollectionSP Process::GetHistoryThreads(lldb::addr_t addr) { ThreadCollectionSP threads; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits