pdb (The Python Debugger) は、Pythonに標準で付属しているインタラクティブなソースコードデバッガです。プログラムの実行を任意の場所で一時停止させ、その時点での変数の状態を確認したり、コードを1行ずつ実行したりすることができます。
1. pdbの起動方法
pdbを起動するには、主に2つの方法があります。
方法A:ソースコードにブレークポイントを埋め込む (最も手軽)
デバッグしたい箇所のソースコードを直接編集し、実行を一時停止させる方法です。
- コードの挿入
デバッグしたい処理の直前に、以下のいずれか1行を記述します。# Python 3.7以降 (推奨) breakpoint()# それ以前のバージョン import pdb; pdb.set_trace() - プログラムの実行
通常通りにPythonプログラムを実行します。(例: Webサーバーを起動する、テストスクリプトを実行する、など) - デバッグ開始
プログラムの実行がbreakpoint()またはpdb.set_trace()の行に到達すると、実行が一時停止し、ターミナルに (Pdb) というプロンプトが表示されます。ここからデバッグコマンドを入力できます。
方法B:コマンドラインからスクリプトを起動する
ソースコードを編集せずに、スクリプト全体をデバッグモードで開始する方法です。
python -m pdb your_script.py
このコマンドで実行すると、スクリプトの最初の行で処理が一時停止し、(Pdb)プロンプトが表示されます。
2. 主要なPDBコマンド
(Pdb) プロンプトが表示されたら、以下のコマンドで対話的にデバッグを進めることができます。コマンドは省略形(エイリアス)でも入力可能です。
| コマンド | エイリアス | 説明 |
|---|---|---|
n (next) |
n |
次の行へ進む。 関数呼び出しがあってもその内部には入らない(関数をまとめて実行する)。 |
s (step) |
s |
ステップイン。 次の行へ進むが、それが関数呼び出しの場合、その関数の内部に入る。 |
c (continue) |
c |
処理を再開する。 次のブレークポイントまで、またはプログラムが終了するまで実行を続ける。 |
p <expression> |
p |
変数の値を表示する。 p my_variable のように使う。p self.name のような式も評価可能。 |
pp <expression> |
pp |
pと同様だが、pprintモジュールを使って、辞書やリストをより見やすく整形して表示する。 |
l (list) |
l |
現在行の前後11行のソースコードを表示する。 |
a (args) |
a |
現在の関数の引数一覧を表示する。 |
b <line_no> |
b |
ブレークポイントを追加する。 b 25 のように行番号を指定する。 |
cl <bp_number> |
cl |
ブレークポイントを削除する。 bで設定した際のブレークポイント番号を指定する。 |
r (return) |
r |
現在の関数が終了するまで実行を続ける。 関数の出口で停止したい場合に便利。 |
up / down
|
u / d
|
コールスタックを移動する。 関数呼び出しの階層を上がったり(up)、下がったり(down)できる。 |
whatis <expr> |
whatis |
変数や式の型を表示する。 |
q (quit) |
q |
デバッガを終了し、プログラムを強制終了する。 |
h (help) |
h |
ヘルプを表示する。 h <command>で特定のコマンドの詳細なヘルプも参照可能。 |
interact |
インタラクティブシェルを起動する。 現在のスコープで自由にPythonコードを実行できる。 |
3. エディタ/IDEとの連携 (デバッガー方式)
VSCodeなどの高機能なエディタやIDEでは、GUIを使ってより直感的にデバッグを行うことができます。
-
設定
(launch.json)
VSCodeの場合、.vscode/launch.json ファイルにデバッグ実行のための設定を記述します。これにより、デバッガの起動方法(引数や環境変数など)を定義できます。 -
デバッグ実行
- エディタの行番号の横をクリックして、視覚的にブレークポイントを設定します。
- デバッグ実行を開始すると(通常はF5キー)、プログラムが起動し、ブレークポイントで一時停止します。
- 変数の状態はサイドパネルの「変数」ビューに一覧表示され、ステップ実行などの操作はデバッグツールバーのボタンから行えます。
この方法は、内部的にはpdbと同様の仕組みを利用していることが多いですが、ターミナルでコマンドを打つ代わりに、GUIで快適にデバッグ作業を進めることができます。