调试C#代码时的符号问题

我正在使用WinDbg从托管代码(C#,为任何CPU构建的控制台应用程序)加载故障转储,并在x64平台上创建故障转储。 我在x64平台上进行调试。 我已将相关的PDB文件放入符号路径中。

但WinDbg总是从一个奇怪的文件夹中找到符号。 这是一个例子(当我使用时!sym noisy):

SYMSRV: c:\MySymbols\FooService.pdb\4311207E2E2D442CB7473828D2488F941\FooService.pdb not found 

我的应用程序称为FooService.exe ,相关的PDB文件名为FooService.pdb 。 我已将C:\MySymbols设置为符号路径,并将FooService.pdb复制到目录C:\MySymbols 。 但是为什么WinDbg在C:\MySymbols找不到FooService.pdb ,而是从一个奇怪的子文件夹“FooService.pdb \ 4311207E2E2D442CB7473828D2488F941”?

在我的场景中,为了加载PDB符号文件,最好的解决方案是什么(我必须自己手动创建子文件夹FooService.pdb\4311207E2E2D442CB7473828D2488F941 )?

我相信路径的奇怪部分用于在符号缓存中对PDB进行版本控制。 由于缓存可用于许多应用程序,包括同一应用程序的不同版本,因此符号下载程序需要做一些事情以使它们分开。

您可以使用.reload /fo命令强制符号加载器忽略任何缓存的副本。 结合.sympath选项,您应该能够设置加载。 将本地路径添加到符号路径的简单方法是.sympath+ 。 之后执行.reload /fo以忽略任何先前缓存的PDB。

编辑:我稍微改变了我的回答,因为我相信我最初误解了你的问题。 我希望这个更新更有用。