通过


在Visual Studio中使用GitHub Copilot调试应用

在本文中,您将学习如何使用 GitHub Copilot 更高效地调试。 Copilot可以提供代码修复,以及深入分析和解释代码的工作原理。 它有助于提供解决 bug 的建议修复方案,并解释异常等内容。 Copilot了解调用堆栈、帧、变量名称和值。 因此,你可与调试器感知的 AI 进行交互,从而询问与代码相关的详细问题以及一般的调试问题。

此外,Copilot为某些特定场景(如异常)提供更精确的帮助,以及AI 增强的调试方案中所描述的所有场景。 在大多数情况下,请查找“询问 Copilot”按钮或“Analyze with Copilot”按钮。 在这些方案中,Copilot已经知道问题上下文。

有关 Visual Studio 中 GitHub Copilot 补全功能的详细信息,请参阅 Visual Studio 中 GitHub Copilot 补全功能介绍

先决条件

要开始,需要:

AI 增强型场景

Copilot了解调用堆栈、帧、变量名称和值。 因此,你可与调试器感知的 AI 进行交互,从而询问与代码相关的详细问题以及一般的调试问题。

此外,Copilot为某些目标方案提供更精确的帮助,例如下表中所述的方案。

功能或情景 链接
调试器代理 请参阅本文中的调试器代理进行的Agentic错误解决方法。 端到端的自主化工作流程,可重现 bug、为您的应用程序添加监测工具,并使用实时运行数据验证修复方案。
调用堆栈分析 请参阅 使用 Copilot 分析调用堆栈。 获取线程活动的一键分析,包括异步流程说明。
异常 请参阅本文中的 使用 Copilot 调试异常。 异常帮助包括死锁检测错误方面的帮助。
变量 请参阅 获取 AI 帮助
LINQ 查询分析 在代码编辑器中调试时,将鼠标悬停在 LINQ 查询上以查看返回值。 选择使用 Copilot 分析按钮以获取 AI 帮助。 请参阅 LINQ 查询的 View 返回值
数据提示 请参阅通过数据提示获取 AI 帮助
条件断点和跟踪点 请参阅本文中的获取条件断点和跟踪点方面的建议
快速操作(灯泡) 请参阅通过快速操作获取 AI 帮助
IEnumerable 表格可视化工具 请参阅 获取 AI 帮助
内联返回值 请参阅 查看方法调用的返回值。
内联值 请参阅 “查看内联值”。
多线程调试 请参阅 “获取关于线程视图的 AI 帮助”
单元测试 请参阅 获取 AI 帮助以调试测试
使用存储库上下文检查异常 请参阅 获取存储库上下文的 AI 帮助
断点故障排除 请参阅 获取 AI 帮助
功能或情景 链接
调用堆栈分析 请参阅 使用 Copilot 分析调用堆栈。 获取线程活动的一键分析,包括异步流程说明。
异常 请参阅本文中的使用Copilot调试异常。 异常帮助包括死锁检测错误方面的帮助。
变量 请参阅 获取 AI 帮助
LINQ 查询分析 在代码编辑器中调试时,将鼠标悬停在 LINQ 查询上以查看返回值。 选择 使用 Copilot 分析 按钮以获取 AI 帮助。 请参阅 LINQ 查询的 View 返回值
数据提示 请参阅通过数据提示获取 AI 帮助
条件断点和跟踪点 请参阅本文中的获取条件断点和跟踪点方面的建议
快速操作(灯泡) 请参阅通过快速操作获取 AI 帮助
IEnumerable 表格可视化工具 请参阅 获取 AI 帮助
内联返回值 请参阅 查看方法调用的返回值。
内联值 请参阅 “查看内联值”。
多线程调试 请参阅 “获取关于线程视图的 AI 帮助”
单元测试 请参阅 获取 AI 帮助以调试测试
使用存储库上下文检查异常 请参阅 获取存储库上下文的 AI 帮助
断点故障排除 请参阅 获取 AI 帮助

在大多数情况下,通过使用 询问 Copilot询问 Copilot 按钮的截图。Analyze with Copilot 按钮获得定向帮助。 Copilot已经知道你的问题的上下文。 例如,它知道当前调用堆栈、要询问的代码行以及异常的名称(如果发生),因此无需在聊天中自行提供上下文。 Copilot还提供了有关使用条件断点和跟踪点的建议。

使用 Copilot 进行调试

以下简易示例演示如何使用内联聊天视图获取 AI 帮助。

注意

您还可以通过选择 View > GitHub Copilot 对话助手 来在单独的聊天窗口中获取帮助。 有关详细信息,请参阅 GitHub Copilot 对话助手 扩展适用于 Visual Studio 的说明

