デバッグとは?Python初心者向けにエラーの見つけ方・修正方法を解説

プログラミング基礎

プログラミングを勉強していると、「プログラムが動かない」「計算結果が間違っている」「エラーの原因が分からない」といった問題に遭遇します。

そのようなときに必要になるのが「デバッグ」です。

デバッグとは、プログラムに存在する不具合(バグ)の原因を調べ、修正する作業のことです。

例えば、テストの平均点を求めるプログラムを作ったのに、間違った結果が表示された場合、原因となっている計算式や変数の値を調べて修正します。

この記事では、高校の情報Ⅰを学習している人やPython初心者向けに、デバッグの基本から、printを使った調査方法、ブレークポイントやステップ実行の使い方まで解説します。

1. デバッグとは?

デバッグ(Debugging)とは、プログラムの不具合を見つけ、その原因を特定して修正する作業です。

プログラムに含まれる不具合は「バグ(Bug)」と呼ばれます。

例えば、次のプログラムを考えてみましょう。

price = 100
quantity = 3

total = price + quantity

print(total)

実行結果:

103

このプログラムでは、商品の単価と数量を使って合計金額を計算しようとしています。

しかし、正しい合計金額は300円です。プログラム自体は正常に実行されていますが、計算方法に問題があります。

正しくは、次のように掛け算を使用します。

price = 100
quantity = 3

total = price * quantity

print(total)

実行結果:

300

このように、不具合の原因を調べて修正することがデバッグです。

2. バグとエラーの違い

プログラミングでは、「バグ」と「エラー」という言葉がよく登場します。

どちらもプログラムの問題を表しますが、意味には違いがあります。

項目意味例
バグプログラムに含まれる不具合合計金額の計算式が間違っている
エラー文法や実行時の問題、またはその通知存在しない変数を使用する
デバッグ不具合の原因を調べて修正する作業間違った計算式を見つけて直す

エラーメッセージが表示される場合は、そこから原因を調べられます。

しかし、間違った計算結果が表示されるようなバグでは、エラーメッセージが出ないこともあります。

そのため、デバッグではプログラムが動くかどうかだけでなく、意図した結果になっているかどうかも確認する必要があります。

3. デバッグの基本的な手順

デバッグは、次の5つのステップで進めると原因を見つけやすくなります。

デバッグの5ステップ

  1. 問題を再現するどのような操作や入力をすると不具合が発生するのかを確認します。
  2. 期待する結果と実際の結果を比較する本来どのような結果になるべきかを明確にします。
  3. 原因を調べるエラーメッセージや変数の値、プログラムの実行順序を確認します。
  4. 原因となっている部分を修正する一度に多くの場所を変更せず、原因を特定して修正します。
  5. 修正後に再確認する問題が解決したことを確認し、ほかの処理に影響がないかも調べます。

特に重要なのは、期待する結果と実際の結果を比較することです。

何が間違っているのかを具体的に把握すると、調べるべき場所を絞り込みやすくなります。

4. printデバッグとは?

Python初心者が最初に覚えておきたいのが、print() を使ったデバッグです。

変数の値や、プログラムの途中経過を表示することで、不具合の原因を調べる方法です。

例えば、3人のテストの平均点を求めるプログラムを考えてみましょう。

scores = [70, 80, 90]

total = 0

for score in scores:
    total = total + score

average = total / 2

print(average)

実行結果:

120.0

正しい平均点は80点ですが、120点と表示されています。

そこで、途中に print() を追加して、変数の値を確認します。

scores = [70, 80, 90]

total = 0

for score in scores:
    total = total + score
    print("現在の合計:", total)

print("データ数:", len(scores))

average = total / 2

print("平均点:", average)

実行結果:

現在の合計: 70
現在の合計: 150
現在の合計: 240
データ数: 3
平均点: 120.0

合計点は240点で、データ数は3つです。

