Python 入門コース / 第7章 発展(第47〜50回) / レッスン 49

デバッグの技術(pdb・ログ)

print デバッグの限界

print() を挟むのは有効な手ですが、消し忘れる・変数を増やすたびに書き足す・ループの途中で止められないという限界があります。「どこかで値がおかしくなる」タイプのバグでは、実行を止めて中を覗くほうが速いです。

breakpoint() で止めて調べる

調べたい行に breakpoint() と書いて実行すると、そこで一時停止して対話モード(pdb)に入ります。変数の中身をその場で確認でき、1 行ずつ進められます。

ターミナル(pdb セッション)

$ python3 buggy.py > /path/buggy.py(8)total() -> subtotal = price * quantity (Pdb) p price, quantity # 変数の中身を表示 ('1200', 3) # ← 文字列だった! (Pdb) n # 次の行へ(step over) (Pdb) s # 関数の中に入る(step in) (Pdb) l # 周辺のコードを表示 (Pdb) c # 続行(次の breakpoint まで) (Pdb) q # 終了 n=next / s=step / c=continue / p=print / l=list / q=quit

VS Code なら、行番号の左をクリックして赤い丸(ブレークポイント)を置き、F5 で実行すれば同じことが GUI でできます。変数一覧が常に表示されるので、慣れるまではこちらのほうが分かりやすいかもしれません。

logging で記録を残す

print() との違いは、重要度(レベル)で出し分けられること出力先をファイルに切り替えられること。開発中は DEBUG まで表示し、本番では WARNING 以上だけファイルに残す、といった運用ができます。

editor.py

バグを直す手順

再現させる(同じ手順で必ず起きるようにする)② 範囲を狭める(どこまでは正しいかを二分探索で探す)③ 原因を確かめる(推測で直さず、値を見る)④ 直して、再現手順でもう一度試す。この順番を守るだけで、デバッグの時間は大きく減ります。

✅ 理解度チェック

コードの途中で実行を止めて変数を調べるには?