12.8 pdbによるデバッグ
IDE(統合開発環境)の多くは便利なグラフィカルなデバッガを備えていますが、環境によってはターミナル上でデバッグを行わなければならないこともあります。Pythonには標準ライブラリとしてコマンドラインベースの強力なデバッガ pdb が用意されています。
pdbの起動
Section titled “pdbの起動”デバッガを起動するには、スクリプトを実行する際に -m pdb オプションを追加します。
# capitals.py というスクリプトに引数 cities2.csv を渡してデバッグ実行する例$ python -m pdb capitals.py cities2.csv実行すると、プログラムは最初の行で一時停止し、(Pdb) というプロンプトが表示されてコマンドの入力待ちになります。
> /Users/.../capitals.py(1)<module>()-> def process_cities(filename):(Pdb)ステップ実行のコマンド (c, s, n)
Section titled “ステップ実行のコマンド (c, s, n)”プログラムを少しずつ動かしながら、どこで問題が起きているかを特定していくためのコマンドです。
c(continue / 継続): プログラムを再開し、エラーが起きるか、正常終了するか、次のブレークポイントに当たるまで実行を一気に進めます。s(step / ステップ): プログラムを1行だけ実行します。関数呼び出しの行では、関数の内部に入り込んで1行ずつ実行を続けます(標準ライブラリの内部にも入っていきます)。n(next / ネクスト): プログラムを1行だけ実行します。関数呼び出しの行では、関数の中には入らずに関数全体を実行し、次の行で停止します(ステップオーバー)。
コードの確認とブレークポイント (l, b)
Section titled “コードの確認とブレークポイント (l, b)”l(list / リスト): 現在停止している行の前後数行のソースコードを表示します。現在実行しようとしている行には->が付きます。l 1のように行番号を指定して表示開始位置を決めることもできます。
(Pdb) l 1 def process_cities(filename): 2 with open(filename, 'rt') as file: 3 -> for line in file: 4 line = line.strip()b(break / ブレークポイント): 指定した行でプログラムの実行を一時停止させる目印(ブレークポイント)をセットします。b 6: 6行目にブレークポイントをセットします。セット後にcを実行すると、6行目に到達した時点で停止します。- 行番号を指定せずに
bだけを入力すると、現在セットされているブレークポイントの一覧を表示します。
(Pdb) b 6Breakpoint 1 at /Users/.../capitals.py:6
(Pdb) bNum Type Disp Enb Where1 breakpoint keep yes at /Users/.../capitals.py:6変数の確認 (p)
Section titled “変数の確認 (p)”p(print / プリント): 指定した変数の現在の値を表示します。意図しない値が入っていないかを確認する際に非常に役立ちます。
# 現在の line 変数の中身を確認する(Pdb) p line'ecuador, quito'デバッガを使いこなせるようになると、コードのどこで期待と異なる動作が起きているのかを論理的に追い詰めることができるようになります。しかし、一番大切なのは「テストを多くし、デバッグの必要性を減らす」ことであることを忘れないでください。