wenmo8 发布的文章

有时可能需要调试不属于 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 的平台。 远程计算机可以是 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 时,系统会要求您为主要的编程语言选择一组默认的 IDE 设置。 某些语言的默认 IDE 设置可能会隐藏某些调试器命令。如果要使用由默认 IDE 设置隐藏的调试器功能,可以使用以下过程将相应的命令重新添加到菜单中。

还原隐藏的调试器命令

  1. 在项目处于打开的状态下,在“工具”菜单上单击“自定义”。

  2. 在“自定义”对话框中,单击“命令”选项卡。

  3. 在“菜单”框中,选择“调试”。

  4. 在“命令”框中,选择要添加的命令,并将其拖动到“调试”菜单。

  5. 重复上面的步骤以添加其他命令。

  6. 完成将命令添加到菜单后,单击“关闭”。

    某些菜单项仅在调试器处于特定模式(如运行模式或中断模式)下才显示。 因此,在完成这些步骤后,您所添加的项可能不会立即显示出来。

还原“自定义”对话框中不可用的命令

某些命令(特别是分层菜单中的命令)无法从“自定义”对话框中还原。 要还原这些命令,必须导入一组新的 IDE 设置。

导入新的 IDE 设置

  1. 在“工具”菜单上,单击“导入和导出设置”。

  2. 在“欢迎使用‘导入和导出设置向导’”页面上,单击“导入选定的环境设置”,然后单击“下一步”。

  3. 在“保存当前设置”页面上,确定是否保存现有的设置,然后单击“下一步”。

  4. 在“选择要导入的设置集合”页面上的“默认设置”文件夹下,选择一个包含要使用的命令的开发设置集合。 如果不知道应选择哪个集合,请尝试“常规开发设置”或“Visual C++ 开发设置”,这两个集合提供了大部分的调试器命令。

  5. 单击“下一步”。

  6. 在“选择要导入的设置”页面上的“选项”下,确保选中了“调试”。 清除其他复选框,除非还要导入这些复选框对应的设置。

  7. 单击“完成”。

  8. 在“导入完成”页面上,检查“详细信息”部分,查看是否有任何与重置您的设置相关联的错误。

  9. 单击“关闭”。

 

使用 Visual Studio,您可以调试运行在本地计算机或远程计算机上的 64 位应用程序。如果进行本地调试,Visual Studio在 WOW64 下运行,WOW64 是允许 32 位 Windows 应用程序在 64 位 Windows 上运行的 32 位 x86 仿真程序。 只在 x64 上支持 WOW64 下的本地调试。

如果进行远程调试,Visual Studio 可以在 WOW64 下或 32 位计算机上运行。 除了可以调试在 x64 WOW 模式下或在 32 位操作系统上运行的 32 位应用程序之外,您还可以调试 IA64 和 x64 应用程序。

若要调试在远程计算机上运行的 64 位应用程序,需要在远程计算机上安装 64 位远程调试器。 64 位远程调试器可以从 Visual Studio 安装套件的最后一张光盘获得。

如果在本地计算机上调试 64 位应用程序,Visual Studio 将使用远程调试以连接同一台计算机上的 WOW64 和 64 位应用程序。 在计算机上安装 Visual Studio 时,将自动安装远程调试组件。

不管哪种情况,在 64 位计算机上安装远程调试会同时安装 32 位和 64 位版本的远程调试监视器。 若要调试 64 位应用程序,必须使用正确的版本,它是在“开始”菜单上的“远程调试器 (x64)”。调试 64 位代码几乎与调试 32 位代码一样。 其中一个区别是,“编辑并继续”对 64 位代码不可用。

如果托管代码使用 Microsoft .NET Framework 版本 4 或更高版本,则 x64 进程支持混合模式调试(从本机代码到托管代码的调用,反之亦然)。使用低于 4 的 .NET Framework 版本的 IA64 进程或 x64 进程不支持混合模式调试。

启动 64 位远程调试监视器

  1. 单击**“开始”,依次指向“所有程序”、“Microsoft Visual Studio ”、“Visual Studio 工具”,再单击“远程调试器(x64)”或“远程调试器(IA64)”**。

    - 或 -

    从 Windows“命令提示符”运行 Install path\Microsoft Visual Studio\Common7\IDE\Remote Debugger\x64 或 Install path\Microsoft Visual Studio\Common7\IDE\Remote Debugger\ia64。

  2. 为远程调试配置“远程调试监视器”。


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

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

生成 64 位应用程序的转储文件

Visual Studio 允许您调试 64 位应用程序的转储文件。 调试 64 位转储文件要求能够在本地或远程访问 64 位计算机。下面的过程解释如何为 64 位应用程序生成转储文件。 调试 64 位转储文件的操作必须在 64 位计算机上执行。

