如何更改符号文件 (pdb) 中源文件的位置

Posted

技术标签:

【中文标题】如何更改符号文件 (pdb) 中源文件的位置【英文标题】:How do I change the locations of source files in a symbols file (pdb) 【发布时间】:2010-09-06 21:02:43 【问题描述】:

基本上我想要这样做:pdb 文件包含源文件的位置(例如C:\dev\proj1\helloworld.cs)。是否可以修改该 pdb 文件以使其包含不同的位置(例如 \more\differenter\location\proj1\helloworld.cs)?

【问题讨论】:

【参考方案1】:

您可以使用 Windows 调试工具的源索引功能,它将对源存储库中文件的适当修订版本的引用保存为 PDB 文件中的备用流。

【讨论】:

直接从源代码控制中为 PDB 编制索引是黄金!我希望所有开源项目都开始这样做。 那是薄荷糖。我不知道这个功能!这篇文章也很有用:entland.homelinux.com/blog/2006/07/06/… 上面@Pete 评论中的链接现已失效。幸运的是有web.archive.org/web/20150328011952/http://entland.homelinux.com/…【参考方案2】:

如果您希望更通用地了解嵌入在 pdb 文件中的路径,您可以首先使用 MS-DOS subst 命令将特定文件夹映射到驱动器号。

subst N: <MyRealPath>

然后打开相对于 N: 驱动器的项目并重建它。您的 PDB 文件将引用 N: 上的源文件。现在,您将特定的源文件集放在哪里并不重要,只要您随后像构建它时那样调用根目录“N:”即可。

John Robbins 在他的优秀著作Debugging Applications for Microsoft .NET and Microsoft Windows 中推荐了这种做法。

【讨论】:

【参考方案3】:

我想找到这个问题的答案,以便调试在我没有在我的机器上构建的可执行文件中发生的故障转储,因此 PDB 中引用的源代码的路径无效,路径也是如此到可执行文件中引用的 PDB。

在四处搜索并没有找到可行的方法后,我发现如果将可执行文件和 PDB 与故障转储文件放在一起(即在同一目录中),然后在 VS 中打开并运行故障转储,VS 会找到并在本地使用 PDB/EXE。此外,它还会在单击调用堆栈中的条目时提示源代码的位置:将其指向任何相关的源代码,一切正常,这太棒了!

无论如何,希望这对其他人有帮助...:)

【讨论】:

【参考方案4】:

正如 On Freund 已经指出的那样,这当然是可能的。 但如果只是为了在调试时可以定位和加载源,那么更好的方法是相应地设置源路径。一旦在调试器中设置,它将抢占 PDB 内的所有硬编码路径。

在 windbg 中(例如):

.srcpath+ path_to_source_root
或者这个(如果你正在远程调试):
.lsrcpath+ path_to_source_root

【讨论】:

以上是关于如何更改符号文件 (pdb) 中源文件的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何更改年龄不匹配的 PDB 以正确匹配?

windbg怎么打开pdb文件

pdb符号库文件详解

获取pe文件调试符号文件pdb路径

WinDbg单机调试

如何检查 pdb 文件是不是对调试程序集有效