[Lldb-commits] [PATCH] D84815: [LLDB] Improve PDB discovery

Adrian McCarthy via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri Aug 7 13:36:54 PDT 2020

amccarth updated this revision to Diff 284025.
amccarth added a comment.

Added test to check locating the PDB either in the original build directory or adjacent to the executable.

I tried but failed to make a negative test.  LLDB sends the errors message to stderr when the `target modules dump symfile` command fails.  I tried using redirects to combine stdout and stderr, but lit's built-in shell told me that was unsupported.  I couldn't find a good way to arrange FileCheck to confirm the absence case.




Index: lldb/test/Shell/SymbolFile/NativePDB/locate-pdb.cpp
--- /dev/null
+++ lldb/test/Shell/SymbolFile/NativePDB/locate-pdb.cpp
@@ -0,0 +1,34 @@
+// clang-format off
+// REQUIRES: lld, x86
+// Test that lldb can find the PDB file that corresponds to the executable.  The linker
+// writes a path to the PDB in the executable.  If the PDB is not there, lldb should
+// check the directory that contains the executable.  We'll generate the PDB file in
+// a subdirectory and then move it into the directory with the executable.  That will
+// ensure the PDB path stored in the executable is wrong.
+// Build an EXE and PDB in different directories
+// RUN: mkdir -p %t/executable
+// RUN: rm -f %t/executable/foo.exe %t/executable/bar.pdb
+// RUN: mkdir -p %t/symbols
+// RUN: rm -f %t/symbols/bar.pdb
+// RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -c /Fo%t/executable/foo.obj -- %s
+// RUN: lld-link -debug:full -nodefaultlib -entry:main %t/executable/foo.obj \
+// RUN:     -out:%t/executable/foo.exe -pdb:%t/symbols/bar.pdb
+// Find the PDB in its build location
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t/executable/foo.exe -s \
+// RUN:     %p/Inputs/locate-pdb.lldbinit | FileCheck %s
+// Also find the PDB when it's adjacent to the executable
+// RUN: mv -f %t/symbols/bar.pdb %t/executable/bar.pdb
+// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t/executable/foo.exe -s \
+// RUN:     %p/Inputs/locate-pdb.lldbinit | FileCheck %s
+int main(int argc, char** argv) {
+  return 0;
+// CHECK: (lldb) target modules dump symfile
+// CHECK: Dumping debug symbols for 1 modules.
+// CHECK: SymbolFile pdb
Index: lldb/test/Shell/SymbolFile/NativePDB/Inputs/locate-pdb.lldbinit
--- /dev/null
+++ lldb/test/Shell/SymbolFile/NativePDB/Inputs/locate-pdb.lldbinit
@@ -0,0 +1,2 @@
+target modules dump symfile
Index: lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
--- lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -134,8 +134,16 @@
     return nullptr;
-  // if the file doesn't exist, is not a pdb, or doesn't have a matching guid,
-  // fail.
+  // If the file doesn't exist, perhaps the path specified at build time
+  // doesn't match the PDB's current location, so check the location of the
+  // executable.
+  if (!FileSystem::Instance().Exists(pdb_file)) {
+    const auto exe_dir = FileSpec(exe_path).CopyByRemovingLastPathComponent();
+    const auto pdb_name = FileSpec(pdb_file).GetFilename().GetCString();
+    pdb_file = exe_dir.CopyByAppendingPathComponent(pdb_name).GetCString();
+  }
+  // If the file is not a PDB or if it doesn't have a matching GUID, fail.
   llvm::file_magic magic;
   auto ec = llvm::identify_magic(pdb_file, magic);
   if (ec || magic != llvm::file_magic::pdb)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84815.284025.patch
Type: text/x-patch
Size: 3061 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20200807/d4723e30/attachment.bin>

More information about the lldb-commits mailing list