转储文件可能很大,特别是在将转储文件保存为**“附带堆信息的小型转储”时。 如果将转储文件保存为不附带堆信息的“小型转储”,将生成较小的文件。 如果不附带堆信息,则 Visual Studio  无法加载符号并进行调试,除非它能够访问二进制文件。

  1. 在“调试”菜单上,单击“附加到进程”。

  2. 在“附加到进程”对话框中,选择运行 64 位应用程序的远程计算机,并选择对应于应用程序的进程。

  3. 单击“确定”。

  4. 在“调试”菜单上,单击“中断”以中断 64 位进程。

  5. 在“调试”菜单上,单击“将转储另存为”。

  6. 在“将转储另存为”对话框中的“保存类型”列表中,单击“小型转储”或“附带堆信息的小型转储”。

  7. 使用导航控件选择保存位置。

    此位置将在远程计算机上,路径与在远程计算机上显示的相同。

  8. 单击“保存”。

异常是在程序运行时发生的不正常情况。 异常通常表示有需要调试的问题。 发生异常时,调试器将向“输出”窗口中写入一条异常消息,但在““选项”对话框 ->“调试”->“常规””对话框中禁用了该选项的情况除外。

发生异常时,调试器不一定会中断执行。

  • 如果发生了非 ASP.NET 异常并且没有进行处理,调试器总是会中断执行。

  • 您可以让调试器在引发异常时立即中断执行(在调用任何处理程序之前)。

  • 如果使用 如何:单步执行“仅我的代码” 进行调试,您还有第三个选项。 您可以让调试器在遇到任何未由用户代码(“我的代码”)中的处理程序处理的异常时中断执行。 有关更多信息,请参见如何:在遇到用户未经处理的异常时中断。

  • ASP.NET 有一个顶级异常处理程序,该处理程序在对异常进行处理时向浏览器用户显示错误页面。 该顶级异常处理程序会阻止未经处理的异常中断到调试器中,除非打开了“仅我的代码”。 请确保对 ASP.NET 调试启用“仅我的代码”。

    请记住,如果发生了异常但根本没有进行处理,调试器总是会中断执行。 用户未处理的设置不会更改这一行为。

Visual Studio 调试器识别下列类别的异常:

  • C++ 异常

  • 公共语言运行时异常

  • 托管调试助手

  • 本机运行时检查

  • Win32 异常

大多数异常都有相应的处理程序,用于在异常发生时做出响应。 这样程序便有可能从异常状况中恢复过来。 本机运行时检查没有处理程序。在 Visual Basic 应用程序中,调试器将所有错误都表示为异常,即使使用 On Error 样式的错误处理程序。对于 Visual Basic 和 C#,调试器现在具备了一项新增的异常助手功能,此功能可在发生异常时提供更多信息。

在引发异常时中断

调试器可以在发生异常时立即中断应用程序的执行,使您有机会在调用处理程序之前对异常进行调试。

如果您在启用 如何:单步执行“仅我的代码” 的情况下进行调试,行为会略有不同。 启用“仅我的代码”时,调试器将忽略在“我的代码”以外引发并且不通过“我的代码”的最可能的公共语言运行时 (CLR) 异常。 但是,如果该异常完全未进行处理,调试器将始终中断。

如果将调试器设置为在引发 CLR 异常时中断且调试器在发生 CLR 异常时中断,则某些情况下调试器突出显示的行可能会稍有偏差。 例如,如果从托管代码的 if 语句内部引发异常,就可能发生这种情况。 调试器突出显示要执行的下一个 CLR 指令所在的行,即 throw 之后的行,而不是 throw 语句所在的行。

默认情况下,“异常”对话框列出每一类别中最常见的异常。 您可以添加自己的异常和删除所添加的异常。 Visual Studio 将添加的异常的列表与解决方案数据保存在一起,这样在下一次打开和运行项目时这些异常将可用。

设置在引发异常时中断执行

  1. 在“调试->窗口”菜单中,单击“异常”。

  2. 在“异常”对话框中,为整个类别的异常(如“公共语言运行时异常”)选择“引发”。

    - 或 -

    展开一个类别的异常(如“公共语言运行时异常”)的节点,并为该类别中的特定异常选择“引发”。

在“调试”菜单中添加“异常”命令

  1. 在“工具”菜单上,单击“自定义”。

    出现“自定义”对话框。

  2. 单击“命令”选项卡,在“菜单栏”列表中,单击“调试”。

  3. 单击“添加命令”。

  4. 在“添加命令”对话框的“类别”中,单击“调试”。

  5. 在“命令”中,单击“异常设置”,然后单击“确定”。

  6. (可选)可以单击“下移”以调整“异常”命令在“调试”菜单中的位置。

  7. 单击“关闭”。

