[Lldb-commits] [lldb] [LLDB][PDB] Access object file through module (PR #169728)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Nov 26 12:49:47 PST 2025
https://github.com/Nerixyz created https://github.com/llvm/llvm-project/pull/169728
When a PDB is loaded through `target symbols add <pdb-path>`, its `m_objectfile_sp` is an `ObjectFilePDB` instead of `ObjectFilePECOFF` (the debugged module). In both the native and DIA plugin, some paths assumed that `m_objectfile_sp` is the debugged module. With this PR, they go through `m_objfile_sp->GetModule()->GetObjectFile()`.
For the DIA plugin, this lead to an assertion failure (https://github.com/llvm/llvm-project/issues/169628#issuecomment-3582555277) and for both plugins, it meant that the symbol table wasn't loaded.
>From 2ce6a13861b96842b2f5ae9f7c63913da524088a Mon Sep 17 00:00:00 2001
From: Nerixyz <nerixdev at outlook.de>
Date: Wed, 26 Nov 2025 21:44:22 +0100
Subject: [PATCH] [LLDB][PDB] Access object file through module
---
.../NativePDB/SymbolFileNativePDB.cpp | 3 +-
.../Plugins/SymbolFile/PDB/SymbolFilePDB.cpp | 9 +++--
.../test/Shell/SymbolFile/PDB/add-symbols.cpp | 39 +++++++++++++++++++
3 files changed, 47 insertions(+), 4 deletions(-)
create mode 100644 lldb/test/Shell/SymbolFile/PDB/add-symbols.cpp
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
index aaec1600dacff..40e783f9bad38 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -1126,7 +1126,8 @@ lldb::LanguageType SymbolFileNativePDB::ParseLanguage(CompileUnit &comp_unit) {
}
void SymbolFileNativePDB::AddSymbols(Symtab &symtab) {
- auto *section_list = m_objfile_sp->GetSectionList();
+ auto *section_list =
+ m_objfile_sp->GetModule()->GetObjectFile()->GetSectionList();
if (!section_list)
return;
diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
index 0ccb1804bb13a..97c995fc9b22a 100644
--- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp
@@ -287,8 +287,10 @@ uint32_t SymbolFilePDB::CalculateAbilities() {
}
void SymbolFilePDB::InitializeObject() {
- lldb::addr_t obj_load_address =
- m_objfile_sp->GetBaseAddress().GetFileAddress();
+ lldb::addr_t obj_load_address = m_objfile_sp->GetModule()
+ ->GetObjectFile()
+ ->GetBaseAddress()
+ .GetFileAddress();
lldbassert(obj_load_address && obj_load_address != LLDB_INVALID_ADDRESS);
m_session_up->setLoadAddress(obj_load_address);
if (!m_global_scope_up)
@@ -1479,7 +1481,8 @@ void SymbolFilePDB::AddSymbols(lldb_private::Symtab &symtab) {
if (!results)
return;
- auto section_list = m_objfile_sp->GetSectionList();
+ auto section_list =
+ m_objfile_sp->GetModule()->GetObjectFile()->GetSectionList();
if (!section_list)
return;
diff --git a/lldb/test/Shell/SymbolFile/PDB/add-symbols.cpp b/lldb/test/Shell/SymbolFile/PDB/add-symbols.cpp
new file mode 100644
index 0000000000000..ef7690b1720a6
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/PDB/add-symbols.cpp
@@ -0,0 +1,39 @@
+// REQUIRES: lld, target-windows
+
+// Test that `target symbols add <pdb>` works.
+// RUN: %build --compiler=clang-cl --nodefaultlib --output=%t.exe %s
+// RUN: mv %t.pdb %t-renamed.pdb
+
+// RUN: env LLDB_USE_NATIVE_PDB_READER=0 %lldb \
+// RUN: -o "b main" \
+// RUN: -o "target symbols add %t-renamed.pdb" \
+// RUN: -o r \
+// RUN: -o "target variable a" \
+// RUN: -o "target modules dump symtab" \
+// RUN: -b %t.exe | FileCheck %s
+
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb \
+// RUN: -o "b main" \
+// RUN: -o "target symbols add %t-renamed.pdb" \
+// RUN: -o r \
+// RUN: -o "target variable a" \
+// RUN: -o "target modules dump symtab" \
+// RUN: -b %t.exe | FileCheck %s
+
+// CHECK: target create
+// CHECK: (lldb) b main
+// CHECK-NEXT: Breakpoint 1: no locations (pending).
+// CHECK: (lldb) target symbols add
+// CHECK: 1 location added to breakpoint 1
+// CHECK: (lldb) r
+// CHECK: * thread #1, stop reason = breakpoint 1.1
+// CHECK: (lldb) target variable a
+// CHECK-NEXT: (A) a = (x = 47)
+// CHECK: (lldb) target modules dump symtab
+// CHECK: [{{.*}} main
+
+struct A {
+ int x = 47;
+};
+A a;
+int main() {}
More information about the lldb-commits
mailing list