在 Visual Studio 中使用 Just-In-Time 调试器进行调试

当一个在 Visual Studio 之外运行的应用发生错误或崩溃时,实时调试可自动启动 Visual Studio。 只需进行In-Time 调试,您即可在 Visual Studio 以外测试应用程序,并在出现问题时打开 Visual Studio 开始调试。

实时调试适用于 Windows 桌面应用。 它不适用于通用 Windows 应用,也不适用于托管在本机应用程序(如可视化工具)中的托管代码。

小贴士

如果只想让实时调试器对话框停止显示,而不安装 Visual Studio,请参阅禁用实时调试器。 如果之前安装过 Visual Studio,可能需要 从 Windows 注册表禁用 Just-In-Time 调试

在 Visual Studio 中启用或禁用实时调试

在 Visual Studio 中使用 Just-In-Time 调试器时,可以从“工具>选项”或“调试>”菜单访问调试器的配置选项。 即时调试器位于安装程序的单独组件>调试和测试部分中可用。

注释

若要启用或禁用实时调试,必须以管理员身份运行 Visual Studio。 启用或禁用 Just-In-Time 调试会设置注册表项,可能需要管理员权限才能更改该注册表项。 若要以管理员身份打开 Visual Studio,请右键单击 Visual Studio 应用,然后选择 以管理员身份运行

启用或禁用实时调试:

  1. “工具>选项”窗格中,展开“所有设置>>”部分。

  2. 在右窗格中,选择配置即时调试链接。

    显示如何在 Visual Studio 中配置 Just-In-Time 调试的屏幕截图。

  3. Visual Studio 调试器选项 对话框中,配置启用即时调试这些类型代码选项。 选择您希望即时调试的代码类型:托管(.NET Framework)或本机

  4. 选择“确定”

  1. “工具>选项”对话框中,展开“实时>”部分。

  2. 在“为这些类型的代码启用实时调试”框中,选择希望通过实时调试进行调试的代码类型:“托管”、“本机”和/或“脚本”

    启用或禁用 JIT 调试

  3. 选择“确定”

如果启用了实时调试器,但它并未在应用程序崩溃或出错时打开,请参阅排查实时调试问题

从 Windows 注册表禁用实时调试

即便计算机中不再安装有 Visual Studio,仍可启用实时调试。 如果不再安装 Visual Studio,可以通过编辑 Windows 注册表来禁用 Just-In-Time 调试。

若要通过编辑注册表禁用实时调试,请执行以下操作:

  1. 在 Windows “开始”菜单中,运行 注册表编辑器regedit.exe)。

  2. 注册表编辑器 窗口中,找到并删除以下注册表项(如果存在):

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

    JIT 注册表项

  3. 如果存在以下注册表项,请将其删除:

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

    请确保不要删除或更改任何其他注册表项。

  4. 关闭 注册表编辑器 窗口。

启用 Windows 窗体的实时调试

默认情况下,Windows 窗体应用具有顶级异常处理程序,允许应用在可以恢复时继续运行。 如果 Windows 窗体应用引发未经处理的异常,则会显示以下对话框:

Windows 窗体未经处理的异常

若要启用 Just-In-Time 调试模式而不是标准的 Windows 窗体错误处理,请添加以下设置:

  • system.windows.forms 文件的 < 部分中,将 > 值设置为

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • 在 C++ 窗体应用程序中,还要在 .configDebuggableAttribute 文件或代码中将 true 设置为 。 如果使用 /Zi 进行编译,并且不使用 /Og,编译器会为你设置此属性。 但是,如果要调试非优化发布版本,则必须通过在应用的 DebuggableAttribute 文件中添加以下行来设置

    [assembly:System::Diagnostics::DebuggableAttribute(true, true)];
    

    有关详细信息,请参阅 DebuggableAttribute

使用实时调试

本示例将指导你在应用程序引发错误时进行 Just-In-Time 调试。

  • 必须安装 Visual Studio 才能执行以下步骤。 如果没有 Visual Studio,可以下载免费的 Visual Studio Community Edition

  • 确保在工具>选项中,配置“启用即时调试以适用于这些类型的代码”选项来启用即时调试。

