为什么远程调试时没有加载符号?

55

我想使用远程调试。

我想要调试的程序在 b 机器上运行。

Visual Studio 在 a 机器上运行。

在机器 b 上,我有一个包含以下文件的文件夹:

  • msvcr72.dll
  • msvsmon.exe
  • NatDbgDE.dll
  • NatDbgDEUI.dll
  • NatDbgEE.dll
  • NatDbgEEUI.dll

如果您认为缺少某些文件,请说明它们通常位于哪里?

接下来我启动了 msvsmon.exe 和我的程序。在 a 机器上,我启动了 Visual Studio 2008 并打开了包含我的程序的解决方案。然后我选择“调试 - 附加到进程”。我选择了“远程传输(仅本机且无身份验证)”。我使用正确的 IP 作为限定符并选择了正确的进程(program.exe)。过一会儿,出现了以下弹窗消息:

在 program.exe 中未处理的异常 0x7c812a7b:0xE0434F4D: 0xe0434f4d

我可以继续或者中断;当我选择继续时,异常会不断重复出现。所以我选择中断,接下来出现了以下消息:

未为任何调用堆栈帧加载符号。无法显示源代码。


调用栈是什么样子的?可能没有加载符号,因为程序的内部抛出了异常。唯一需要注意的是确保在远程系统上有正确的exe文件。 - JeffFoster
1
@Xelluloid:你能否提供屏幕截图展示如何附加进程以及证明pdb文件与dll文件在同一文件夹中?最后,你能否在附加进程后按下ctrl->alt->u并提供MODULE窗口的屏幕截图(让我们看看加载了哪些模块)? - Pure.Krome
14个回答

30

请确保将生成的 .PDB 文件与您的程序集一起复制到远程计算机上的同一文件夹中。这将允许调试器获取调试符号。


1
它必须从客户机复制吗?我已经在远程机器上安装了相同的Visual Studio项目,并且它在bin文件夹中有自己的.PDB文件,尽管我仍然收到“..pdb未加载”的消息。 - DevDave
2
.pdb文件是随着您的程序集一起生成的,因此它们会随每个版本而更新,应该进行复制。 - Kyle Trauberman
2
我的问题是,我的开发机器上所有的Visual Studio项目都在D:驱动器上,而服务器只有C:驱动器+我正在开发ASP.NET网站。我解决这个问题的方法是进入->项目属性->生成->输出路径->c:\inetpub\wwwroot\mysite\bin。这样,.pdb路径在我的开发机器和服务器上变得相同。 - nikib3ro
12
实际上,将PDB文件放在远程计算机上并不能解决问题-我仍然会收到“未为此文档加载任何符号”这个错误信息...? - Ted
3
我知道这是一个旧回答,过去8年中可能已经发生了变化,但这只是一个更新,因为这是被接受的答案。请看@scrat789的回答。我按照那篇文章的指示成功地让调试器工作,而无需从本地计算机复制PDB文件。 - L_7337

25
  • 在 Visual Studio 2010 的“工具”菜单中,选择“选项”。
  • 在“选项”对话框中,展开“调试”节点,然后单击“常规”。
  • 检查是否需要显示所有设置,并找到启用仅限我的代码(仅托管代码)
  • 取消选中它并单击“确定”

之后,您可以附加远程进程


2
调用堆栈位置已填充,但我仍然无法获取源代码。 - Jay Jay Jay
1
这对我有用。然后我可以查看调用堆栈。 - Seidleroni

18
  1. 在您的开发机上添加一个共享文件夹,指向.pdb文件所在的位置
  2. 在远程计算机上设置一个名为_NT_SYMBOL_PATH的环境变量,它指向您的开发机上的共享文件夹

远程调试器现在将在您的开发机上搜索符号。每次构建时不需要复制它们。

请查看MS视频此处

从第8-9分钟开始观看。他演示了如何设置远程调试器以从开发机的驱动器共享中加载符号。

祝你好运!


1
尝试过这个,但没有成功。 - Bjørn Otto Vasbotten
3
你能重新发一下链接吗?现在链接已经失效了。 - The Muffin Man
我正在使用Visual Studio 2012,但这对我根本不起作用,而且视频链接已经失效了。 - Vivian River

7

如果您没有将.PDB文件放置在被调试代码所在的相同目录中,则在.NET中进行远程调试将无法工作。

如果Visual Studio仍然找不到用于调试的源代码,则调试代码和VS项目源代码版本不一致。解决方案是重新构建和部署项目。


1
当程序集位于全局程序集缓存(GAC)时会发生什么?如何将PDB文件放置在与DLL文件相同的文件夹中?:\ - Ignacio Soler Garcia
1
你具体指的是哪个文件夹? - DevDave
1
这个答案的第二部分值得强调。没有 PDB 的症状与版本错误的 PDB 相同。如果您在远程部署后本地重新构建了解决方案,则会收到“无符号”消息。 - Jinlye

5

0xE0434F4D是CLR(即托管代码)的异常。您需要进行带身份验证的远程调试并选择调试托管代码。或者,可以使用一些调试器扩展来提取托管异常信息,但这需要更多的工作。

参考资料:

If broken it is...


4
尽管上述答案是正确的,但我遇到了一些问题:正在调试的程序集中构建的PDB文件已位于远程位置,但却没有被捕获。如果您正在使用TFS或另一个支持发布调试符号的构建机制,我建议您这样做。然后在Visual Studio选项>调试>符号中,您可以将该位置添加到“符号服务器”选项中,以在找到匹配的符号时加载这些符号。
这使得我可以调试几乎任何我编写的运行中程序,即使它是一个动态调用的程序集(当只发布程序集的符号时,我无法让它工作)。请利用这个非常方便的功能!

4

如果您想调试托管代码,那么使用Windows身份验证进行远程调试是正确的。否则,您将无法加载托管程序集的符号。但是,要使身份验证正常工作还是有些棘手的,因为它需要在两台计算机上创建具有相同密码的本地帐户,等等。这个问题以及所有人的答案对于让它正常工作非常有用。

Visual Studio(VS2008)中的远程调试和Windows窗体应用程序


3
我曾经遇到过同样的问题,在msdn论坛上找到了答案。我在这里复制/粘贴正确的答案:
确保你正在使用正确版本的msvsmon.exe!!! 这就是问题所在!我在远程调试C#应用程序时遇到了同样的问题。 我使用x64 msvsmon.exe,因为服务器运行Windows Server 2008 64位,但该应用程序是为x86编写的,因此我必须运行x86版本的msvsmon.exe才能摆脱这个烦人的错误。 不需要其他任何东西,只需运行与应用程序目标体系结构相对应的msvsmon.exe版本即可。

1
这只是另一个需要采取的步骤,如果涉及身份验证,那么不幸的是并不困难。对我来说,至少看到加载的模块有所帮助 => 点赞。 - Lars
1
错误,因为如果您在x64 Windows上运行x86安装程序,它会崩溃。我现在尝试了。 - Raffaeu

2

当我使用自定义的 构建配置 时也遇到了这个问题。 (替代 Debug 的 DEV)

为了纠正这个问题,我修改了项目属性-->生成-->输出-->高级设置,并确保输出-->调试信息设置为完整pdb-only。默认的 发布 配置通常设置为


1
通过进入项目属性,编译选项卡并将构建输出路径设置为远程机器(例如\myserver\myshare\myappdir),我成功使其工作。
在调试选项卡中,我已勾选“使用远程机器”并将其设置为“myserver”。

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