启动调试会话

  1. 在Visual Studio中,创建新的 C# 控制台应用。

    在“开始”窗口上,选择创建新项目。 在搜索框中键入 console,选择C#作为语言,然后选择Console App作为.NET。 选择下一步。 键入项目名称(如 ConsoleApp_Copilot),然后选择“下一步”

    选择建议的目标框架或.NET 10,然后选择 Create

    如果看不到 .NET 的 Console App 项目模板,请转到 tools>Get 工具和功能,这将打开Visual Studio安装程序。 选择 .NET 桌面开发工作负荷,然后选择 Modify

    Visual Studio创建控制台项目,该项目显示在右窗格中的 解决方案资源管理器 中。

  2. Program.cs 中的代码替换为以下代码:

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
        public static void Main(string[] args)
        {
            int value = Int32.Parse(args[0]);
            List<String> names = null;
            if (value > 0)
                names = new List<String>();
    
            names.Add("Major Major Major");
        }
    }
    
  3. 右键单击以下语句,然后选择断点>插入断点

    int value = Int32.Parse(args[0]);
    
  4. 按 F5,或从“调试”菜单中选择“开始调试”

    应用会在断点处暂停。 “自动”窗口显示出 args 变量的值为 string[0]

    “自动”窗口的屏幕截图。

  1. 右键单击代码,然后选择 “聊天 ”以打开内联聊天视图。
  1. 右键单击代码并选择 询问 Copilot 以打开内联聊天视图。

提示

或者,可以在“自动”或“局部变量”窗口中或数据提示中右键单击变量,然后选择询问 Copilot。 这使Copilot获得变量名称和上下文,因此您无需在聊天中自行提供上下文。

  1. 在内联聊天视图中键入以下问题:

    Why does the args variable have a value of string[0]?
    

内嵌的 Copilot 对话助手 截图。

Enter 时,Copilot根据其对代码的理解提供答案。 (你可能会看到不同于此处所示的响应。)

Copilot回答的问题的屏幕截图。

如果Copilot对你的代码有建议的修复,它会向你展示。 如果没有,可以向Copilot询问代码建议。

提示

在内联聊天中,使用“#”符号并从下拉列表中进行选择,在问题中引用特定信息时,将特定信息移交给Copilot。 例如,如果选择部分代码,然后键入 #,则可以从 # 下拉列表中选择该所选内容。 还可以使用“#”符号来引用下拉列表中显示的 IDE 功能,例如“局部变量”窗口。

  1. 在此示例中,滚动到Copilot答案的末尾,并在内联聊天窗口的末尾选择后续问题,“如何在未将参数传递给程序时处理案例?

    Copilot 后续问题的截图。

    Copilot 显示了一种修复代码的建议。

    Copilot建议的修复截图。

    如果要应用代码修复,请选择 Tab

  2. 选择 Alt+Delete,以便我们可以继续学习下一部分中Copilot的其他功能。

内联 Copilot 聊天的截图

Enter 时,Copilot根据其对代码的理解提供答案。 (你可能会看到不同于此处所示的响应。)

Copilot回答问题的截图。

如果Copilot为你的代码提供了建议修复,它会展示给你。 如果没有,可以向Copilot询问代码建议。

提示

在内联聊天中,使用“#”符号并从下拉列表中进行选择,在问题中引用特定信息时,将特定信息移交给Copilot。 例如,如果选择部分代码,然后键入 #,则可以从 # 下拉列表中选择该所选内容。 还可以使用“#”符号来引用下拉列表中显示的 IDE 功能,例如“局部变量”窗口。

  1. 在此示例中,滚动到Copilot答案的末尾,并在内联聊天窗口的末尾选择后续问题,“如何在未将参数传递给程序时处理案例?

    Copilot 后续问题的屏幕截图。

    Copilot显示对代码的建议修复。

    Copilot建议的修复方案截图。

    如果要应用此代码修复方法,则请选择接受

  2. 选择 Cancel,以便我们可以继续学习下一部分中Copilot的其他功能。

使用 Copilot 调试异常

以下简单示例演示如何在遇到异常时获取 AI 帮助,以及如何根据 AI 建议的解决方法快速更新代码。

启动调试会话

  • 使用同一示例应用在调试器中暂停时,按 F11 或选择“调试”“单步执行”来执行当前语句。>

    发生 IndexOutOfRangeException 并且应用暂停,显示异常。

    若要获取异常方面的 AI 辅助,请继续下一部分。