在遇到用户未经处理的异常时中断

如果使用 如何:单步执行“仅我的代码” 调试,可以让调试器在发生任何没有由用户代码(“我的代码”)中的处理程序进行处理的异常时中断。 下面的过程显示了如何使用“异常”对话框来确定要在发生哪些用户未经处理的异常时中断。

默认情况下,“异常”对话框列出每一类别中最常见的异常。 您可以添加自己的异常和删除所添加的异常。 Visual Studio 将添加的异常的列表与解决方案数据保存在一起,这样在下一次打开和运行项目时这些异常将可用。

  1. 在“调试”菜单中,单击“异常设置”。

  2. 在“异常”对话框中,为整个类别的异常(如“公共语言运行时异常”)选择“用户未处理的”。

    - 或 -

    展开某种异常类别(如“公共语言运行时异常”)的节点,并为该类别中的特定异常选择“用户未处理的”。

  3. 单击“确定”。

在出现异常之后继续执行

由于出现异常而执行调试器中断时,会显示一个对话框。 对于 Visual Basic 或 C#,在默认情况下,您将看到异常助手对话框。 对于 C++,您将看到早期的 “异常” 对话框。 如果您使用的是 Visual Basic 或 C#,但在“选项”对话框中禁用了“异常助手”,您将看到“异常”对话框。

出现“异常助手”或“异常”对话框时,可尝试对导致异常的问题进行修复。

托管代码

在托管代码中,您可以在出现了未经处理的异常后在同一线程内继续执行。 “异常助手”将调用堆栈回退到引发异常的点。

本机代码

在本机 C/C++ 中,您有两个选项:

  • 您可以单击“中断”并尝试修复问题。 在中断模式下,可右击“调用堆栈”窗口中的帧并选择快捷菜单中的“展开到此帧”来展开调用堆栈。 如果未能修复问题,则继续调试时,“异常”对话框将再次显示。 否则,“异常”对话框将不会再次出现。

  • 您可以单击“继续”继续执行,而不尝试修复问题。 “异常”对话框随即重新出现。

混合模式

如果在调试本机和托管混合的代码时遇到未经处理的异常,操作系统约束将会阻止调用堆栈展开。 如果尝试使用快捷菜单来展开调用堆栈,则会出现一个错误消息,告诉您在混合代码调试期间,调试器无法在异常未得到处理的情况下展开调用堆栈。

在发生异常后检查系统代码

发生异常时,您可能需要检查系统调用内部的代码,以确定该异常的起因。 如果您没有为系统代码加载符号,或者启用了“仅我的代码”,则下面的步骤说明了如何执行此操作。

在发生异常后检查系统代码

  1. 在“调用堆栈”窗口中右击,然后单击“显示外部代码”。

    如果未启用“仅我的代码”,则快捷菜单中不提供此选项,默认情况下显示系统代码。

  2. 右击此时显示在“调用堆栈”窗口中的外部代码帧。

  3. 指向“加载符号”,然后单击“Microsoft 符号服务器”。


    1. 如果启用了“仅我的代码”,则将显示一个对话框。 它指出“仅我的代码”现在已禁用。 要单步执行系统调用,必须这样做。

    2. 将出现“正在下载公共符号”对话框。 下载完毕后会自动关闭该对话框。

  4. 现在即可在“调用堆栈”窗口和其他窗口中检查系统代码。 例如,您可以双击调用堆栈帧在源窗口或“反汇编”窗口中查看代码。

使用本机运行时检查

在 Visual C++ 中,可以使用本机 runtime_checks 捕捉常见的运行时错误,例如:

  • 堆栈指针损坏。

  • 本地数组溢出。

  • 堆栈损坏。

  • 未初始化的局部变量上的依赖项。

  • 较短变量赋值的数据丢失。

如果使用带有优化 (/O) 版本的 /RTC,将导致编译器错误。 如果在优化版本中使用 runtime_checks 杂注,则该杂注无效。

调试启用了运行时检查的程序时,如果出现运行时错误,该程序的默认操作是停止并切换到调试器。 可以更改任何运行时检查的此默认行为。 有关更多信息,请参见 异常处理(调试)。

在调试版本中启用本机运行时检查

  • 使用 /RTC 选项,并与 C 运行库(如 /MDd)调试版链接。

使用无 C 运行库的运行时检查

如果链接程序而不链接 C 运行库(使用 /NODEFAULTLIB)并希望使用运行时检查,则必须链接 RunTmChk.lib。

_RTC_Initialize 为运行时检查初始化程序。 如果未链接 C 运行库,必须在调用 _RTC_Initialize 之前检查是否用运行时错误检查编译了程序: