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) 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/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