分类 调试 下的文章

Visual Studio 支持从一台计算机到另一台计算机的远程调试。 进行远程调试时,主机可以是任何支持 Visual Studio 的平台。 远程计算机可以是 32 位(Windows Vista、Windows 2000、Windows XP 或 Windows Server 2003)平台,也可以是 64 位(IA64、IA64 WOW 模式、x64 或 x64 WOW 模式)平台。

远程调试组件

Native调试

文件

安装位置

msvsmon.exe

远程计算机上的任意位置。

32 位和 64 位调试应使用不同版本的 msvsmon。 请确保在远程计算机上安装了正确的版本。

dbghelp.dll

位于 msvsmon 所在的目录中。

此可选文件用于保存应用程序的转储。 若未安装此文件,调试器使用随操作系统安装的默认版本的 dbghelp.dll 保存转储。

msdbgui.dll

位于 msvsmon 所在的目录中。

此可选文件包含用于远程调试器的经本地化的字符串、对话框和帮助。 若此文件丢失,调试器将使用默认的英语资源。

托管调试

文件

安装位置

msvsmon.exe

远程计算机上的任意位置。

32 位和 64 位调试应使用不同版本的 msvsmon。 请确保在远程计算机上安装了适当的版本。

msvsmon.exe.config

位于 msvsmon 所在的目录中。 若要加载正确的 .NET Framework 版本,该文件是必需的。

Symsrv.dll

位于 msvsmon 所在的目录中。 如果在远程调试中使用符号服务器,则该文件是必需的。

mcee.dll

位于 msvsmon 所在的目录中。 若要调试使用 .NET Framework 的 C++ 代码,该文件是必需的。

msvb7.dll 和 msvb7ui.dll

位于 msvsmon 所在的目录中。 仅在 Visual B

特殊组件

文件

用途

AvVsPkDH.dll

用于在应用程序验证工具下运行应用程序。 有关设置信息,请参见应用程序验证工具文档。

mpishim.exe

用于在群集上调试应用程序。

iisresolver.dll

用于调试禁用了 Windows 身份验证的 Web 服务器。

远程调试权限

下面的权限是远程调试所必需的。

Native调试

  • 调试以您的帐户和密码运行的进程:不需要特殊的权限。
  • 调试以另一个帐户名运行的进程:您的 Windows 登录帐户必须是远程计算机上系统管理员组的成员。

托管调试

  • 调试以您的帐户和密码运行的进程:不需要特殊的权限。
  • 调试以另一个帐户名运行的进程:您必须具有远程计算机上的管理员特权。 例如,如果 ASP.NET 辅助进程 aspnet_wp.exe 作为 SYSTEM 或 ASPNET 运行,则您必须是运行该进程的计算机上的管理员。
  • 承载公共语言运行时的进程(如 SQL Server 2005)可能强制应用自定义调试特权。

设置远程调试

若要启用远程调试,可以:

  • 在远程计算机上安装远程调试组件,并在开始调试时启动远程调试监视器 (msvsmon.exe)。

    - 或 -

  • 从一个共享中远程运行远程调试监视器。

从一个文件共享中运行远程调试监视器是启用远程调试的最容易的方法。在 64 位平台上安装 Visual Studio 时,会将适用于所有三个体系结构的远程调试监视器版本复制到以下文件夹:安装路径\Microsoft Visual Studio x.x\Common7\IDE\Remote Debugger。若要安装其他远程调试组件,请按照本文中的过程进行操作。

如果共享 Visual Studio 计算机中的远程调试器目录,则可以在远程计算机中运行 msvsmon.exe。下列调试器方案要求您在远程计算机中安装远程调试组件:

  • 单步执行从 WCF 客户端调用的承载服务。

  • 自动调试 ASP.NET Web 应用程序。

两种情况下,都可以进行手动附加,而无需在远程计算机中安装组件。除了从共享位置运行之外,还可以在远程计算机中安装必要的远程调试组件。 此安装提供对所有远程调试功能的访问。 在 x86 平台上运行远程调试器安装时,仅安装 x86 远程调试组件。 没有用于安装 64 位组件的选项。 如果在 64 位平台上运行远程调试器安装,则会同时安装 x86 和 64 位组件。

