Skip to main content

GitHub Copilot を使ったデバッグ方法

コード内のエラーを特定して修正するには、GitHub Copilot に助けを求めましょう。

コード内のバグを見つけて修正するのは、特に開発初心者の場合はフラストレーションがたまるものです。 幸い、GitHub Copilot のようなツールを使うと、バグをすばやく特定して修正できるので、よりクリエイティブで興味深い作業に集中できるようになります。

前提条件

この記事の例では、GitHub Copilot を使って、Visual Studio Code (VS Code) の Python プロジェクトをデバッグすることを想定しています。 この例に従うには、次のことを行う必要があります。

例を使ったデバッグ方法

バグのあるコードを実行しようとすると、主に 2 つの状況が発生します。

  • 実行が完了する前にコードが終了し、エラー メッセージを受け取る。
  • コードはエラーなしで実行されるが、想定と異なる出力になる。

幸い、Copilot は、どちらの状況でもコードのデバッグに役立ちます。 その方法については、次の例を参照してください。

GitHub Copilot を使ってエラーをデバッグする

バグのあるコードを実行すると、多くの場合、エラー メッセージを受け取ります。 メッセージには、エラーが発生したファイルと行が示され、何が問題だったかが簡単に説明されています。 ただし、エラー メッセージはわかりにくい場合があります。 バグを完全に理解して修正するには、Copilot に助けを求めることができます。

new2code/debug-with-copilot リポジトリの bugged_dice_battle.py ファイルを使ってこれを試してみましょう。 このプログラムでは、次のコードを使って 2 人のプレーヤー間のサイコロ バトルをシミュレートします。

# Import the random module to easily generate pseudo-random numbers
import random

# Define a function that simulates a dice battle between two players
def dice_battle():

    # Generate random numbers between 1 and 6 for each player's die roll
    die_1 = random.randint(1, 6)
    die_2 = random.randint(1, 6)

    # Compare the die rolls and return the result as a string
    if die_1 > die_2:
        return "Player 1 rolled a " + die_1 + " and Player 2 rolled a " + die_2 + ". Player 1 wins!"
    elif die_1 < die_2:
        return "Player 1 rolled a " + die_1 + " and Player 2 rolled a " + die_2 + ". Player 2 wins!"
    else:
        return "Player 1 rolled a " + die_1 + " and Player 2 rolled a " + die_2 + ". It's a tie!"

print(dice_battle())

まず、リポジトリのクローンをローカルに作成する必要があります。

  1. VS Code で、Cmd+Shift+P キー (Mac) または Ctrl+Shift+P (Windows/Linux) キーを押してコマンド パレットを開きます。

  2. Git: Clone」と入力して Enter キーを押します。

  3. new2code/debug-with-copilot リポジトリの URL を貼り付けます。

    Text
    https://github.com/new2code/debug-with-copilot
    
  4. Enter キーを押して、コンピューター上のリポジトリを保存する場所を選びます。

  5. プロンプトが表示されたら、VS Code のリポジトリを開きます。

リポジトリをクローンしたので、bugged_dice_battle.py を実行して出力を確認してみましょう。

  1. Cmd+Shift+P キー (Mac) または Ctrl+Shift+P キー (Windows/Linux) を押して、コマンド パレットを開きます。

  2. Terminal: Create New Terminal」と入力して Enter キーを押します。

  3. Mac または Linux を使っている場合は、ターミナル タブに次のコードを貼り付けます。

    Shell
    python bugged_dice_battle.py
    

    そうではなく Windows を使っている場合は、次のコードを貼り付けます。

    Shell
    py bugged_dice_battle.py
    
  4. Enter キーを押してプログラムを実行します。

残念ながら、ターミナルに次のメッセージで終わるエラー テキストが表示されます: TypeError: can only concatenate str (not "int") to str。 この意味を理解するには、Command+Shift+I キー (Mac) または Ctrl+Alt+I キー (Windows/Linux) を押して Copilot Chat を開き、次のプロンプトを貼り付けて送信します。

Text
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_1die_2 を文字列に連結しようとしているためであり、文字列は文字列にのみ連結できる、と回答されます。 次に、コードの更新バージョンが提供されます。str() 関数を使って文字列に変換してから整数を連結する、という方法でバグを修正したものです。

GitHub Copilot を使って正しくない出力をデバッグする

場合によっては、バグのあるコードを実行してもエラーがスローされず、出力が明らかに正しくないことがあります。 この場合、VS Code ではバグの場所や説明を示すことができないため、デバッグがより困難になることがあります。

このような "目に見えない" バグの場合は、Copilot が特に役立ちます。 new2code/debug-with-copilot リポジトリの bugged_factorial_finder.py ファイルを使って実際に経験してみましょう。 この Python プログラムは階乗を計算するものであり、次のコードが含まれています。

# Initialize the factorial result to 1
factorial = 1

# Initialize the input number to 6
number = 6

# Loop from 1 to number (inclusive) and multiply factorial by each number
for i in range(1, number + 1):
    factorial *= factorial * i

print(f"The factorial of {number} is {factorial}")

既にリポジトリのクローンをローカルに作成しているので、bugged_factorial_finder.py を実行して出力を確認してみましょう。

  1. VS Code で、Cmd+Shift+P キー (Mac) または Ctrl+Shift+P (Windows/Linux) キーを押してコマンド パレットを開きます。

  2. Terminal: Create New Terminal」と入力して Enter キーを押します。

  3. Mac または Linux を使っている場合は、ターミナル タブに次のコードを貼り付けます。

    Shell
    python bugged_factorial_finder.py
    

    そうではなく Windows を使っている場合は、次のコードを貼り付けます。

    Shell
    py bugged_factorial_finder.py
    
  4. Enter キーを押してプログラムを実行します。

残念ながら、コードは期待どおりに機能しません。 戻り値は 6 階乗の正しい値である 720 になるはずですが、出力はそれよりもはるかに大きい値です。

問題の原因を理解するには、VS Code で bugged_factorial_finder.py ファイルを開いた状態で、Copilot Chat を開き、次のプロンプトを送信します。

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

Copilot により、*= 演算子を使っているため、実際には factoriali factorial の両方を乗算していることが指摘されます。 つまり、ループの反復ごとに余計な factorial が乗算されています。

このエラーを修正するために、数式から余計な factorial を削除するか、*= 演算子を = に変更するコードが Copilot から提案されます。

自分のプロジェクトをデバッグする

Copilot を使って簡単なプログラムのデバッグを演習したので、同じ手法を使って、自分の作業に隠れているバグを見つけて修正することができます。

たとえば、コードによって生成されたエラー メッセージをデバッグするには、次のプロンプトを Copilot に送信します。

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

YOUR-ERROR-MESSAGE

そうではなく、正しくない出力をデバッグする場合は、出力が正しくない理由とその修正方法を Copilot に問い合わせます。 最良の結果を得るには、出力が想定とどのように異なるかについて、できるだけ多くのコンテキストを提供します。

このような戦術があれば、プロジェクト内のバグ修正を始める準備は万全です。

次のステップ

コーディングを続けていると、デバッグが難しい特定の問題シナリオやエラーが発生することがあります。 考えられる issue の一覧と、それらを修正するための Copilot Chat プロンプトの例については、「エラーのデバッグ」を参照してください。