请求 AI 帮助

  1. 在程序因异常暂停时,选择 使用 Copilot 分析 按钮。

    异常情况下 询问 Copilot 按钮的截图

    如果尚未打开,将显示Copilot 对话助手窗口,并提供对错误及其发生原因的评估。 在这个示例中,Copilot识别出一个建议的代码修复方案、一个用于复制代码的按钮,以及一个用于该修复方案的预览按钮。

    如果对异常有疑问,请在“询问 Copilot”文本框中进行提问。

    Copilot 对话助手 窗口中预览按钮的截图。

  2. 在Copilot聊天窗口中,告知Copilot你希望它阻止错误。

  3. 当Copilot在聊天窗口中建议修复时,请选择 Apply

  4. 查看建议的修补程序,然后选择 Tab 以应用代码建议。

    Visual Studio 中的代码预览截图。

  5. 重启调试程序。

    这一次未发生异常。 已解决此问题!

  1. 当应用程序因异常而暂停时,选择“询问 Copilot”按钮。

    异常中询问 Copilot按钮的屏幕截图。

    如果尚未打开,将显示Copilot 对话助手窗口,并提供对错误及其发生原因的评估。 在此示例中,Copilot识别出建议的代码修复、用于复制代码的按钮,以及用于代码修复的预览按钮。

    如果对异常有疑问,请在询问 Copilot文本框中输入您的问题。

  2. 选择预览按钮。

    Copilot 对话助手 窗口中预览按钮的截图。

    Visual Studio显示带有建议的修补程序的代码预览。

  3. 查看建议的解决方法,然后选择“接受”以应用代码建议

    Visual Studio 中的代码预览截图。

  4. 重启调试程序。

    这一次未发生异常。 已解决此问题!

调试器代理的主动性 bug 解决

调试器代理提供一种端到端的代理特性工作流,它使 bug 与实际运行时行为进行比对验证,而不是依赖于静态分析。 该体验将引导你完成完整的代理循环:了解和重现问题、检测应用程序、隔离根本原因,并通过实时执行验证修复。

可以从GitHub或Azure DevOps的问题开始,或者用自然语言描述 bug。 调试器代理将问题映射到本地源代码,并指导你解决问题。 可以在调试过程中与代理交互,以提供更多输入、讨论理论或实时优化修复。

若要使用调试器代理,请执行以下操作:

  1. 打开Copilot 对话助手窗口(View > GitHub Copilot 对话助手)。
  2. 从聊天窗口左下角的模式下拉列表中选择 调试器
  3. 提供GitHub或Azure DevOps问题链接,或用自然语言描述 bug。

显示自定义代理的截图在 Visual Studio 中中的代理选择器。

调试器代理通过以下步骤工作:

  • 上下文注入 - 将问题或 bug 说明连接到本地源代码。
  • 自治重现器 - 分析 bug,如果缺少重现步骤,则自动创建一个用于触发故障的最小场景。
  • 假设和检测 - 使用跟踪点和条件断点生成故障假设并检测应用,以捕获运行时状态。
  • 运行时验证 - 运行调试会话并分析实时遥测,以隔离根本原因。
  • 有针对性的更正 - 建议精确修复确切的故障点,而不是广泛的重构。
  • 最终人工验证 - 重新运行方案,并在实时环境中与代理一起确认修复。

在聊天中的代理模式下,还可以在聊天输入中使用 @debugger 切换到调试器代理。 有关调试器代理和其他内置代理的详细信息,请参阅 将内置代理和自定义代理与 GitHub Copilot

获取条件断点和跟踪点方面的建议

Copilot为您提供特定于代码的条件断点和跟踪点的建议。

在此示例中,我们展示了 AI 对条件断点的建议。 对于跟踪点,AI 辅助的工作方式相同。

  1. 单击当前断点或右键单击并选择“删除断点”,以删除当前断点。

  2. 替换以下代码行:

    names.Add("Major Major Major");
    

    替换为以下内容:

    // names.Add("Major Major Major");
    foreach (var item in args)
    {
       names.Add("Name: " + item);
    }
    
  3. names.Add("Name: " + item) 语句左侧,右键单击装订线并选择“插入条件断点”

  4. 选择表达式字段,Copilot开始处理建议。

    展示Copilot条件断点建议的截图。

  1. 出现建议时,请选择一个,例如 item == "Test"。 编辑建议,使名称为 Fred

    Copilot 的条件断点建议截图

  1. 出现建议时,请选择一个(例如 item == "John")。 编辑建议,使名称为 Fred

    Copilot 对条件断点的建议的截图

  1. 若要测试条件表达式,请执行以下操作:

    1. 右键单击 解决方案资源管理器 中的 ConsoleApp_Copilot 项目,然后选择 Properties

    2. 选择“调试”“常规”>“打开调试启动配置文件 UI”。>

    3. 在“命令行参数”字段中,在三个单独的行上输入 5 Fred Joe

      为项目输入命令行参数的屏幕截图。

    4. 重启调试程序。

    当调试程序在断点处暂停时,请检查 item 的值,并验证当前值是否为 Fred