安装远程调试组件

  1. 远程调试器可在 Visual Studio 安装包中找到。

  2. 在 Windows 资源管理器中,打开该包,然后找到 vs/Remote Debugger。

  3. 在 vs/Remote Debugger 文件夹中,根据您的平台启动相应的远程调试器安装程序版本:rdbgsetup_x86、rdbgsetup_x64 或 rdbgsetup_ia64。

  4. 按照远程调试器安装程序向导中的说明完成安装。

    如果您愿意,可以通过手动复制文件来安装远程调试组件。 针对 32 位和 64 位平台,Visual Studio 包括不同版本的远程调试监视器。 如果使用远程调试器安装程序,它会自动安装正确版本的远程调试监视器。 然而,如果手动复制文件,则您必须确保所复制的版本正确无误。

  5. 安装远程调试组件以后,必须确保具有所需的权限以便对远程计算机上的程序进行调试。

配置防火墙

必须配置 Windows 防火墙才能启用远程调试。 在首次启动远程调试时,Visual Studio 会在 Visual Studio 主机上进行必要的配置。 在远程计算机中首次运行远程调试监视器时,远程调试监视器会在远程计算机上配置 Windows 防火墙。

在 Windows XP 上,此配置是完全透明和自动的,但是在 Windows Vista 上,新的安全模型要求先授予权限,然后软件才能配置防火墙。 此权限是通过“用户帐户控制”对话框授予的。

如果远程调试监视器必须在远程计算机上配置 Windows 防火墙,远程计算机上则会显示“用户访问控制”对话框。 如果远程计算机不可见,您可能意识不到 UAC 对话框已显示在远程计算机的监视器上。 在这种情况下,您可能会误认为远程调试已停止响应。 实际上,远程调试监视器只是在等待有人在远程计算机上授予 UAC 权限。

必须手动配置 Windows 防火墙的情况是很少见的。

开始远程调试

  1. 确保您在远程计算机上具有必需的远程调试权限。 有关更多信息,请参见远程调试权限。

  2. 对于 SQL 以外的远程调试,请确保您正在远程计算机上运行远程调试监视器。  进行 SQL 调试时,远程调试监视器会在调试期间自动启动。

  3. 在调试器主机上启动 Visual Studio。

运行远程调试监视器

远程调试监视器 (msvsmon.exe) 是一个小型应用程序,Visual Studio 与之连接以进行远程调试。 在远程调试过程中,Visual Studio 在一台计算机(调试器主机)上运行,远程调试监视器和正在调试的应用程序在远程计算机上运行。在开始远程调试前,必须设置远程调试。 此外,还必须确保具有在远程计算机上进行调试所需的权限。 完成这两项操作后,即可运行远程调试监视器,开始远程调试。

首次运行远程调试监视器时,必须在安装远程调试监视器的计算机上配置 Windows 防火墙。 此配置对于启用远程调试是必需的。 在 Windows Vista 上,必须在“用户帐户控制”对话框中授予此配置的权限,该对话框在要求配置时会出现。 如果已使用远程调试器配置向导配置了 Windows 防火墙,则不需要此配置。

启动远程调试监视器

  1. 单击“开始”,指向“所有程序”,指向“Visual Studio ”,然后单击“Visual Studio 远程调试器”。

    - 或 -

    在 Windows 命令提示符下,运行 msvsmon.exe。

    “远程调试监视器”作为 Windows 应用程序运行。 用户界面显示“远程调试监视器”正在运行,并使远程调试易于设置。

  2. 现在,可以采用两种模式中的一种来配置远程调试的“远程调试监视器”:


    • 若要在 Windows 身份验证模式中设置远程调试,

    • 若要在“无身份验证模式”中设置远程调试(仅限本机代码)。 使用无身份验证模式可以在慢速网络上实现较快调试。 但是,这种方式不安全,只应在安全网络中使用。

将远程调试监视器配置为服务

  1. 单击“开始”,选择 Microsoft Visual Studio XX,然后单击“Visual Studio XX 远程调试器配置向导”。

  2. 按照向导中的步骤将远程调试设置为服务。

远程调试本地生成的项目

可能需要调试一个在本地生成的项目,然后在远程计算机上运行可执行文件。 本主题阐释如何更改本地项目设置以在远程计算机上运行可执行文件。

Visual C++

此处显示的过程假定您在计算机 local1 中生成了 MFC 项目 mymfc。 您需要在计算机 remote1 中运行应用程序 mymfc.exe,然后使用计算机 local1 中的 Visual Studio 调试器进行调试。

准备远程计算机
  1. 在 remote1 上启动 msvsmon。

  2. 将可执行文件 mymfc.exe 复制到远程计算机上的某个位置。

    此示例将使用 c:\temp\mymfc.exe。

