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

时间:2008-09-30 06:21:39

标签: visual-studio-2008 remote-debugging

我想使用远程调试。 我要调试的程序在机器b上运行。 Visual Studio在机器上运行a。

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

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

如果您认为某些文件丢失了,您是否也可以描述它们通常位于何处?

在下一步中,我在机器b上启动了msvsmon.exe和我的程序。在机器上,我启动了Visual Studio 2008和我编写程序的解决方案。然后我选择“Debug - Attach to Process”。我选择了“远程传输(仅限本机,无需身份验证)”。我使用正确的IP作为限定符并采取了正确的过程(program.exe)。片刻之后,弹出窗口中出现以下消息:

  

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

我可以继续或休息;继续时,异常会一次又一次地发生。所以我按下了break并发生了以下消息:

  

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

14 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:16)

  1. 在您的开发计算机上添加指向.pdb文件位置的共享文件夹
  2. 在远程计算机上设置一个名为_NT_SYMBOL_PATH的环境变量,指向开发计算机上的共享文件夹
  3. 远程调试器现在将在您的开发机器中搜索符号。无需为每次构建复制它们。

    请参阅MS视频here

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

    祝你好运!

答案 2 :(得分:12)

  • 在Visual Studio 2010的“工具”菜单上,选择“选项”。
  • 在“选项”对话框中,打开“调试”节点,然后单击“常规”。
  • 如果需要,请选中显示所有设置,然后找到启用我的代码 (仅限管理)
  • 取消选中,然后点击确定

您可以附加远程进程

答案 3 :(得分:5)

如果您没有将.PDB文件放在调试代码所在的同一目录中,则.NET中的远程调试将无效。

如果VS仍无法找到调试源,则调试代码和VS项目源不是同一版本。解决方案是重建和重新部署项目。

答案 4 :(得分:4)

0xE0434F4D是CLR的一个例外(即托管代码)。您需要使用身份验证进行远程调试,并选择调试托管代码。或者,可以使用一些调试器扩展来提取托管异常信息,但这样做有点困难。

参考文献:

If broken it is...

答案 5 :(得分:3)

1800信息是正确的,您必须使用Windows身份验证进行远程调试才能调试托管代码,否则您将无法加载托管程序集的符号。让它与身份验证一起工作非常棘手,因为它需要两台具有相同密码的计算机上的本地帐户。这个问题和每个人的答案对于实现这一点非常有用。

Remote Debugging in Visual Studio (VS2008), Windows Forms Application

答案 6 :(得分:3)

我有同样的问题。在msdn forums上找到答案我只需复制/粘贴正确答案:

  

确保您使用的是   正确版本的msvsmon.exe !!!       这就是全部!我在远程调试C#时遇到了同样的问题   应用。我当时正在使用x64   msvsmon.exe因为服务器运行   Windows Server 2008 64位,但是   应用程序是为x86编写的,所以我   不得不运行x86版本的   msvsmon.exe为了摆脱   这个恼人的错误。       不需要任何其他东西。只需运行msvsmon.exe的版本即可   对应于目标架构   你的申请^ _ ^

答案 7 :(得分:3)

虽然上面的答案是正确的,但我遇到的情况是,使用正在调试的程序集构建的PDB在远程位置就位,并且没有被拾取。如果您使用的是TFS或其他支持发布调试符号的构建机制,我建议您这样做。然后在Visual Studio选项>调试>符号中,您可以将该位置添加到符号服务器选项,以便在找到匹配的任何符号时加载这些符号。

这允许我调试darned在我写的任何正在运行的东西附近,即使它是一个动态调用的程序集(当我只使用程序集发布符号时,我无法在我的生活中工作)。利用这个非常方便的功能!

答案 8 :(得分:1)

我能够通过转到Project Properties,Compile选项卡并将Build输出路径设置为我的远程机器来实现此功能,例如 \ MYSERVER \ myshare的\ myappdir

在调试选项卡中,我已使用远程机器检查并设置为myserver

答案 9 :(得分:1)

使用自定义构建配置时,我也遇到了这个问题。 ( DEV而不是Debug

为了解决这个问题,我修改了项目属性 - &gt;构建 - >输出 - >高级设置并确保输出 - >调试信息设置完整或<强> PDB只即可。默认发布配置通常设置为

答案 10 :(得分:1)

转到工具 - >选项 - &gt;调试 - >符号,并添加可执行文件的.pdb文件的路径。我本地机器上的路径工作正常。

答案 11 :(得分:0)

根据文档,对于托管(我尝试使用visual studio 2012附加到远程计算机上的托管Windows服务(针对.net 4.5构建)),远程计算机上的符号应为

因此,我只是在远程计算机上保留符号(确保它们与远程计算机上的应用程序的模块/程序集匹配),共享它并通过本地系统的符号设置(其中vs正在运行)引用它。

注意:服务和符号不需要与使用2k12 + .net 4.5 Windows服务的工作目录相同。

了解详情:

http://msdn.microsoft.com/en-us/library/bt727f1t(v=vs.100).aspx

摘自链接:

查找符号(.pdb)文件


符号文件包含已编译可执行文件的调试信息。要调试的应用程序的符号文件必须是编译应用程序可执行文件时创建的文件。符号文件也必须位于调试器可以找到它们的位置。

•本机应用程序的符号文件必须位于Visual Studio主机上。

托管应用程序的符号文件必须位于远程计算机上。

•混合(托管和本机)应用程序的符号文件必须位于Visual Studio主机和远程计算机上。

问候!

答案 12 :(得分:0)

我遇到了这个问题,上述解决方案并没有为我解决。以我为例,我的VS2010解决方案中包含许多项目。在我的VS2010解决方案中,我尝试进行远程调试的项目设置为“启动项目”,因为我的make脚本不太正确。

我在要调试的解决方案中的项目上单击鼠标右键,然后选择Set as StartUp Project,然后正确加载了符号并命中了断点。

答案 13 :(得分:0)

在进行远程调试时,我遇到了同样的问题,在VS 2008上通过以下步骤解决了该问题:

  1. 您将本地pdb文件与二进制文件一起复制
  2. 运行与构建应用程序时所用版本相同的msvmon。如果您的应用程序是针对x86体系结构构建的,则即使在x64计算机上运行它,也需要运行x86版本的msvmon。尝试运行时会发出警告,但应该运行。