https://github.com/splhack updated https://github.com/llvm/llvm-project/pull/117070
>From 6b8f4a824d39ce557230e610a846d316358b4f20 Mon Sep 17 00:00:00 2001 From: Kazuki Sakamoto <sakam...@splhack.org> Date: Wed, 20 Nov 2024 16:20:40 -0800 Subject: [PATCH 1/2] Run clang format. --- lldb/source/Core/DynamicLoader.cpp | 7 +++--- .../Process/elf-core/ProcessElfCore.cpp | 25 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp index 68d6ab0850853f..34f0661a312bb6 100644 --- a/lldb/source/Core/DynamicLoader.cpp +++ b/lldb/source/Core/DynamicLoader.cpp @@ -368,8 +368,7 @@ addr_t DynamicLoader::ReadPointer(addr_t addr) { return value; } -void DynamicLoader::LoadOperatingSystemPlugin(bool flush) -{ - if (m_process) - m_process->LoadOperatingSystemPlugin(flush); +void DynamicLoader::LoadOperatingSystemPlugin(bool flush) { + if (m_process) + m_process->LoadOperatingSystemPlugin(flush); } diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp index 7955594bf5d94c..3a4f42bb8ca392 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -224,7 +224,7 @@ Status ProcessElfCore::DoLoadCore() { ArchSpec core_arch(m_core_module_sp->GetArchitecture()); target_arch.MergeFrom(core_arch); GetTarget().SetArchitecture(target_arch); - + SetUnixSignals(UnixSignals::Create(GetArchitecture())); // Ensure we found at least one thread that was stopped on a signal. @@ -393,7 +393,7 @@ size_t ProcessElfCore::DoReadMemory(lldb::addr_t addr, void *buf, size_t size, const lldb::addr_t file_start = address_range->data.GetRangeBase(); const lldb::addr_t file_end = address_range->data.GetRangeEnd(); size_t bytes_to_read = size; // Number of bytes to read from the core file - size_t bytes_copied = 0; // Number of bytes actually read from the core file + size_t bytes_copied = 0; // Number of bytes actually read from the core file lldb::addr_t bytes_left = 0; // Number of bytes available in the core file from the given address @@ -476,8 +476,7 @@ lldb::addr_t ProcessElfCore::GetImageInfoAddress() { // Parse a FreeBSD NT_PRSTATUS note - see FreeBSD sys/procfs.h for details. static void ParseFreeBSDPrStatus(ThreadData &thread_data, - const DataExtractor &data, - bool lp64) { + const DataExtractor &data, bool lp64) { lldb::offset_t offset = 0; int pr_version = data.GetU32(&offset); @@ -504,8 +503,7 @@ static void ParseFreeBSDPrStatus(ThreadData &thread_data, // Parse a FreeBSD NT_PRPSINFO note - see FreeBSD sys/procfs.h for details. static void ParseFreeBSDPrPsInfo(ProcessElfCore &process, - const DataExtractor &data, - bool lp64) { + const DataExtractor &data, bool lp64) { lldb::offset_t offset = 0; int pr_version = data.GetU32(&offset); @@ -524,8 +522,7 @@ static void ParseFreeBSDPrPsInfo(ProcessElfCore &process, } static llvm::Error ParseNetBSDProcInfo(const DataExtractor &data, - uint32_t &cpi_nlwps, - uint32_t &cpi_signo, + uint32_t &cpi_nlwps, uint32_t &cpi_signo, uint32_t &cpi_siglwp, uint32_t &cpi_pid) { lldb::offset_t offset = 0; @@ -693,8 +690,8 @@ llvm::Error ProcessElfCore::parseNetBSDNotes(llvm::ArrayRef<CoreNote> notes) { if (name == "NetBSD-CORE") { if (note.info.n_type == NETBSD::NT_PROCINFO) { - llvm::Error error = ParseNetBSDProcInfo(note.data, nlwps, signo, - siglwp, pr_pid); + llvm::Error error = + ParseNetBSDProcInfo(note.data, nlwps, signo, siglwp, pr_pid); if (error) return error; SetID(pr_pid); @@ -875,7 +872,7 @@ llvm::Error ProcessElfCore::parseOpenBSDNotes(llvm::ArrayRef<CoreNote> notes) { /// - NT_SIGINFO - Information about the signal that terminated the process /// - NT_AUXV - Process auxiliary vector /// - NT_FILE - Files mapped into memory -/// +/// /// Additionally, for each thread in the process the core file will contain at /// least the NT_PRSTATUS note, containing the thread id and general purpose /// registers. It may include additional notes for other register sets (floating @@ -920,7 +917,9 @@ llvm::Error ProcessElfCore::parseLinuxNotes(llvm::ArrayRef<CoreNote> notes) { Status status = prpsinfo.Parse(note.data, arch); if (status.Fail()) return status.ToError(); - thread_data.name.assign (prpsinfo.pr_fname, strnlen (prpsinfo.pr_fname, sizeof (prpsinfo.pr_fname))); + thread_data.name.assign( + prpsinfo.pr_fname, + strnlen(prpsinfo.pr_fname, sizeof(prpsinfo.pr_fname))); SetID(prpsinfo.pr_pid); break; } @@ -975,7 +974,7 @@ llvm::Error ProcessElfCore::ParseThreadContextsFromNoteSegment( assert(segment_header.p_type == llvm::ELF::PT_NOTE); auto notes_or_error = parseSegment(segment_data); - if(!notes_or_error) + if (!notes_or_error) return notes_or_error.takeError(); switch (GetArchitecture().GetTriple().getOS()) { case llvm::Triple::FreeBSD: >From b285bba80b7b7ad4e351485d59df41f328462867 Mon Sep 17 00:00:00 2001 From: Kazuki Sakamoto <sakam...@splhack.org> Date: Wed, 20 Nov 2024 13:49:26 -0800 Subject: [PATCH 2/2] [lldb] Fix ELF core debugging DynamicLoader does not use ProcessElfCore NT_FILE entries to get UUID. Use GetModuleSpec to get UUID from Process. --- lldb/source/Core/DynamicLoader.cpp | 5 +++++ .../Plugins/Process/elf-core/ProcessElfCore.cpp | 16 ++++++++++++++++ .../Plugins/Process/elf-core/ProcessElfCore.h | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp index 34f0661a312bb6..03f360c59d65e3 100644 --- a/lldb/source/Core/DynamicLoader.cpp +++ b/lldb/source/Core/DynamicLoader.cpp @@ -157,6 +157,11 @@ DynamicLoader::GetSectionListFromModule(const ModuleSP module) const { ModuleSP DynamicLoader::FindModuleViaTarget(const FileSpec &file) { Target &target = m_process->GetTarget(); ModuleSpec module_spec(file, target.GetArchitecture()); + ModuleSpec module_spec_from_process; + // Process may be able to augment the module_spec with UUID, e.g. ELF core. + if (m_process->GetModuleSpec(file, target.GetArchitecture(), module_spec_from_process)) { + module_spec = module_spec_from_process; + } 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 3a4f42bb8ca392..568c42089851d8 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -281,6 +281,22 @@ void ProcessElfCore::UpdateBuildIdForNTFileEntries() { } } +bool ProcessElfCore::GetModuleSpec(const FileSpec &module_file_spec, + const ArchSpec &arch, + ModuleSpec &module_spec) { + module_spec.Clear(); + for (NT_FILE_Entry &entry : m_nt_file_entries) { + if (module_file_spec.GetPath() == entry.path) { + module_spec.GetFileSpec() = module_file_spec; + module_spec.GetArchitecture() = arch; + module_spec.GetUUID().SetFromStringRef(entry.uuid.GetAsString()); + return true; + } + } + + return false; +} + lldb_private::DynamicLoader *ProcessElfCore::GetDynamicLoader() { if (m_dyld_up.get() == nullptr) m_dyld_up.reset(DynamicLoader::FindPlugin( diff --git a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h index 280c61ed376396..a7b1822ccf01ff 100644 --- a/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h +++ b/lldb/source/Plugins/Process/elf-core/ProcessElfCore.h @@ -163,6 +163,10 @@ class ProcessElfCore : public lldb_private::PostMortemProcess { // Populate gnu uuid for each NT_FILE entry void UpdateBuildIdForNTFileEntries(); + bool GetModuleSpec(const lldb_private::FileSpec &module_file_spec, + const lldb_private::ArchSpec &arch, + lldb_private::ModuleSpec &module_spec) override; + // Returns the value of certain type of note of a given start address lldb_private::UUID FindBuidIdInCoreMemory(lldb::addr_t address); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits