SIGMA-SE Tech Blog

SIGMA-SE Tech Blog


当サイトは、過去に運営していた別ドメイン(unisia-se.com)から sigma-se.com へ移行した技術ブログです。
旧サイトの記事をもとに、内容の精査・加筆・最新化を行い再構成しています。
正確で実用的な情報提供を目的としています。

Python - 標準デバッガー(Pdb):基本操作とステップ実行

概要

Python標準デバッガーであるPdbの使い方を、ブレークポイント、ステップ実行、変数確認を中心に整理する。

Pdbを使うと、print文だけでは追いにくい処理の流れを、停止位置ごとに確認できる。関数の中へ入るのか、次の行へ進むのか、変数の値をどう見るのかを押さえると、原因調査がしやすくなる。

この記事で扱うこと

  • pdb.set_trace()で処理を止める方法。
  • ステップ実行で処理の流れを追う方法。
  • pコマンドで変数の値を確認する方法。
  • step、next、return、continueの違い。
  • listやargsで停止位置の情報を見る方法。

作業前に確認すること

項目 確認内容
サンプルコード 小さな関数で停止位置と変数の変化を確認する。
ブレークポイント pdb.set_trace()を置いた直後から確認を始める。
ステップ実行 関数内へ入るか、次行へ進むかを使い分ける。
変数確認 p 変数名で現在値を表示する。
終了操作 qでデバッガーを抜ける。

作業時の注意点

作業時の注意点 整理するポイント
stepとnext stepは関数の中へ入り、nextは関数呼び出しを一行として進める。
停止位置 set_trace()を書いた行そのものではなく、その次の実行行で止まる。
変数のスコープ 現在停止している位置から見える変数だけを確認できる。
消し忘れ pdb.set_trace()を本番コードへ残さない。

実施内容

Pdbの使用例

  • 説明用のサンプルプログラムを作成
    説明用に下記debug_example.pyを作成する。

    1 def add(a, b, c):
    2     return a + b + c
    3 
    4 step = 0
    5
    6 step = add(1, 2, 3)
    7 step = add(4, 5, 6)
    
  • 4行目にimport pdb; pdb.set_trace()を挿入
    この状態で4行目の直後となる6行目のstep = 0がブレイクポイントとなる。

    1 def add(a, b, c):
    2     return a + b + c
    3
    4 import pdb; pdb.set_trace()
    5
    6 step = 0
    7
    8 step = add(1, 2, 3)
    9 step = add(4, 5, 6)
    
  • debug_example.pyを実行
    6行目のstep = 0で止まり、入力待ちを表す(Pdb)が表示される。

    $ python /var/www/vops/ops/macuos/debug_example.py
     > /var/www/vops/ops/macuos/debug_example.py(6)()
     -> step = 0
     (Pdb)
    
  • ステップ実行でそれぞれ変数の値を確認
    以下、6行目~9行目までステップ実行し、最後に変数stepの値を確認する。
    ステップ実行は、s、変数の確認は、p <変数名>を入力する。
    ステップ実行毎に>でどの行であるか、->で実行コードが確認できる。

    $ python /var/www/vops/ops/macuos/debug_example.py
     > /var/www/vops/ops/macuos/debug_example.py(6)()
     -> step = 0
     (Pdb) s    # ステップ実行のsを入力
     > /var/www/vops/ops/macuos/debug_example.py(8)()
     -> step = add(1, 2, 3)
     (Pdb) s    # ステップ実行のsを入力
     --Call--
     > /var/www/vops/ops/macuos/debug_example.py(1)add()
     -> def add(a, b, c):
     (Pdb) s    # ステップ実行のsを入力
     > /var/www/vops/ops/macuos/debug_example.py(2)add()
     -> return a + b + c
     (Pdb) s    # ステップ実行のsを入力
     --Return--
     > /var/www/vops/ops/macuos/debug_example.py(2)add()->6
     -> return a + b + c
     (Pdb) s    # ステップ実行のsを入力
     > /var/www/vops/ops/macuos/debug_example.py(9)()
     -> step = add(4, 5, 6)
     (Pdb) s    # ステップ実行のsを入力
     (Pdb) p step    # 変数「step」の確認
     15
    

Pdbの基本操作方法

以下、よく使用するPdbコマンド。

  • [s] or [step]
    ステップイン : 行単位でステップ実行する。

  • [n] or [next]
    ステップオーバー : 行単位で実行する。 ※ 関数の中は停止しない。

  • [r] or [return]
    ステップアウト : 関数単位で実行する。 ※ 実行中の関数が返るまで実行する。

  • [c] or [continue]
    次回のブレークポイントまで停止せず実行する。

  • [l] or [list]
    現在停止行の前後のソースを表示する。

  • [a] or [largs]
    現在停止している関数の引数を表示する。

  • [p <変数名>]
    変数の値を表示する。

  • [q] or [quit]
    Pdbデバッガーを終了する。

実務とのつながり

  • 不具合調査
    条件分岐や関数呼び出しの流れを確認できる。
  • 値の追跡
    途中の変数が想定通りかを確認できる。
  • 学習用途
    Pythonコードがどの順番で実行されるかを理解しやすい。

まとめ

  • PdbはPython標準のデバッガーで、処理を止めながら変数や流れを確認できる。
  • step、next、return、continueの違いを押さえると、調査しやすくなる。
  • pdb.set_trace()は便利だが、確認後はコードから外す。


Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp