Visual Studio 2008在调试.DMP文件时无法加载符号

3
我正在尝试从.DMP文件中调试一个C#应用程序,我有可执行文件、DLL和PDB文件都在名为"MyFolder"的文件夹中。我将包含源代码的目录设置为C:\MyFolder\,但是当我尝试进行调试时,它告诉我:“未加载任何调用堆栈帧的符号。无法显示源代码。” 当我打开符号加载信息时,它指出找不到以下PDB文件:C:\Windows\System32\kernel32.pdb,C:\MyFolder\kernel32.pdb,C:\MyFolder\symbols\dll\kernel32.pdb,C:\MyFolder\dll\kernel32.pdb,C:\MyFolder\kernel32.pdb,C:\Windows\symbols\dll\kernel32.pdb,C:\Windows\dll\kernel32.pdb和C:\Windows\kernel32.pdb。我的PDB文件位于正确的文件夹中,并且它们的时间戳完全相同。有人知道这里出了什么问题吗?如何正确加载符号?
我检查了模块,看起来我的项目的所有DLL和可执行文件都无法加载符号,具体而言,符号状态为“符号文件中没有本机符号”……当我右键单击项目并选择“从符号路径加载符号”并选择PDB C:\MyFolder\MyApplication.pdb后,它告诉我“MyApplication.pdb的符号文件与模块不匹配”。
2个回答

2
看起来这个dump文件是本地代码的minidump,而不是托管代码的minidump,因为所有这些DLL的符号通常对托管调试没有关键作用,除非你在调试混合模式应用程序,调试Win32调用或跨托管/非托管边界调试。
这取决于minidump如何创建。如果它是在不同的机器上的不同操作系统或服务包上创建的,则可能需要设置符号路径以从其他机器获取系统DLL的确切PDB,而不是您的应用程序汇编和符号。如果这些非托管符号正确,则您的托管调试体验将得到改善。 进一步复杂化的是,你还需要处理.NET“微版本”和本地映像,以使堆栈跟踪正常工作。

该软件已安装在64位Windows Server 2008 R2上,我直接从服务器上复制了包含PDBs的文件夹,并在64位Windows 7机器上进行了调试。PDB是由任务管理器(TM)生成的,那么TM只会创建本地代码迷你转储吗?这是一个C#应用程序,因此它应该全部是托管代码...有没有一种方法可以获得和调试托管代码迷你转储? - Kiril
@链接:您的小转储文件可能没有问题,让我们设置符号。对于非托管调试,您需要2008 PDB并且需要一个符号服务器,如此处所述:http://msdn.microsoft.com/en-us/library/b8ttk8zy(v=VS.90).aspx - Rick Sladkey

0

您必须确保:

  • 可执行文件/DLL和PDB是相同的构建版本。PDB在内部使用GUID来确定关联的EXE/DLL是否正确。否则,它将无法加载符号。这不是VS本身的问题,而是来自DbgHelp.DLL。
  • 确保您拥有绝对正确的源文件集。即使在VS调试选项中未设置“源文件必须匹配”选项,但在加载.DMP文件时,VS也会要求源文件匹配才能加载符号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接