准备本地计算机
  1. 在“项目”菜单上选择“属性”。

  2. 在“mymfc 属性页”对话框中展开“配置属性”节点,然后单击“调试”。

  3. 将“要启动的调试器”更改为“远程 Windows 调试器”。

  4. 对于“远程命令”设置,键入 c:\temp\mymfc.exe。

  5. 将“工作目录”更改为您的项目所在的目录。

  6. 对于“远程服务器名称”设置,键入 remote1。

  7. 将“连接”更改为“带 Windows 身份验证的远程访问”。

  8. 将“调试器类型”从“自动”更改成“仅限本机”,因为您知道正在调试本机代码。

  9. 单击“确定”。

  10. 将“符号路径”设置为 local1 上调试符号所在的位置。

    本机远程调试无法使用远程计算机上的符号。 因此,必须提供一个本地位置。

  11. 在“调试”菜单中选择“启动”开始调试。

Visual C#

此处显示的过程假定您的计算机 local1 上已生成 Windows 应用程序项目 mywin4m。 您需要在计算机 remote1 上运行应用程序 mywin4m.exe,并在计算机 local1 上使用 Visual Studio 调试器进行调试。

准备远程计算机
  • 将可执行文件 mywin4m.exe 复制到远程计算机上的某个位置,同时复制相关联的 PDB 文件 (mywin4m.pdb) 以及运行该程序所需的 DLL 或其他文件。

    此示例将使用 c:\temp\mywin4m.exe。

准备本地计算机
  1. 在“文件”菜单上,指向“打开”,然后单击“项目/解决方案”。

  2. 在“打开项目”对话框中,找到本地或远程计算机上的 mywin4m.exe。

  3. 选择 mywin4m.exe,然后单击“确定”。

  4. 在“解决方案资源管理器”中右击该项目,再单击“属性”。

  5. 在 mywin4m 属性页上,单击“调试”。

  6. 在“工作目录”文本框中,键入 c:\temp。

  7. 在“计算机名”文本框中,键入 remote1。

  8. (可选)在“调试器类型”下选择“混合模式”,以显式启用托管代码和非托管代码的调试。

  9. 在远程计算机上启动远程调试监视器,并将远程调试模式设置为 Windows 身份验证模式或无身份验证模式。

  10. 在“调试”菜单中选择“启动”开始调试。

跨域远程调试

远程调试涉及 Visual Studio 调试器和远程调试监视器 (msvsmon.exe) 之间的双向通信。 为了使用远程调试,运行 Visual Studio 以及运行 msvsmon.exe 的用户身份非常重要。

若要连接到 msvsmon,您必须使用与 msvsmon 相同的用户帐户或管理员帐户来运行 Visual Studio。 (也可以将 msvsmon 配置为接受来自其他用户的连接。)

如果运行 msvsmon 的用户可在 Visual Studio 计算机上通过身份验证,则 Visual Studio 将接受来自 msvsmon 的连接。 (该用户在 Visual Studio 计算机上必须有本地帐户。)

在满足这些限制后,远程调试可应用于多种场合,包括:

  • 无双向信任的两个域。

  • 一个工作组中的两台计算机。

  • 工作组中的一台计算机和域中的另一台计算机。

  • 以本地帐户运行远程调试监视器 (msvsmon) 或 Visual Studio。

因此,您在每台计算机上都必须有一个本地用户帐户,并且两个帐户必须有相同的用户名和密码。 如果想要使用不同的用户帐户运行 msvsmon 和 Visual Studio,您在每台计算机中必须有两个用户帐户。

如果某个域帐户与某个本地帐户拥有相同的名称和密码,则可以使用该域帐户运行 Visual Studio。 在每台计算机中,仍须有拥有相同用户名和密码的本地帐户。

对于工作组中安装了 Windows XP Professional 的计算机,本地安全设置可能会导致无法进行远程调试。 为了能执行远程调试,必须将策略设置为**“经典”**。 (此问题不适用于加入域的 Windows XP 计算机,也不适用于运行 Windows Server 2003 或较新版本的 Windows Server、Windows Vista 或 Windows 7 的计算机。)

更改安全策略以允许在域之间进行远程调试

  1. 在本地计算机上,从“开始”菜单中选择“控制面板”。

  2. 在“控制面板”中双击**“管理工具”。

  3. 在“管理工具”窗口中双击“本地安全策略”。

  4. 在“安全设置”下打开“本地策略”文件夹。

  5. 在“本地策略”文件夹中选择“安全选项”。

  6. 在“策略”列中,找到“网络访问: 本地帐户的共享和安全模式”并双击它。

  7. 在“网络访问: 本地帐户的共享和安全模式”对话框中,将设置从“仅来宾 - 本地用户以来宾身份验证”更改为“经典 - 本地用户以自己的身份验证”并单击“确定”。

  8. 关闭该窗口并重新启动计算机。

  9. 在远程计算机上重复步骤 1 到 8。

    现在就可以在两台计算机上使用相同的用户名进行远程调试了。

