【问题标题】:Why are no Symbols loaded when remote debugging?为什么远程调试时没有加载符号?
【发布时间】:2010-09-14 04:43:54
【问题描述】:

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

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

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

如果您认为某些文件丢失了,您能否也描述一下它们通常的位置?

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

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

我可以继续或中断;继续时,异常一次又一次地发生。所以我按下了break,出现了以下消息:

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

【问题讨论】:

  • 调用堆栈是什么样的?可能没有加载符号,因为它在程序内部引发了异常。唯一的另一个问题是确保您在远程系统上拥有正确的 exe。
  • @Xelluloid:您能否提供有关您如何附加过程的屏幕截图并证明 pdb 与 dll 位于同一文件夹中?最后,你能不能提供一个 MODULE 窗口的屏幕截图(在你附加进程之后,点击 ctrl->alt->u 并让我们看看加载了哪些模块。

标签: visual-studio-2008 remote-debugging


【解决方案1】:

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

【讨论】:

  • 是否必须从客户端复制?我已经在远程机器上安装了相同的 Visual Studio 项目,它在 bin 文件夹中有自己的 .PDB 文件,尽管我仍然收到“..pdb 未加载”消息
  • .pdb 文件是与您的程序集一起生成的,因此它们在每个版本中都是新的,应该复制。
  • 对我来说问题是,在我的开发机器上,我所有的 Visual Studio 项目都在 D: 驱动器上,而服务器只有 C: 驱动器 + 我正在开发 ASP.NET 网站。我解决问题的方法是去 -> 项目属性 -> 构建 -> 输出路径 -> c:\inetpub\wwwroot\mysite\bin。这样,我的开发机器和服务器上的 .pdb 路径就变得相同了。
  • 实际上,在远程机器上拥有 PDB 文件并没有帮助 - 我仍然得到“没有为此文档加载任何符号”...?
  • 我知道这是一个旧答案,并且信息在过去 8 年中可能发生了变化,但这只是一个更新,因为这是公认的答案。看看@scrat789 的答案。通过关注该帖子,我能够在不从本地计算机复制 PDB 的情况下使调试器正常工作。
【解决方案2】:
  • 在 Visual Studio 2010 的“工具”菜单上,选择“选项”。
  • 在“选项”对话框中,打开“调试”节点,然后单击“常规”。
  • 如果需要,选中显示所有设置并找到仅启用我的代码 (仅限托管)
  • 取消选中并点击确定

可以附加远程进程后

【讨论】:

  • 调用堆栈位置被填充,但我仍然没有得到源代码
  • 这对我有用。然后我可以查看调用堆栈。
【解决方案3】:
  1. 在您的开发计算机上添加一个指向 .pdb 文件位置的共享文件夹
  2. 在远程计算机上设置一个名为 _NT_SYMBOL_PATH 的环境变量,该变量指向您的开发计算机上的共享文件夹

远程调试器现在将在您的开发机器上搜索符号。无需为每个构建复制它们。

见微软视频here

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

祝你好运!

【讨论】:

  • 试过这个没有任何成功。
  • 你能重新发布链接吗?现在已经死了。
  • 我使用的是 Visual Studio 2012,这对我来说根本不起作用,而且视频的链接已失效。
【解决方案4】:

如果您不将 .PDB 文件放入被调试代码所在的同一目录,则 .NET 中的远程调试将不起作用。

如果VS还是找不到调试的源代码,说明调试的代码和VS项目源不是同一个版本。解决方案是重建和重新部署项目。

【讨论】:

  • 当程序集在 GAC 时会发生什么。如何将 PDB 文件与 DLL 放在同一文件夹中? :\
  • 你指的是哪个文件夹?
  • 这个答案的第二部分值得强调。 no-PDB 的症状与 wrong-version-PDB 的症状相同。如果您在将解决方案部署到远程后在本地重建了解决方案,您将收到“无符号”消息。
【解决方案5】:

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

参考资料:

If broken it is...

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        我也有同样的问题。在msdn forums 找到答案,我将在此处复制/粘贴正确答案:

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

        【讨论】:

        • 这只是另一个步骤,不幸的是,如果涉及身份验证,这不是困难的一步。对我来说,它至少有助于看到加载的模块 => upvote。
        • 错误,因为如果您在 x64 窗口上运行 x86 设置,它只会爆炸。我现在试过了。
        【解决方案9】:

        我在使用自定义构建配置时也遇到了这个问题。 (开发而不是调试

        为了纠正这个问题,我修改了项目属性-->构建-->输出-->高级设置并确保输出-->调试信息设置为 fullpdb-仅。默认的 Release 配置通常设置为 none

        【讨论】:

          【解决方案10】:

          我可以通过转到项目属性、编译选项卡并将构建输出路径设置到我的远程计算机来完成这项工作,例如 \myserver\myshare\myappdir

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

          【讨论】:

            【解决方案11】:

            转到 Tools->Options->Debugging->Symbols 并添加可执行文件的 .pdb 文件的路径。我本地机器上的路径运行良好。

            【讨论】:

              【解决方案12】:

              根据文档,对于托管(我尝试在使用 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 主机和远程计算机上。

              问候!

              【讨论】:

                【解决方案13】:

                我遇到了这个问题,上面的解决方案并没有为我解决这个问题。就我而言,我的 VS2010 解决方案中有很多项目。我尝试远程调试的项目没有在我的 VS2010 解决方案中设置为 StartUp Project,因为我的 make 脚本不太正确。

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

                【讨论】:

                  【解决方案14】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2014-02-05
                    • 2011-06-12
                    • 2014-10-20
                    • 2015-01-27
                    • 1970-01-01
                    • 2011-10-19
                    • 2012-02-18
                    • 2021-07-11
                    • 2017-08-13
                    相关资源
                    最近更新 更多