<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">