【入門編】Pythonデバッグの基本!pdbの使い方を初心者向けに徹底解説 – デバッグ・コード品質・テストツール生産性向上バイブル

こんにちは!日々のPythonコーディング、楽しんでいますか?

コードを書いていると、「あれ?なんでここでこのエラーが出るんだ?」「変数の中身、思ってたんと違う……!」と頭を抱える瞬間、ありますよね。そんなとき、とりあえず `print()` 関数をあちこちに埋め込んで実行し、「あ、ここ通ってないわ」「うわ、データ型が違う!」なんてやっていませんか?

実は、それ、今日で卒業しませんか?

今回は、Pythonでのデバッグ作業を劇的に変える「pdb (Python DeBugger)」の世界へあなたをご案内します。これをマスターすれば、`print()` を消し忘れて本番環境にデプロイしてしまう恥ずかしいミスともお別れできますし、何よりコードの内部で何が起きているのかを「リアルタイム」に覗き見できるようになり、毎日のコーディングが驚くほど快適になりますよ。

それでは、さっそく扉を開けてみましょう!

—

1. なぜ `print()` ではなく `pdb` なのか?(ツールの本質)

初心者のうちは、コードの挙動を追うために `print(variable)` を多用しがちです。しかし、このアプローチには致命的な弱点があります。

  • 手間がかかる: 変数の中身を確認するたびにコードを書き換え、実行し、終わったらまたコードを消さなければならない。
  • 情報が静的すぎる: その瞬間のスナップショットしか見えず、「なぜその値になったのか」という文脈(コールスタック)が分からない。
  • 大規模化すると破綻する: ファイルが何十個にも分かれたプロジェクトで `print()` を追いかけるのは、暗闇で迷子になるようなものです。

そこで登場するのが `pdb` です。

`pdb` は、Pythonの標準ライブラリに最初から組み込まれているインタラクティブなデバッガです。外部の重いツールをインストールする必要は一切ありません。今日、あなたの手元にあるそのPython環境で、今すぐ動かすことができます。

`pdb` を使うと、プログラムの任意の場所で実行を「一時停止(ブレーク)」させ、その場で変数を書き換えたり、一行ずつコードを進めたり、関数の中に入り込んだりすることが自由自在になります。「コードのタイムマシン」を操るような感覚と言えば、その凄さが伝わるでしょうか?

—

2. インストール不要!まずは「ブレークポイント」を置いてみよう

`pdb` を使うために、何か特別なパッケージを `pip install` する必要はありません。Pythonさえあれば準備完了です。

Python 3.7以降であれば、組み込み関数である `breakpoint()` を1行書くだけで、その場所でデバッガが起動する仕組みになっています。

百聞は一見に如かず。実際に手を動かしてみましょう。
適当なディレクトリに `debug_sample.py` というファイルを作り、以下のコードを書き込んでみてください。

debug_sample.py

def calculate_discount(price, rate):
# ここでわざと複雑な計算をシミュレートします
discounted_price = price (1 – rate)
return discounted_price

def process_order(base_price):
tax_rate = 0.10
discount_rate = 0.20

# 【重要】ここでプログラムの実行を意図的に止めます!
breakpoint()

# 割引後の価格を計算
final_price = calculate_discount(base_price, discount_rate)

# 税込価格を計算
total_price = final_price (1 + tax_rate)

return total_price

if __name__ == “__main__”:
# テストとして10,000円の商品を処理してみます
result = process_order(10000)
print(f”最終請求額: {result}円”)

たったこれだけです。準備はできました。それでは、ターミナル(コマンドプロンプト)を開き、このスクリプトを実行してみましょう。

python debug_sample.py

実行すると、ターミナルの表示がピタッと止まり、以下のようなプロンプト(`Pdb`)が現れるはずです。

> /path/to/debug_sample.py(16)process_order()
-> final_price = calculate_discount(base_price, discount_rate)
(Pdb)

おめでとうございます!これであなたは `pdb` の世界へ足を踏み入れました。プログラムの時間が、あなたの手元で完全に凍結されています。

—

3. これだけ覚えればOK!必須の基本コマンド4選

`pdb` が起動すると、`(Pdb)` というプロンプト待ち受け状態になります。ここで特定のアルファベット1文字を入力することで、プログラムを自在にコントロールできます。

まずは、現場で9割のデバッグをこなせる「神4コマンド」を覚えましょう。

| コマンド | 名前 (意味) | 何をするものか? |
| :— | :— | :— |
| `n` | Next (次へ) | 関数に入らずに、今のブロックの次の行へ進む |
| `s` | Step (中へ) | 関数呼び出しがあった場合、その関数の内部へ飛び込む |
| `c` | Continue (続ける) | デバッグを終了し、次のブレークポイント(またはプログラム終了)まで一気に走らせる |
| `p` | Print (表示する) | 指定した変数の中身や式の結果を表示する(※変数名だけでもOK) |

