# 了解如何使用 GitHub Copilot 进行调试

通过向 GitHub Copilot 寻求帮助，识别并修复代码中的错误。

查找并修复代码中的 bug 可能会令人沮丧（尤其是在你是新开发人员时）。 值得庆幸的是，GitHub Copilot 等工具可以快速识别和消除 bug，让你可以专注于更具创造性、更有趣的工作。

## 先决条件

本文中的示例假定正在使用 GitHub Copilot 调试 Visual Studio Code (VS Code) 中的 Python 项目。 若要按照这些示例操作，需要：

* 完成 Visual Studio Code 文档中的[“使用 Copilot 设置 Visual Studio Code”](https://code.visualstudio.com/docs/copilot/setup-simplified)。
* [Download Python](https://www.python.org/downloads/)。
* 安装适用于Visual Studio Code的[Python 扩展](https://marketplace.visualstudio.com/items?itemName=ms-python.python)。

## 学习通过示例进行调试

尝试运行有 bug 的代码时，你会遇到两个主要情况：

* 代码在完成运行之前退出，并且你会收到一条错误消息。
* 代码运行时没有错误，但是输出与你预期的不同。

值得庆幸的是，Copilot 可以帮助在这两种情况下调试代码。 若要了解如何操作，请完成以下示例。

### 使用 GitHub Copilot 调试错误

运行有 bug 的代码时，你通常会收到一条错误消息。 该消息告知你发生错误的文件和行，并简要描述问题所在。 但是，错误消息可能会令人困惑。 若要充分理解并修复 bug，我们可以向 Copilot 寻求帮助。

让我们通过一个示例仓库试试看：[`new2code/debug-with-copilot`](https://github.com/new2code/debug-with-copilot)。

#### 克隆示例存储库

首先，需要创建该仓库的本地副本：

1. [在 VS Code 中开始克隆 new2code/debug-with-copilot 存储库](vscode://vscode.git/clone?url=https://github.com/new2code/debug-with-copilot)。 <!-- markdownlint-disable-line GHD003 -->
2. \*\*
   \*\*选择在计算机上保存存储库的位置，然后单击“选择为存储库目标”。
3. 出现提示时，打开存储库。

#### 运行存在 bug 的文件

接下来，我们运行 [`bugged_dice_battle.py`](https://github.com/new2code/debug-with-copilot/blob/main/bugged_dice_battle.py) 文件。 此程序模拟两名玩家之间的骰子对战。

1. 在 VS Code 中，打开并查看 `bugged_dice_battle.py` 文件。

2. 按<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>（Windows/Linux）或<kbd>Cmd</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>（Mac）打开命令面板。

3. 输入 `Terminal: Create New Terminal` 并按 <kbd>Enter</kbd> 键。

4. 在终端选项卡中，粘贴以下命令。

   Windows：

   ```shell copy
   py bugged_dice_battle.py
   ```

   Mac 或 Linux：

   ```shell copy
   python bugged_dice_battle.py
   ```

5. 按 <kbd>Enter</kbd> 运行程序。

遗憾的是，我们的终端显示了一些错误信息，并出现以下消息：

> TypeError：只能将 str（而非“int”）连接到 str

#### 调试文件

若要了解此错误的含义，请在副驾驶聊天中打开VS Code，然后粘贴并发送以下提示： <!-- markdownlint-disable-line GHD003 -->

```text copy
Explain in depth why my code produces the following error and how I can fix it:

TypeError: can only concatenate str (not "int") to str
```

Copilot 将响应出现错误，因为我们正尝试将整数 `die_1` 和 `die_2` 与字符串连接，而你只能将字符串与字符串连接。

它还将提供一个我们代码的更新版本，该版本通过使用\*\*\*\* 函数将整数转换为字符串，然后再进行连接，从而修复bug`str()`。 将 Copilot 的建议应用于文件，练习调试的最后一步。

### 使用 GitHub Copilot 调试不正确的输出

有时，有 bug 的代码运行时不会引发任何错误，但输出显然不正确。 在这种情况下，调试可能更加困难，因为 VS Code 无法告知你 bug 的位置或说明。

对于这些“不可见的”bug，Copilot 特别有用。 让我们通过示例仓库中的另一个文件来动手实践一下：`bugged_factorial_finder.py`。 这是一个用于计算阶乘的Python程序。

#### 运行存在 bug 的文件

首先，我们来运行这个程序，看看它输出的错误结果：

1. 打开并查看 `bugged_factorial_finder.py` 文件。

2. 在之前创建的终端中，粘贴以下命令。
   Windows：

   ```shell copy
   py bugged_factorial_finder.py
   ```

   Mac 或 Linux：

   ```shell copy
   python bugged_factorial_finder.py
   ```

3. 按 <kbd>Enter</kbd> 运行程序。

遗憾的是，代码未按预期工作。 我们希望它返回 `720`，即 6 阶乘的正确值，但输出远高于此。

#### 调试文件

若要了解问题所在，[打开 副驾驶聊天](vscode://GitHub.Copilot-Chat?ref_product=copilot\&ref_type=engagement\&ref_style=text)，然后发送以下提示： <!-- markdownlint-disable-line GHD003 -->

```text copy
Why is the output of this code so much higher than expected? Please explain in depth and suggest a solution.
```

Copilot 将指出，由于我们使用的是 `*=` 运算符，因此我们实际上是将 `factorial` 乘以 `i` 和 \*\*\*\*`factorial`。 换句话说，对于循环的每个迭代，我们都会乘以额外的 `factorial`。

若要修复此错误，Copilot 将建议从公式中删除额外 `factorial` 的代码或将 `*=` 运算符更改为 `=` 的代码。 立即进行更改！

## 调试自己的项目

现在你已经练习过使用 Copilot 调试一些简单程序，那么可以用相同的方法查找并修复隐藏在自己工作中的错误。

例如，若要调试代码生成的错误消息，请向 Copilot 发送以下提示：

```text copy
Explain in depth why my code produces the following error and how I can fix it:

YOUR-ERROR-MESSAGE
```

除此之外，如果你要调试不正确的输出，请询问 Copilot 为什么输出不正确以及如何修复它。 为了获得最佳结果，请提供尽可能多的上下文，说明输出与你的期望有何不同。

借助这些策略，你完全有能力开始清除项目中的 bug 了！

## 后续步骤

随着你继续编码，你可能会遇到难以调试的特定问题场景和错误。 有关潜在问题的列表及用于修复这些问题的示例 副驾驶聊天 提示，请参阅 [调试中出现的错误](/zh/copilot/copilot-chat-cookbook/debugging-errors)。