<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/142490>142490</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [llvm-symbolizer] allow specifying pdb file path directly on command line
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          yshui
      </td>
    </tr>
</table>

<pre>
    and when pdb file is specified, it should override symbolizer's dwarf info detection. allow more control over where and what debug info is loaded.

here's a very crude patch that does this:

```diff
diff --git i/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h w/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
index 5747ad99d0f1..1bcc84983445 100644
--- i/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
+++ w/llvm/include/llvm/DebugInfo/Symbolize/Symbolize.h
@@ -62,6 +62,7 @@ public:
     std::vector<std::string> DsymHints;
     std::string FallbackDebugPath;
     std::string DWPName;
+    std::string PDBName;
 std::vector<std::string> DebugFileDirectory;
     size_t MaxCacheSize =
 sizeof(size_t) == 4
diff --git i/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp w/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
index 1d8217ad587e..c823e36ee585 100644
--- i/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
+++ w/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp
@@ -637,6 +637,8 @@ LLVMSymbolizer::getOrCreateModuleInfo(StringRef ModuleName) {
   if (auto CoffObject = dyn_cast<COFFObjectFile>(Objects.first)) {
     const codeview::DebugInfo *DebugInfo;
     StringRef PDBFileName;
+ pdb::PDB_ReaderType ReaderType =
+        Opts.UseDIA ? pdb::PDB_ReaderType::DIA : pdb::PDB_ReaderType::Native;
     auto EC = CoffObject->getDebugPDBInfo(DebugInfo, PDBFileName);
     // Use DWARF if there're DWARF sections.
     bool HasDwarf =
@@ -649,8 +651,6 @@ LLVMSymbolizer::getOrCreateModuleInfo(StringRef ModuleName) {
       using namespace pdb;
       std::unique_ptr<IPDBSession> Session;
 
- PDB_ReaderType ReaderType =
-          Opts.UseDIA ? PDB_ReaderType::DIA : PDB_ReaderType::Native;
       if (auto Err = loadDataForEXE(ReaderType, Objects.first->getFileName(),
                                     Session)) {
         Modules.emplace(ModuleName, std::unique_ptr<SymbolizableModule>());
@@ -658,6 +658,15 @@ LLVMSymbolizer::getOrCreateModuleInfo(StringRef ModuleName) {
 return createFileError(PDBFileName, std::move(Err));
       }
 Context.reset(new PDBContext(*CoffObject, std::move(Session)));
+    } else if (!Opts.PDBName.empty()) {
+      using namespace pdb;
+ std::unique_ptr<IPDBSession> Session;
+      if (auto Err = pdb::loadDataForPDB(ReaderType, Opts.PDBName, Session)) {
+ Modules.emplace(ModuleName, std::unique_ptr<SymbolizableModule>());
+ // Return along the PDB filename to provide more context
+        return createFileError(Opts.PDBName, std::move(Err));
+      }
+ Context.reset(new PDBContext(*CoffObject, std::move(Session)));
     }
 }
   if (!Context)
diff --git i/llvm/tools/llvm-symbolizer/Opts.td w/llvm/tools/llvm-symbolizer/Opts.td
index d0b227af9db4..dbaa18aa8939 100644
--- i/llvm/tools/llvm-symbolizer/Opts.td
+++ w/llvm/tools/llvm-symbolizer/Opts.td
@@ -36,6 +36,7 @@ def functions : F<"functions", "Print function name for a given address">;
 def functions_EQ : Joined<["--"], "functions=">, HelpText<"Print function name for a given address">, Values<"none,short,linkage">;
 def help : F<"help", "Display this help">;
 defm dwp : Eq<"dwp", "Path to DWP file to be use for any split CUs">, MetaVarName<"<file>">;
+defm pdb : Eq<"pdb", "Path to PDB file">, MetaVarName<"<file>">;
 defm dsym_hint
     : Eq<"dsym-hint",
          "Path to .dSYM bundles to search for debug info for the object files">,
diff --git i/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp w/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 3ba7f59d5b84..0c928964e552 100644
--- i/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ w/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -497,6 +497,7 @@ int llvm_symbolizer_main(int argc, char **argv, const llvm::ToolContext &) {
 Opts.DefaultArch = Args.getLastArgValue(OPT_default_arch_EQ).str();
 Opts.Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, !IsAddr2Line);
 Opts.DWPName = Args.getLastArgValue(OPT_dwp_EQ).str();
+  Opts.PDBName = Args.getLastArgValue(OPT_pdb_EQ).str();
   Opts.FallbackDebugPath =
 Args.getLastArgValue(OPT_fallback_debug_path_EQ).str();
 Opts.PrintFunctions = decideHowToPrintFunctions(Args, IsAddr2Line);
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy0WF-T2jgS_zSaFxUuI9tgP_AAGCq5SjZsZja5e6Jkqw26FZZXkpmQT38lyRiTGSYzuxcXVdiS-o-6f_1HolrzXQ0wQ8kCJfkdbc1eqtlJ71t-V0h2mtGa4cc91LhhBa64AMw11g2UvOLAEFlibrDey1YwLI-gFGeA9elQSMG_g0JkqjF7pKrCvK4kZmCgNFzWAaZCyEd8kApwKWujpHAMrDQF2MulBjMo2p0n5hoLSRmwAIVzFM7tQieA4iOoEy5VywA31JR7bBytBI3NnmsUzT0JmoT-x3hVoXBu__BotOMGc0TWQhwPiKx5XYqWwWUgt0q8ryuJyPr-vLnhe7DHj_-MHoVzXjP4hpNpPKUsy1hYjYNgXJRlGmdpFMcJHofhJI5ROB-NRv9UX2sMsvC__4PuKA5RHOLRhCCynGBEFu5tiruJpi0EL70fsH20YfYrmh-hNFKhaNmPaKN4vUPRCuf6dHjHa6NRtHhC6JfhNRWioOWfTs8NNfsX1uZfN7_RA_gVduPPrNnki8uaV6ppRa-5gJwrt-w01IF_h63BH-m3JS33cM-_A0ZR7pjz7yArRFK_BpHMzUQ5jm9iU_DiVU4pm2bo1jeQ9Ugcs5SMp5Ql6RSCoExJBNEEIElvI_FtYp4F4BtZnHEXTXvgudf0jLwPH758vL8kJOe6HZhPaqmAGvgoWSvAS0rvnUs_Q4X9sAOC9cq0cyevMCIpbY3ES1lVn4r_Qmms0zA71duSaoOi5fLTeu1nLCZQtEIk9d86qLjS1tFXXLHNgNrgUjI4cnj0SvYmwIhcPgbIumi7yRdW1DW2G1Z4Rpt8sf0MlIF6ODWAB68eh10g2OdTY3Twh4b8_RyjaH2LR6egWzR_edFv1PAjDLR2xlstndEuNhyhaLUD44M4X3T-GKBgebVJkg04IrJGZI3_0IDzr_PPa-sl0xUHdR7Tvu7o4ExVSCnwO6pzV506S5zRFGceQmQxScYeWL8ATfZptU06NT2AbmgJ3piD-T7dtDX_q4VtY2wSer_JF_egNZe1TUD9qyO0YYl_5vQRxrec_pKvX-XiqzhZKeV8bUt3Tg1dS7X6tw2JARuyxFcB0qHh4u7UhczyIuDl52yPJ3FmH-8MHcChEbS0zIfuWd6w-NnptBCdl31gexld1J3hk6R9MnKv4-QX4EeBaVWNS0doTbVSSipE0qtAGeznII92tyulhkp3VkFTV5KWsjbwzQQKNBhE0hoerc-7Ybff-SVqn2N_ZfuLaXyOQdMcg9DQAQSRsQNfV3OtS8ypN2q30T493QwVu-LtcdLzfQasfUoboHaTL56idqC9_X4OeFbOL8QcWZwT4GcPCCpkvbMJ0DrO9ezWZNhI3Ch5tP1533Rbl17l_5uY-nGjPwFVz9LDyn7-KmQN0dv94Qu8evbZzY7KSCl09zkaHl3WbtOGDbuTny7uuycWFoRMaZWxIg4CVlA6TilNsyi72T29hvmzPdOrCLvkFE3Oucm99R06gwpXbe2rpMv1axQtESH9ICK2pceIkI3itelXu5DElVSY4h0_Qo0pYwq0I4hWnZuu-G9XvzsR_5K8BmblJAtEyGhkSZK8E3ORHOUdL7LE70A0D9anTru3qUKW-AsVLWhPXMvaolnvpbKIE7z-k-7gidp7EM3QIvb7Yoyc60bQkzto4vPUkP6A2aOnX_3lGbDHAb09s9jozL9u_AnbSFwAbnW3kfqEdSO4wcs_Btv4CIZ-ocq3fEs3vqzO7eZFPiILp4E9vg81sAnuiQbnfPFmKd0u9emw3fPa9FE53LI-HUZu0om9quQDFQJ2_5-PuGhrJuzZXWINVJV7Z4nBVYD9tBlO-gbcqnSxzd-I9B9Gfjw9vYmwzwBRQadVkrGkSOMgCMuMpNkkhiQhfyMDPC_ojdngBpMuM8RZf4byr31usCFmabcX2u2B8hqR1E5RtSstWso9Vfawgsicqt3RDbmDjVPMpfIHKUWXkzEik0E74zJVDhVthZlbl9s6PFc7HezAfKDazNXOxa6tRpuHLfNLtxYe29XviGSBNqqrjtGQ5YHWOwEXfnuq14Luej5-3pXzzcO2lldDiIzf6zljinzgNfzI298n_FTVx-Z5DV2ZHJbWn3FqWHFjrx2fJ7ch57uGF5hWHc3WBdi2oeZFg7qMux5UihwzKDmDd_LxQV7PIpJawdaQz1mxv467Y7OIZVFG72A2nsZpmmWTkNztZ9mUVnTKsrSYTBM2jcuITRIaJ-OEJnEUju_4jIQkCSchIWMyiUlQxLRIWJROxyWpJuEUxSEcKBeBBWEg1e6Oa93CbByTOAvvBC1A6JmvP7YncbO-DN2pmYuYot1pFIeCa6MvbAw3wt2c_hhnSd5dbvp70pPtWvvrU2tdzNw9kThhWeNSHg60ZljwGu5aJWZ7Yxp3Y-m6uh03-7YISnkYXJFYgY2SvlFaO41twHdbOs7I_wIAAP__Q8Gy-w">