在本文中,您将学习如何使用 GitHub Copilot 更高效地调试。 Copilot可以提供代码修复,以及深入分析和解释代码的工作原理。 它有助于提供解决 bug 的建议修复方案,并解释异常等内容。 Copilot了解调用堆栈、帧、变量名称和值。 因此,你可与调试器感知的 AI 进行交互,从而询问与代码相关的详细问题以及一般的调试问题。
此外,Copilot为某些特定场景(如异常)提供更精确的帮助,以及AI 增强的调试方案中所描述的所有场景。 在大多数情况下,请查找“询问 Copilot”按钮或“Analyze with Copilot”按钮。 在这些方案中,Copilot已经知道问题上下文。
有关 Visual Studio 中 GitHub Copilot 补全功能的详细信息,请参阅 Visual Studio 中 GitHub Copilot 补全功能介绍。
先决条件
要开始,需要:
Visual Studio 2022 version 17.8 或更高版本
使用 GitHub 帐户登录到 Visual Studio,并具有 Copilot 访问权限
** 可以使用 GitHub Copilot 免费。 注册并利用 AI 来更快、更高效地进行编码。注意
如果在安装扩展后遇到身份验证问题,请参阅 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
或 Analyze with Copilot 按钮获得定向帮助。 Copilot已经知道你的问题的上下文。 例如,它知道当前调用堆栈、要询问的代码行以及异常的名称(如果发生),因此无需在聊天中自行提供上下文。 Copilot还提供了有关使用条件断点和跟踪点的建议。
使用 Copilot 进行调试
以下简易示例演示如何使用内联聊天视图获取 AI 帮助。
注意
您还可以通过选择 View > GitHub Copilot 对话助手 来在单独的聊天窗口中获取帮助。 有关详细信息,请参阅 GitHub Copilot 对话助手 扩展适用于 Visual Studio 的说明。
启动调试会话
在Visual Studio中,创建新的 C# 控制台应用。
在“开始”窗口上,选择创建新项目。 在搜索框中键入 console,选择C#作为语言,然后选择Console App作为.NET。 选择下一步。 键入项目名称(如 ConsoleApp_Copilot),然后选择“下一步”。
选择建议的目标框架或.NET 10,然后选择 Create。
如果看不到 .NET 的 Console App 项目模板,请转到 tools>Get 工具和功能,这将打开Visual Studio安装程序。 选择 .NET 桌面开发工作负荷,然后选择 Modify。
Visual Studio创建控制台项目,该项目显示在右窗格中的 解决方案资源管理器 中。
将 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"); } }右键单击以下语句,然后选择断点>插入断点。
int value = Int32.Parse(args[0]);按 F5,或从“调试”菜单中选择“开始调试”。
应用会在断点处暂停。 “自动”窗口显示出 args 变量的值为
string[0]。
- 右键单击代码,然后选择 “聊天 ”以打开内联聊天视图。
- 右键单击代码并选择 询问 Copilot 以打开内联聊天视图。
提示
或者,可以在“自动”或“局部变量”窗口中或数据提示中右键单击变量,然后选择询问 Copilot。 这使Copilot获得变量名称和上下文,因此您无需在聊天中自行提供上下文。
在内联聊天视图中键入以下问题:
Why does the args variable have a value of string[0]?
内嵌的 Copilot 对话助手 截图。
按 Enter 时,Copilot根据其对代码的理解提供答案。 (你可能会看到不同于此处所示的响应。)
如果Copilot对你的代码有建议的修复,它会向你展示。 如果没有,可以向Copilot询问代码建议。
提示
在内联聊天中,使用“#”符号并从下拉列表中进行选择,在问题中引用特定信息时,将特定信息移交给Copilot。 例如,如果选择部分代码,然后键入 #,则可以从 # 下拉列表中选择该所选内容。 还可以使用“#”符号来引用下拉列表中显示的 IDE 功能,例如“局部变量”窗口。
在此示例中,滚动到Copilot答案的末尾,并在内联聊天窗口的末尾选择后续问题,“如何在未将参数传递给程序时处理案例?
Copilot 显示了一种修复代码的建议。
如果要应用代码修复,请选择 Tab。
选择 Alt+Delete,以便我们可以继续学习下一部分中Copilot的其他功能。
内联 Copilot 聊天的截图
按 Enter 时,Copilot根据其对代码的理解提供答案。 (你可能会看到不同于此处所示的响应。)
如果Copilot为你的代码提供了建议修复,它会展示给你。 如果没有,可以向Copilot询问代码建议。
提示
在内联聊天中,使用“#”符号并从下拉列表中进行选择,在问题中引用特定信息时,将特定信息移交给Copilot。 例如,如果选择部分代码,然后键入 #,则可以从 # 下拉列表中选择该所选内容。 还可以使用“#”符号来引用下拉列表中显示的 IDE 功能,例如“局部变量”窗口。
在此示例中,滚动到Copilot答案的末尾,并在内联聊天窗口的末尾选择后续问题,“如何在未将参数传递给程序时处理案例?
Copilot显示对代码的建议修复。
如果要应用此代码修复方法,则请选择接受。
选择 Cancel,以便我们可以继续学习下一部分中Copilot的其他功能。
使用 Copilot 调试异常
以下简单示例演示如何在遇到异常时获取 AI 帮助,以及如何根据 AI 建议的解决方法快速更新代码。
启动调试会话
使用同一示例应用在调试器中暂停时,按 F11 或选择“调试”“单步执行”来执行当前语句。>
发生
IndexOutOfRangeException并且应用暂停,显示异常。若要获取异常方面的 AI 辅助,请继续下一部分。
请求 AI 帮助
在程序因异常暂停时,选择 使用 Copilot 分析 按钮。
如果尚未打开,将显示Copilot 对话助手窗口,并提供对错误及其发生原因的评估。 在这个示例中,Copilot识别出一个建议的代码修复方案、一个用于复制代码的按钮,以及一个用于该修复方案的预览按钮。
如果对异常有疑问,请在“询问 Copilot”文本框中进行提问。
Copilot 对话助手 窗口中预览按钮的截图。 在Copilot聊天窗口中,告知Copilot你希望它阻止错误。
当Copilot在聊天窗口中建议修复时,请选择 Apply。
查看建议的修补程序,然后选择 Tab 以应用代码建议。
重启调试程序。
这一次未发生异常。 已解决此问题!
调试器代理的主动性 bug 解决
调试器代理提供一种端到端的代理特性工作流,它使 bug 与实际运行时行为进行比对验证,而不是依赖于静态分析。 该体验将引导你完成完整的代理循环:了解和重现问题、检测应用程序、隔离根本原因,并通过实时执行验证修复。
可以从GitHub或Azure DevOps的问题开始,或者用自然语言描述 bug。 调试器代理将问题映射到本地源代码,并指导你解决问题。 可以在调试过程中与代理交互,以提供更多输入、讨论理论或实时优化修复。
若要使用调试器代理,请执行以下操作:
- 打开Copilot 对话助手窗口(View > GitHub Copilot 对话助手)。
- 从聊天窗口左下角的模式下拉列表中选择 调试器 。
- 提供GitHub或Azure DevOps问题链接,或用自然语言描述 bug。
调试器代理通过以下步骤工作:
- 上下文注入 - 将问题或 bug 说明连接到本地源代码。
- 自治重现器 - 分析 bug,如果缺少重现步骤,则自动创建一个用于触发故障的最小场景。
- 假设和检测 - 使用跟踪点和条件断点生成故障假设并检测应用,以捕获运行时状态。
- 运行时验证 - 运行调试会话并分析实时遥测,以隔离根本原因。
- 有针对性的更正 - 建议精确修复确切的故障点,而不是广泛的重构。
- 最终人工验证 - 重新运行方案,并在实时环境中与代理一起确认修复。
在聊天中的代理模式下,还可以在聊天输入中使用 @debugger 切换到调试器代理。 有关调试器代理和其他内置代理的详细信息,请参阅
获取条件断点和跟踪点方面的建议
Copilot为您提供特定于代码的条件断点和跟踪点的建议。
在此示例中,我们展示了 AI 对条件断点的建议。 对于跟踪点,AI 辅助的工作方式相同。
单击当前断点或右键单击并选择“删除断点”,以删除当前断点。
替换以下代码行:
names.Add("Major Major Major");替换为以下内容:
// names.Add("Major Major Major"); foreach (var item in args) { names.Add("Name: " + item); }在
names.Add("Name: " + item)语句左侧,右键单击装订线并选择“插入条件断点”。选择表达式字段,Copilot开始处理建议。
出现建议时,请选择一个,例如
item == "Test"。 编辑建议,使名称为Fred。
出现建议时,请选择一个(例如
item == "John")。 编辑建议,使名称为Fred。Copilot 对条件断点的建议的
。
若要测试条件表达式,请执行以下操作:
右键单击 解决方案资源管理器 中的 ConsoleApp_Copilot 项目,然后选择 Properties。
选择“调试”“常规”>“打开调试启动配置文件 UI”。>
在“命令行参数”字段中,在三个单独的行上输入
5 Fred Joe。
重启调试程序。
当调试程序在断点处暂停时,请检查
item的值,并验证当前值是否为Fred。