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
バグを直す手順
① 再現させる(同じ手順で必ず起きるようにする)② 範囲を狭める(どこまでは正しいかを二分探索で探す)③ 原因を確かめる(推測で直さず、値を見る)④ 直して、再現手順でもう一度試す。この順番を守るだけで、デバッグの時間は大きく減ります。
✅ 理解度チェック
コードの途中で実行を止めて変数を調べるには?