[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.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D84815/new/
https://reviews.llvm.org/D84815
Files:
lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
lldb/test/Shell/SymbolFile/NativePDB/Inputs/locate-pdb.lldbinit
lldb/test/Shell/SymbolFile/NativePDB/locate-pdb.cpp
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
+quit
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