有时可能需要调试不属于 Visual Studio 项目的可执行文件。 它可能是在 Visual Studio 外部创建的可执行文件,也可能是从其他用户处接收到的可执行文件。解决此问题的常见方法是在 Visual Studio 外部启动可执行文件并使用 Visual Studio 调试器附加到该文件。

附加到应用程序需要手动执行一些步骤,因此要花几秒钟的时间。 这一微小的延迟意味着如果尝试调试在启动过程中发生的问题,则这种附加将不会有帮助。 此外,如果调试的程序不等待用户输入而迅速完成,则可能没有时间附加到程序。 如果安装了 Visual C++,则可以为此类程序创建 EXE 项目。

为现有的可执行文件创建 EXE 项目

  1. 在“文件”菜单上,单击“打开”,然后选择“项目”。

  2. 在“打开项目”对话框中,单击“文件名”框旁边的下拉列表,然后选择“所有项目文件”。

  3. 找到可执行文件并单击“确定”。

    这将创建一个包含该可执行文件的临时解决方案。

将可执行文件导入到 Visual Studio 解决方案

  1. 在“文件”菜单中,指向“添加项目”,然后单击“现有项目”。

  2. 在“添加现有项目”对话框中,单击“文件名”框旁边的下拉列表,然后选择“所有项目文件”。

  3. 找到并选择可执行文件。

  4. 单击“确定”。

  5. 通过从“调试”菜单中选择执行命令(如“启动”)启动可执行文件。

注意:并非所有编程语言都支持 EXE 项目。 如果需要使用此功能,请安装 Visual C++。调试没有源代码的可执行文件时,可用的调试功能将受到限制,无论是附加到正在运行的可执行文件还是将可执行文件添加到 Visual Studio 解决方案中。 如果可执行文件在生成时没有兼容格式的调试信息,则可用功能将进一步受到限制。 如果有源代码,则最佳方法是将源代码导入到 Visual Studio 中并在 Visual Studio 中创建可执行文件的调试版本。

Visual Studio 调试器可以附加到在 Visual Studio 外运行的进程。 可以使用此附加功能执行以下操作:

  • 调试并非在 Visual Studio 中创建的应用程序。

  • 同时调试多个进程。 也可以通过在单个解决方案内启动多个项目来调试多个进程。

  • 调试正在远程计算机上运行的进程。

  • 调试一个 DLL,该 DLL 运行在不易从 Visual Studio 启动的独立进程上。例如,与 Internet 信息服务一起运行的服务或 ISAPI DLL。

  • 当一个进程在 Visual Studio 外运行时发生崩溃时,将自动启动调试器。 这就是实时调试。

一旦附加到某个程序,就可以使用调试器执行命令、检查程序状态,等等。 有关更多信息,请参见 Execution 控件 和 查看调试器中的数据。 当然,检查程序的能力可能会受到某些限制,这取决于程序是否用调试信息生成,是否可以访问程序源代码,以及公共语言运行时 JIT 编译器是否在跟踪调试信息。

如何:附加到运行进程

  1. 在“调试”菜单上选择“附加到进程”。 如果没有打开任何项目,请从“工具”菜单上选择“附加到进程”

  2. 在“附加到进程”对话框中的“可用进程”列表中,找到要附加到的程序。


    1. 如果要调试的程序运行在另一台计算器上,必须首先选择该远程计算机。

    2. 如果进程在其他用户帐户下运行,请选中“显示所有用户的进程”复选框。

    3. 如果是通过“远程桌面连接”连接,请选中“显示所有会话中的进程”复选框。

  3. 在“附加到”框中,确保待调试的代码类型已经列出。 默认的“自动”设置尝试确定要调试的代码类型。 如果自动设置不合适:


    1. 单击“选择”。

    2. 在“选择代码类型”对话框中,单击“调试以下代码类型”,然后选择要调试的类型。

    3. 单击“确定”。

  4. 单击“附加”。

    打开“进程”对话框时,会自动显示“可用进程”列表。 在该对话框打开时进程可以在后台启动和停止。 不过,内容并非总是最新的。 通过单击“刷新”,可以随时刷新列表以查看当前进程列表。

    调试时可以附加到多个程序,但在任何时间,调试器中都只有一个程序处于活动状态。 可以在“调试位置”工具栏或“进程”窗口中设置活动程序。 所有的“调试”菜单执行命令都会影响活动程序。 可以在“进程”对话框中中断任何已调试的程序,或者通过“调试”*菜单中断所有附加的程序。