在本示例中,你在 Visual Studio 中创建一个 C# 控制台应用,该应用引发 NullReferenceException

  1. 在 Visual Studio 中,创建一个名为 ThrowsNullException 的 C# 控制台应用(“文件”>“新建”>“项目”>“Visual C#”>“控制台应用程序”)。 有关在 Visual Studio 中创建项目的详细信息,请参阅 演练:创建简单的应用程序

  2. 在 Visual Studio 中打开项目时,打开 Program.cs 文件。 将 Main() 方法替换为以下代码,该代码将一行输出到控制台,然后引发 NullReferenceException:

    static void Main(string[] args)
    {
        Console.WriteLine("we will now throw a NullReferenceException");
        throw new NullReferenceException("this is the exception thrown by the console app");
    }
    
  3. 若要生成解决方案,请选择 调试(默认)或 发布 配置,然后选择 生成>重新生成解决方案

    • 对于完整的调试体验,请选择 “调试 ”配置。

    • 如果选择 “发布 ”配置,则必须关闭 “仅我的代码 ”才能运行此过程。

      “工具>选项”窗格中,展开“所有设置>>”部分,然后清除“启用仅我的代码”复选框。

      “工具>选项 ”对话框中,展开 “调试>常规 ”部分,然后清除“ 启用仅我的代码 ”复选框。

      取消选中此选项时,启动调试时如果没有用户代码则警告(仅托管) 选项会被自动禁用。

    有关生成配置的详细信息,请参阅 了解生成配置

  4. 在 C# 项目文件夹中打开生成的应用 ThrowsNullException.exe...\ThrowsNullException\ThrowsNullException\bin\Debug...\ThrowsNullException\ThrowsNullException\bin\Release)。

    应会看到以下命令窗口:

    ThrowsNullException.exe 控制台的屏幕截图,其中引发了一个未处理的空引用异常 (System.NullReferenceException)。

  5. “选择实时调试器”对话框将打开。

    “选择实时调试器”对话框的屏幕截图,该对话框在 ThrowsNullException.exe 控制台窗口中出现异常之后显示。

    在“可用调试器”下,选择“首选 Visual Studio 版本< 的新实例”(如果尚未选择)>

  6. 选择“确定”

    ThrowsNullException 项目将在 Visual Studio 的新实例中打开,执行在引发异常的行处停止:

    Visual Studio 中 ThrowsNullException 项目的屏幕截图,其中突出显示了引发异常的源代码行。

此时可以开始调试。 如果要调试实际应用,则需要了解代码引发异常的原因。

注意

如果应用包含不受信任的代码,将显示一个安全警告对话框,使你能够决定是否继续调试。 在继续调试之前,请决定是否信任代码。 你自己编写了代码吗? 如果应用程序在远程计算机上运行,是否识别进程的名称? 如果应用在本地运行,请考虑在计算机上运行的恶意代码的可能性。 如果决定信任该代码,请选择“确定”。 否则,请选择“取消”

排查实时调试问题

如果在应用崩溃时实时调试不启动,即使 Visual Studio 中已启用实时调试也是如此,则:

  • 已知 Windows 问题可能会导致 Just-In-Time 调试器失败。

    修复方法是向以下注册表项添加值为“自动”的“DWORD 值”,以及值为“1”的“数值数据”

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

    • (对于 64 位计算机上的 32 位应用) HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Windows 错误报告可能会接管计算机上的错误处理。

    若要修复此问题,请使用注册表编辑器向以下注册表项添加值为“已禁用”的“DWORD 值”,以及值为“1”的“数值数据”

    • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

    • (对于 64 位计算机上的 32 位应用) HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting

    有关详细信息,请参阅 .WER 设置

在 Just-In-Time 调试过程中,您可能会看到以下错误消息:

  • 无法附加到故障进程。 指定的程序不是 Windows 或 MS-DOS 程序。

    调试器尝试附加到由其他用户运行的进程。

    若要解决此问题,请在 Visual Studio 中打开 “调试>附加到进程”(或 按 Ctrl + Alt + P),并在 可用进程 列表中找到要调试的进程。 如果不知道进程的名称,可在 Visual Studio Just-In-Time 调试器 对话框中找到进程 ID。 选择 可用进程 列表中的进程,然后选择 附加。 选择“否”可关闭“实时调试器”对话框

  • 无法启动 调试器,因为没有用户登录。

    没有用户登录到控制台,因此没有用户会话来显示 Just-In-Time 调试对话框。

    若要解决此问题,请登录到计算机。

  • 类没有注册。

    调试器尝试创建未注册的 COM 类,可能是由于安装问题。

    若要解决此问题,请使用 Visual Studio 安装程序重新安装或修复 Visual Studio 安装。