—

4. ハンズオン:実際にコードを止めて変数を覗き見よう

先ほど止めた `debug_sample.py` のセッションに戻り、実際にこれらのコマンドを叩いてみましょう。

ステップ1: 変数の現在地を確認する (`p` コマンド)

今、`breakpoint()` の直前で止まっています。この時点で、変数 `base_price` や `discount_rate` に何が入っているか覗いてみましょう。

`(Pdb)` の後に以下のように入力します。

(Pdb) p base_price
10000
(Pdb) p discount_rate
0.2

おぉ、ちゃんと `10000` と `0.2` が入っていることが確認できましたね!
ちなみに、`p` は省略して変数名や式をそのまま打ち込んでも結果が表示されます。

(Pdb) base_price 2
20000

このように、デバッガのなかでその場で計算を試すことも可能です。これは非常に強力です。

ステップ2: 関数の内部へ潜り込む (`s` コマンド)

次の行(`final_price = calculate_discount(…)`)を実行します。
この時、`calculate_discount` という自作関数の中身がどうなっているか詳しく見たいため、`n`(次へ)ではなく、`s`(ステップイン)を使って関数の中に入ってみましょう。

(Pdb) s

すると、視点が `calculate_discount` 関数の内部に移動します。

–Call–
> /path/to/debug_sample.py(4)calculate_discount()
-> def calculate_discount(price, rate):
(Pdb)

もう一度 `n` を押すと、関数の計算行に移動します。

(Pdb) n
> /path/to/debug_sample.py(6)calculate_discount()
-> discounted_price = price (1 – rate)
(Pdb)

ここで、引数として渡された `price` と `rate` の値を確認してみましょう。

(Pdb) price
10000
(Pdb) rate
0.2

意図した通りの値がちゃんと渡ってきていることが肉眼で確認できます。

ステップ3: 次の行へ進む (`n` コマンド)

計算を実行して、結果変数 `discounted_price` に何が入るかを見てみましょう。`n` を押します。

(Pdb) n
> /path/to/debug_sample.py(7)calculate_discount()
-> return discounted_price
(Pdb) discounted_price
8000.0

10,000円の20%引きで、しっかりと `8000.0` が計算されていますね。バグはここにはなさそうです。

ステップ4: 一気に最後まで走らせる (`c` コマンド)

確認したいことは済んだので、残りのプログラムを通常通り最後まで実行させます。`c` を押してください。

(Pdb) c
最終請求額: 8800.0円

プログラムが無事に最後まで走りきり、ターミナルに結果が出力されてデバッグセッションが終了しました。

—

5. 先輩エンジニアからの実践知見(知っておくと得するTips)

基本操作はこれだけですが、実務で使う上で知っておくと「おっ、こいつデキるな」と思われる小技を少しだけ伝授します。

1. `l` (List) コマンドで周囲のコードを表示する
デバッグ中に「いま、全体のどこを読んでいるんだっけ?」と迷ったら、`l` と打つと、現在地を中心に前後11行のコードが表示されます。現在地には `->` マークがつくため、地図を見失いません。

2. 変数をその場で書き換える
`pdb` は見るだけではありません。例えば、`(Pdb) discount_rate = 0.5` のように代入を行うと、プログラムが動いている最中に変数の値を書き換えることができます。これにより、「もし割引率が50%だったら、この後の計算はどうなるか?」をわざわざコードを書き直さずにその場で検証できます。

3. 終了したくなったら `q` (Quit)
デバッグ途中で「もうこれ以上追う必要がないな」と思ったときは、`q` を入力してEnterを押せば、強制的にプログラムを中断して抜けることができます。

—

まとめ

いかがでしたでしょうか?

  • `pdb` はインストール不要で、Pythonさえあればいつでも使える最強の標準ツール。
  • `breakpoint()` を置くだけで、その場でプログラムの時間を止められる。
  • `p` (見る), `n` (次へ), `s` (中へ), `c` (続ける) の4つを覚えれば、毎日のデバッグ効率が何倍にも跳ね上がる。

`print()` デバッグはもう卒業です。次にバグに遭遇したときは、ぜひ臆することなく `breakpoint()` を1行差し込んでみてください。コードの内部をスルスルと泳げるようになったとき、プログラミングがこれまでよりも何倍も楽しく、愛おしく感じられるはずです。

あなたの開発ライフが、より快適でバグのないものになりますように。それではまた次の技術でお会いしましょう!

タイトルとURLをコピーしました