しかし、平均点の計算では2で割っていることが分かります。

そこで、次のように修正します。

average = total / len(scores)

実行結果:

80.0

このように、プログラムの途中で変数の値を確認すると、問題が発生している場所を見つけやすくなります。

5. エラーメッセージを使って原因を調べる

Pythonでは、実行中にエラーが発生すると、エラーメッセージが表示されます。

例えば、次のプログラムです。

numbers = [10, 20, 30]

print(numbers[5])

実行すると、次のようなエラーが発生します。

IndexError: list index out of range

これは、リストの範囲外を指定していることを表しています。

デバッグでは、まずエラー名と説明文を確認し、問題が発生した行を調べましょう。

エラーメッセージの種類については、前回の記事「プログラミングのエラーとは?」も参考にしてください。

6. ブレークポイントとは?

プログラムが長くなると、print() を何か所にも追加して調べるのは大変です。

そこで便利なのが「ブレークポイント」です。

ブレークポイントとは、プログラムの実行を指定した場所で一時停止させる仕組みです。

例えば、次のプログラムを考えてみましょう。

scores = [70, 80, 90]

total = 0

for score in scores:
    total += score

average = total / len(scores)

print(average)

total += score の行にブレークポイントを設定すると、繰り返し処理の途中でプログラムを一時停止できます。

ブレークポイントのイメージ

1 scores = [70, 80, 90] 2 total = 0 3 4 for score in scores:

5 total += score

6 7 average = total / len(scores) 8 print(average)

5行目にブレークポイント

赤い丸のある行で処理を停止し、変数の値などを確認します。

ブレークポイントを使えば、プログラムの実行途中で、変数にどのような値が入っているかを確認できます。

7. Visual Studio Codeでデバッグする方法

Pythonの開発では、Visual Studio Code(VS Code)などの開発環境を使ってデバッグできます。

VS CodeでPythonのデバッグを行う基本的な手順は、次のとおりです。

  1. Pythonファイルを開き、停止させたい行の左側をクリックしてブレークポイントを設定する。
  2. 「実行とデバッグ」からPythonのデバッグを開始する。
  3. ブレークポイントで停止したら、変数の値を確認する。
  4. ステップ実行で処理を1行ずつ進める。
  5. 原因を特定したら、プログラムを修正して再実行する。

Pythonのデバッグ機能を使うには、Python本体と、対応するVS CodeのPython拡張機能などを用意しておきましょう。

公式の解説は、VS Code:Pythonのデバッグ  でも確認できます。

8. ステップ実行とは?

ステップ実行とは、プログラムを少しずつ進めながら、処理内容や変数の変化を確認する機能です。

例えば、次のプログラムをデバッグするとします。

def calculate(a, b):
    result = a + b
    return result

answer = calculate(10, 20)

print(answer)

VS Codeなどのデバッガーでは、主に次の操作を使用します。

操作内容
ステップオーバー関数の中には入らず、次の処理へ進む
ステップイン呼び出している関数の内部に入る
ステップアウト現在の関数を抜けて呼び出し元へ戻る
続行次のブレークポイントなどまで実行する

関数の内部に問題があると思われる場合はステップインを使い、関数の結果だけを確認したい場合はステップオーバーを使うなど、状況に応じて操作を選びましょう。

9. Pythonのpdbを使ったデバッグ

Pythonには、pdb というデバッグ用のモジュールも用意されています。

例えば、次のように breakpoint() を記述します。

scores = [70, 80, 90]

total = 0

for score in scores:
    breakpoint()
    total += score

print(total)

通常のコマンドライン環境で実行すると、breakpoint() の位置でプログラムが停止し、設定に応じてデバッガーが起動します。

標準のpdbでは、主に次のコマンドを使用します。

コマンド動作
p total変数totalの値を表示
n次の処理へ進む
s関数の内部に入る
c実行を再開
qデバッグを終了