注意:为了使调试器附加到用 Visual C++ 编写的托管代码,该代码需要发出 DebuggableAttribute。 可通过链接 /ASSEMBLYDEBUG 链接器选项将它自动添加到代码中。如果尝试附加到不受信任的用户帐户拥有的进程,则会出现安全警告对话框确认。

在某些情况下,在“远程桌面”(“终端服务”)会话中进行调试时,“可用进程”列表不会显示所有可用进程。 在 Windows Server 2003 或更高版本中,如果您以具有有限用户帐户的用户身份运行 Visual Studio,“可用进程”列表将不显示在会话 0 中运行的进程,会话 0 用于服务与其他服务器进程,包括 w3wp.exe。 您可以通过以下方法解决该问题:使用管理员帐户运行 Visual Studio 或从服务器控制台而不是“终端服务”会话运行 Visual Studio。 如果这两种解决方法都不奏效,第三种方法是通过从 Windows 命令行运行 vsjitdebugger.exe -p 进程Id 来附加到进程。 您可以使用 tlist.exe 来确定进程 ID。 若要获取 tlist.exe,请从 http://go.microsoft.com/fwlink/?LinkId=168279 下载并安装 Windows 调试工具。

如何:附加到脚本

1、首先是弹出附加进程框

2、单击要附加到的进程

3、在“附加到”框中,您应该会看到“脚本代码”或“自动: 脚本代码”。 如果显示其他内容,请按照下列步骤操作:

  1. 单击“选择”。

  2. 在“选择代码类型”对话框中单击“调试以下代码类型”,再选择“脚本”。

  3. 单击“确定”。

4、单击“附加”。

如何:设置当前进程

调试时可以附加到多个进程,但在任何给定时间,调试器中只有一个进程处于活动状态。 可以在“调试位置”工具栏中设置活动进程。

  1. 在“调试”菜单上,单击“窗口”,再选择“进程”。

    “进程”窗口可能已经显示出来。

  2. 在“进程”窗口中,双击要作为活动进程的进程。

    - 或 -

    在“调试位置”工具栏上,选择“进程”列表框,然后选择要作为当前进程的进程。

如何:分离进程

“分离”可使调试器断开与程序的连接,该程序已附加到调试器或已从调试器启动。

同时与所有程序分离

在“调试”菜单上,单击“全部分离”。

如果分离所有进程,调试器会话将自动结束。

分离单个进程

如何:处理附加错误

当 Visual Studio 调试器附加到一个正在运行的进程时,该进程可能包含一种或多种类型的代码。 调试器能够附加到的代码类型包括本机、托管、SQL 和脚本。 在**“附加到进程”**对话框中显示并选择这些代码类型。

有时,调试器能够成功附加到一种代码类型,但不能附加到另一种代码类型。 这种情况可能发生在您尝试附加到远程计算机上运行的进程时, 原因是远程计算机上可能安装了一些代码类型的远程调试组件,但没有安装另一些代码类型的远程调试组件。 这种情况还可能发生在您尝试为直接数据库调试附加到两个或多个进程时。 SQL 调试仅支持附加到单个进程。

如果调试器能够附加到某些代码类型而不是所有代码类型,您将看到一条消息,指示无法附加的类型。

如果调试器成功地附加到至少一种代码类型,您就可以继续调试进程。 您只能调试那些已被成功附加的代码类型。 上面的示例消息说明未能附加脚本代码类型。 因此,您将不能调试进程内的脚本代码。 进程内的脚本代码将继续运行,但无法设置断点、查看数据或在脚本中执行其他调试操作。

如果想了解有关调试器未能附加到某种代码类型的详细原因,可以尝试仅重新附加到该代码类型。

获得有关某种代码类型未能附加的详细原因

  1. 从进程中分离。 为此,请在“调试”菜单上,单击“全部分离”。

  2. 仅选择一种程序类型,再次附加到进程。


    1. 在“附加到进程”对话框的“可用进程”列表中选择进程。

    2. 单击“选择”。

    3. 在“选择代码类型”对话框中,选择“调试以下代码类型”和未能附加的代码类型。 清除任何其他代码。

    4. 单击“确定”。 “选择代码类型”对话框关闭。

    5. 在“附加到进程”对话框中,单击“附加”。


    此时,附加将彻底失败,并且您将收到一条特定的错误消息。