Pythonデバッグ入門:プログラムの不具合を見つけ、解決するための第一歩
![]()
【Yuki】
こんにちは、Hirokiくん。今日はPythonのプログラミングにおいて、とても大切だけれど少し難しく感じてしまうかもしれない……「デバッグ」について、一緒にお話ししていこうと思います。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!デバッグ、名前は聞いたことがあります。でも、いざ自分の書いたコードが動かないと、どこが間違っているのか全然わからなくて……。いつもパニックになっちゃうんです。
![]()
【Yuki】
ふふ、大丈夫ですよ。ベテランのエンジニアでも、最初から完璧なコードを書ける人はほとんどいません。みんな、デバッグを繰り返して完成させていくんです。プログラムが思い通りに動かないとき、その原因を探して修正する作業のこと……それがデバッグです。今日はその基礎から、具体的なテクニックまでゆっくり解説していきますね。
デバッグとは何かを知る
![]()
【Hiroki】
デバッグって、直訳すると「虫(バグ)を取る」という意味ですよね?
![]()
【Yuki】
ええ、その通りです。昔、本物の蛾がコンピュータに挟まって故障したことが語源だと言われています。現代では、プログラムに含まれる「論理的な間違い」や「記述のミス」をバグと呼びます。
![]()
【Hiroki】
バグがあると、プログラムが途中で止まったり、計算結果がおかしくなったりするんですね。
![]()
【Yuki】
そうですね。デバッグの目的は、大きく分けて二つあると思います。一つは、プログラムを「正しく動くようにすること」。そしてもう一つは、プログラムが「なぜそう動いているのかを深く理解すること」です。後者ができるようになると、自然とプログラミングの腕も上がっていく……かもしれません。
![]()
【Hiroki】
なるほど。ただ直すだけじゃなくて、理解することが大事なんですね。
まずはエラーメッセージを読んでみましょう
![]()
【Yuki】
プログラムが止まってしまったとき、画面に赤い文字などでたくさんのメッセージが出てきますよね。あれを「トレースバック(Traceback)」と言います。Hirokiくんは、あれをちゃんと読んでいますか……?
![]()
【Hiroki】
うっ……。英語だし、たくさん出てくるので、いつも見ないで閉じてしまっていました。
![]()
【Yuki】
その気持ち、よくわかります。でも、トレースバックは犯人を探すための「地図」のようなものなんです。まずは代表的なエラーをいくつか見てみましょうか。
# SyntaxError: 文法間違い
print("Hello"
![]()
【Yuki】
例えば、このようにカッコを閉じ忘れると SyntaxError が出ます。「文法が間違っていますよ」という合図ですね。
![]()
【Hiroki】
これは見たことがあります!「ここが変だよ」って教えてくれているんですね。
![]()
【Yuki】
そうです。他にも、定義していない変数を使おうとしたときの NameError や、数字を 0 で割ろうとしたときの ZeroDivisionError などがあります。トレースバックの一番下の行を見ると、何のエラーかが書いてあります。そして、その数行上を見ると「何行目でエラーが起きたか」が書いてあるんです。
![]()
【Hiroki】
一番下を見ればいいんですね。それなら僕にもできそうです!
![]()
【Yuki】
まずは、エラーメッセージを怖がらずに、「どこで」「どんな種類のエラーが」起きているのかを確認すること。これがデバッグの第一歩だと思います。
もっとも身近な「printデバッグ」
![]()
【Yuki】
エラーメッセージは出ないけれど、計算結果が期待通りにならない……。そんなときに便利なのが、「printデバッグ」と呼ばれる手法です。
![]()
【Hiroki】
print() 関数を使うんですか?
![]()
【Yuki】
はい。プログラムの途中に print() を挟んで、その時の変数の値を確認する方法です。簡単な例を書いてみますね。
def calculate_total(price, tax_rate):
print(f"DEBUG: price={price}, tax_rate={tax_rate}") # 値を確認
total = price * tax_rate
print(f"DEBUG: total={total}") # 途中の計算結果を確認
return total
result = calculate_total(1000, 0.1)
print(f"結果: {result}")
![]()
【Hiroki】
あ、これなら僕もやったことがあります。でも、これだと100円になっちゃいますね。1000円の商品の10%税込みなら、1100円のはずなのに……。
![]()
【Yuki】
そうですね。この場合、print() の結果を見ることで、「あ、tax_rate を掛けるだけじゃなくて、元の金額に足さないといけないんだ」とか「tax_rate を 1.1 にしなきゃいけないんだ」ということに気づけるはずです。
![]()
【Hiroki】
なるほど。変数が自分の想像通りの値になっているか、一つずつ確かめていくんですね。
![]()
【Yuki】
はい。ただ、print() を使いすぎると、後で消すのが大変になったり、画面がログでいっぱいになってしまったりすることもあります。小規模な確認には良いですが、少し複雑なプログラムには、別の方法が向いているかもしれません。
Python標準のデバッガ「pdb」を使ってみる
![]()
【Hiroki】
print() 以外の方法……。何か特別なツールを使うんですか?
![]()
【Yuki】
Pythonには標準で pdb (Python Debugger) というツールが備わっています。これを使うと、プログラムを実行中に好きな場所で「一時停止」させて、その時の状況を詳しく調べることができるんです。
![]()
【Hiroki】
一時停止! 映画を止めて中身を確認するみたいですね。
![]()
【Yuki】
素敵な例えですね。使い方はとても簡単で、停止させたい場所に breakpoint() と書くだけです。Python 3.7 以降であれば、この一行でデバッガが起動します。
def process_data(data):
result = []
for item in data:
# ここでプログラムを一時停止させる
breakpoint()
processed = item.upper()
result.append(processed)
return result
my_list = ["apple", "banana", "cherry"]
process_data(my_list)
![]()
【Hiroki】
これを実行すると、どうなるんですか?
![]()
【Yuki】
プログラムが breakpoint() のところで止まり、入力待ちの状態になります。そこでコマンドを打ち込むことで、いろいろな操作ができます。
n(next): 次の一行を実行する。p 変数名(print): その変数の値を表示する。c(continue): 次の停止ポイントまで実行を再開する。q(quit): デバッグを終了する。
![]()
【Hiroki】
へぇー! 1行ずつ動かしながら、その時の変数の値をチェックできるんですね。
![]()
【Yuki】
そうなんです。これを使えば、ループの中で何回目の処理の時に値がおかしくなるのか……といったことが、手に取るようにわかるようになります。少し操作に慣れが必要ですが、覚えておくととても心強い味方になってくれる……と思います。
IDE(VS Codeなど)を活用した高度なデバッグ
![]()
【Hiroki】
さっきのコマンドを覚えるのは、ちょっと大変そうかも……。もっと楽にできる方法はありませんか?
![]()
【Yuki】
そう言うと思っていました。実は、Visual Studio Code (VS Code) などのエディタを使っているなら、もっと視覚的にデバッグができるんですよ。
![]()
【Hiroki】
VS Codeなら僕も使っています!
![]()
【Yuki】
それなら、行番号の左側をクリックしてみてください。赤い丸印がつきますよね。それが「ブレークポイント」です。
![]()
【Hiroki】
あ、つきました!
![]()
【Yuki】
その状態で「デバッグ実行(F5キー)」をすると、その赤い丸の行でプログラムが止まります。画面の左側には、その時存在している「変数の一覧」がずらっと表示されますし、マウスをコード上の変数に重ねるだけで、今の値が表示されたりもします。
![]()
【Hiroki】
わあ、すごい! print() をたくさん書かなくても、全部の変数が一度に見えるんですね。
![]()
【Yuki】
そうなんです。ボタン一つで「一行進む」「関数の中に入る」「関数から抜ける」といった操作もできます。視覚的に今の実行場所がハイライトされるので、プログラムの流れがとても把握しやすくなるはずです。
![]()
【Hiroki】
これなら、僕でもどこで間違えたか見つけられそうな気がします。
デバッグをスムーズに進めるための考え方
![]()
【Yuki】
テクニックも大切ですが、最後にデバッグに取り組む時の「心構え」について少しだけお話しさせてください。
![]()
【Hiroki】
心構え、ですか?
![]()
【Yuki】
はい。まず、「仮説を立てること」が大切です。「おそらくこの処理のあたりで、変数の値がこうなっているから、エラーが起きているのではないか?」と予想してから、デバッガで確認するんです。
![]()
【Hiroki】
いきなり調べ始めるんじゃなくて、まずは考えてみるんですね。
![]()
【Yuki】
ええ。そうしないと、どこを見ていいかわからなくなってしまいますから。次に、「問題を小さく切り分けること」。もし100行のコードがあるなら、どの10行に問題があるのかを絞り込んでいきます。正常に動く部分を削ぎ落としていけば、最後にバグが隠れている場所が見つかるはずです。
![]()
【Hiroki】
消去法みたいな感じですね。
![]()
【Yuki】
その通りです。そして一番大切なのは、「エラーを自分の失敗だと思わないこと」です。エラーは単なる現象に過ぎません。むしろ、バグを見つけて修正するたびに、あなたは「プログラムがどう動くべきか」という深い知識を手に入れていることになります。
![]()
【Hiroki】
エラーが出るたびに落ち込んでいたけど、少し前向きになれそうです。
![]()
【Yuki】
それは良かったです。……あ、最後にいくつか参考にできそうなサイトを紹介しておきますね。
![]()
【Hiroki】
ありがとうございます!さっそく、昨日動かなかったコードをVS Codeでデバッグしてみます。
![]()
【Yuki】
ええ、応援しています。もしまた困ったら、いつでも聞いてくださいね。ゆっくり、一歩ずつ進んでいきましょう……。
デバッグのまとめ
![]()
【Hiroki】
今日の話をまとめると、こんな感じでしょうか。
- エラーメッセージ(トレースバック)をちゃんと読む。
- 簡単な確認なら
print()を使ってみる。 - 複雑な問題なら
breakpoint()や VS Code のデバッガを活用する。 - 仮説を立てて、問題を小さく切り分けて考える。
![]()
【Yuki】
完璧です、Hirokiくん。デバッグが得意になると、プログラミングがもっと自由で、楽しいものに変わるはずですよ。
![]()
【Hiroki】
はい!頑張ります!
![]()
【Yuki】
……ふふ、その意気です。夜遅くまで作業するときは、ちゃんと休憩も挟んでくださいね。それじゃあ、今日のレッスンはここまで。お疲れ様でした。
![]()
【Hiroki】
ありがとうございました、Yukiさん!
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。