最初はprintデバッグで十分ですが、プログラムが複雑になったら、こうしたデバッグ機能も活用すると便利です。

10. 条件分岐のバグをデバッグしてみよう

条件分岐では、比較演算子の書き間違いや、条件を判定する順番によって、不具合が発生することがあります。

例えば、90点以上をA、70点以上をB、それ以外をCとするプログラムを考えてみましょう。

score = 95

if score >= 70:
    print("B")
elif score >= 90:
    print("A")
else:
    print("C")

実行結果:

B

95点なので本来はAと表示したいところですが、最初の70点以上という条件が成立するため、Bと表示されます。

正しいプログラムは次のとおりです。

score = 95

if score >= 90:
    print("A")
elif score >= 70:
    print("B")
else:
    print("C")

実行結果:

A

このように、プログラムがエラーなく動作していても、条件の順番を間違えると期待した結果にならない場合があります。

11. デバッグとテストの違い

デバッグと似た言葉に「テスト」があります。

テストは、プログラムが期待したとおりに動作するかを確認する作業です。一方、デバッグは、見つかった問題の原因を調べて修正する作業です。

例えば、合否判定プログラムでは、次のような値を入力して動作を確認できます。

点数期待する結果
59不合格
60合格
61合格
100合格

特に60点のように、条件の境目となる値をテストすることが重要です。

正しく判定されなかった場合は、デバッグによって原因を特定し、修正します。修正後には同じテストをもう一度実施して、問題が解決しているか確認しましょう。

12. デバッグでよくある間違い

初心者がデバッグするときは、次の点に注意しましょう。

  • エラーメッセージを読まずに修正する: 原因を確認しないまま変更すると、別の問題が発生する場合があります。
  • 一度に多くのコードを変更する: どの変更によって問題が解決したのか分かりにくくなります。
  • エラーが消えただけで終了する: 正しい実行結果になっているか、必ず確認しましょう。

また、AIを使ってエラーの原因を調べる場合も、提示された修正案をそのまま採用するのではなく、コードの意味を理解してから実行することが大切です。APIキーやパスワードなどの秘密情報をAIに入力しないように注意しましょう。

13. 練習問題:バグを見つけて修正しよう

実際のコードを使って、デバッグに挑戦してみましょう。

問題1:合計点の計算

合計点を求めたいのに、意図した結果になりません。原因は何でしょうか?

修正前のコード

scores = [60, 70, 80] total = 0 for score in scores: total = score print(total)解答を見る

問題2:条件分岐

80点以上を合格とするプログラムです。なぜ80点で不合格になるのでしょうか?

修正前のコード

score = 80 if score > 80: print(“合格”) else: print(“不合格”)解答を見る

問題3:リストの平均点

平均点を求めたいのに、リストの要素数が変わると計算結果が間違ってしまいます。修正してください。

修正前のコード

scores = [70, 80, 90, 100] average = sum(scores) / 3 print(average)解答を見る

14. まとめ

デバッグとは、プログラムの不具合を調査し、原因を特定して修正する作業です。

初心者のうちは、print() で変数の値や途中経過を確認する方法から始めると理解しやすいでしょう。

慣れてきたら、ブレークポイントやステップ実行を活用すると、より複雑なプログラムの問題も調べやすくなります。

大切なのは、エラーを消すことだけではありません。プログラムが期待した結果になることを確認し、修正によって別の問題が発生していないか調べることまでが重要です。

現役のフリーランスWebエンジニアです。仕事ではWebサイトや業務アプリをつくっています。
学生のころの自分に「これがあれば分かったのに」と思う教材を目指して、LIST LEARNを書いています。じゃんけんゲームなどの小さな作品を一緒につくりながら、情報Ⅰ・Pythonの基礎を身につけましょう。
取得資格: 応用情報技術者試験/第二種情報処理技術者

木下 | 現役Webエンジニアをフォローする
プログラミング基礎情報I