PuDB: Pythonコードを軽快にデバッグするCUIビジュアルデバッガ徹底解説

プログラミングにおいて、バグは避けて通れない存在です。特に複雑なアプリケーションを開発していると、予期せぬエラーや意図しない動作に遭遇することは日常茶飯事でしょう。そんな時、強力な味方となるのが「デバッガ」です。Pythonには標準でpdbというデバッガが付属していますが、より視覚的で使いやすいデバッガを求める声も少なくありません。

そこで登場するのが PuDB です! PuDBは、ターミナル(CUI)上で動作するフルスクリーンのビジュアルデバッガです。GUIベースのデバッガが持つような視覚的な分かりやすさと、キーボード中心の軽快な操作性を両立させているのが大きな特徴です。この記事では、PuDBの魅力、インストール方法、基本的な使い方から応用的なテクニックまで、詳しく解説していきます。

PuDBとは? なぜPuDBを選ぶのか?

PuDBは、Andreas Kloeckner氏によって開発されたオープンソースのPythonデバッガです。その名前は「Python Urwid Debugger」の略で、コンソールUIライブラリであるurwidと、シンタックスハイライトライブラリpygmentsを利用して構築されています。

PuDBが多くの開発者に選ばれる理由は、以下のような特徴にあります。

  • 視覚的なインターフェース: ソースコード、スタックトレース、変数、ブレークポイントが1つの画面にまとめて表示され、リアルタイムで更新されます。これにより、プログラムの状態を一目で把握できます。
  • キーボードフレンドリー: ほとんどの操作が単一キーのショートカットで実行できます。Vimライクなキーバインドもサポートしており、キーボード操作に慣れている開発者にとっては非常に効率的です。
  • 軽量・高速: CUIベースであるため、GUIデバッガと比較して軽量で、動作も軽快です。リモートサーバーやリソースが限られた環境でのデバッグにも適しています。
  • 高機能: 条件付きブレークポイント、変数の詳細表示(展開/折りたたみ)、ウォッチ式、ポストモーテム(事後)デバッグ、別ターミナルからの制御、IPython連携など、デバッグに必要な機能が一通り揃っています。
  • カスタマイズ性: テーマ(ダークテーマ含む)の変更や、表示項目のカスタマイズが可能です。自分好みのデバッグ環境を構築できます。

標準のpdbはシンプルですが、コマンドを覚える必要があり、プログラムの状態を把握するには都度コマンドを入力する必要があります。一方、IDEに統合されたデバッガは高機能ですが、IDE自体が重かったり、特定の環境でしか使えなかったりする場合があります。PuDBは、これらのツールの良いところを取り入れ、ターミナル上で完結する効率的なデバッグ体験を提供します。

インストール

PuDBのインストールは非常に簡単です。pipコマンドを使用します。

pip install pudb

もしPython 3環境でpipがPython 2を指している場合は、pip3を使用してください。

pip3 install pudb

これでインストールは完了です。依存ライブラリである urwidpygments も自動的にインストールされます。 現在のPuDBはPython 3.8以上が必要です(2024.1.3時点)。古いPythonバージョン(Python 2.7や3.6など)を使用している場合は、旧バージョンのPuDB(例えば pudb==2019.2)をインストールする必要があります。

基本的な使い方

PuDBを起動するには、主に2つの方法があります。

1. スクリプト全体をPuDBで実行する

デバッグしたいPythonスクリプト(例: `my_script.py`)を、`python -m pudb` コマンドで実行します。

python -m pudb my_script.py [引数...]

または、PuDBのバージョンによっては(特に古いバージョン)、以下のコマンド形式が使われていました。

python -m pudb.run my_script.py [引数...]

あるいは、`pudb` コマンド(Python 3環境では `pudb3` となることもあります)にスクリプトファイルを渡す方法もあります。

pudb my_script.py [引数...]

これにより、スクリプトの最初の実行行でPuDBが起動し、デバッグセッションが開始されます。

Tips: 複数のPythonバージョンがインストールされている環境では、意図したPythonインタプリタでPuDBが起動しているか確認しましょう。例えば、特定のPythonバージョン(例: `/usr/bin/python3.9`)で実行したい場合は、以下のように明示的に指定します。

/usr/bin/python3.9 -m pudb my_script.py

2. コード内にブレークポイントを挿入する

デバッグを開始したい特定の箇所に、以下のコードを挿入します。

import pudb; pudb.set_trace()

あるいは、Python 3.7以降を使用している場合は、よりシンプルに組み込みの `breakpoint()` 関数を使用できます。PuDBがインストールされていれば、`breakpoint()` は自動的にPuDBを起動します(環境変数 `PYTHONBREAKPOINT` が設定されていない場合)。

breakpoint() # Python 3.7+

このコードが埋め込まれたスクリプトを通常通り実行すると、`set_trace()` または `breakpoint()` が呼び出された行で実行が一時停止し、PuDBの画面が表示されます。

注意: `set_trace()` や `breakpoint()` をコードに残したままコミットしたり、本番環境にデプロイしたりしないように注意しましょう。デバッグが完了したら必ず削除するか、条件付きで実行されるようにしてください。

PuDBの画面構成

PuDBを起動すると、ターミナルが以下のような領域に分割された画面に切り替わります。

  • 左側 (Source Code): 現在実行中のソースコードが表示されます。シンタックスハイライトが適用され、実行行が強調表示されます。
  • 右側上部 (Variables): 現在のスコープ(ローカル変数やグローバル変数)にある変数のリストとその値が表示されます。値はリアルタイムで更新されます。
  • 右側中部 (Stack): 現在のコールスタック(関数の呼び出し履歴)が表示されます。
  • 右側下部 (Breakpoints): 設定されているブレークポイントの一覧が表示されます。

画面下部には、現在の状態やヒントが表示されることもあります。

主要なキー操作と機能

PuDBの操作はキーボードで行います。以下に主要なキーとその機能をまとめます。

キー説明カテゴリ
n次の行へステップオーバー実行 (関数の中には入らない)実行制御
s次の行へステップイン実行 (関数の中に入る)実行制御
c次のブレークポイントまたはプログラム終了まで実行を継続実行制御
r現在の関数が終了するまで実行 (Return)実行制御
tカーソルがある行まで実行 (Run To Cursor)実行制御
bカーソルがある行にブレークポイントを設定/解除ブレークポイント
B (Shift + b)ブレークポイントウィンドウにフォーカスを移動ウィンドウ操作
V (Shift + v)変数ウィンドウにフォーカスを移動ウィンドウ操作
S (Shift + s)スタックウィンドウにフォーカスを移動ウィンドウ操作
C (Shift + c)ソースコードウィンドウにフォーカスを移動ウィンドウ操作
Ctrl + xソースコードウィンドウとコマンドラインを切り替えウィンドウ操作
?ヘルプ画面を表示 (キーバインド一覧)ヘルプ
qデバッガを終了 (Quit) またはリスタート終了
oプログラムの標準出力画面を表示/非表示表示
mモジュールブラウザを開く (ロード済みモジュールの表示、新規ロード、リロード)ナビゲーション
L指定した行番号へ移動ナビゲーション
/ソースコード内を前方検索検索
? (Shift + /)ソースコード内を後方検索検索
.次の検索結果へ移動 (前方)検索
,前の検索結果へ移動 (後方)検索
k / カーソルを上に移動ナビゲーション
j / カーソルを下に移動ナビゲーション
h / カーソルを左に移動 / 変数やスタックを折りたたむナビゲーション
l / カーソルを右に移動 / 変数やスタックを展開するナビゲーション
g / Homeファイルの先頭行へ移動ナビゲーション
G (Shift + g) / Endファイルの最終行へ移動ナビゲーション
PageUp1ページ上にスクロールナビゲーション
PageDown1ページ下にスクロールナビゲーション
!Pythonシェル (REPL) を起動。現在のコンテキストでコードを実行できる。実行
Ctrl + p設定画面を開く (テーマ、表示オプションなど)設定

これらのキー操作に慣れることで、マウスを使わずに高速なデバッグが可能になります。特に n, s, c, b はデバッグの基本となる操作なので、最初に覚えると良いでしょう。

高度な機能

PuDBは基本的なステップ実行やブレークポイント設定以外にも、多くの便利な機能を提供しています。

条件付きブレークポイント

特定の条件が満たされたときだけ実行を停止させたい場合があります。例えば、「ループ変数 `i` が 5 になったときだけ止めたい」といったケースです。

  1. 目的の行にカーソルを合わせて b を押し、通常のブレークポイントを設定します。
  2. B (Shift + b) を押してブレークポイントウィンドウにフォーカスを移動します。
  3. 設定したいブレークポイントを選択し、Enter を押します。
  4. ブレークポイント編集画面が表示されるので、「Condition」の項目に移動し、Enter を押します。
  5. 条件式(例: i == 5)を入力し、Enter を押します。
  6. OK を選択して Enter を押します。

これで、指定した条件が真 (True) になったときのみ、そのブレークポイントで実行が停止します。

変数の詳細表示とウォッチ式

変数ウィンドウ (V でフォーカス) では、リスト、辞書、オブジェクトなどの複合的な変数の内容を展開して確認できます。変数を選択して l (または ) を押すと展開、h (または ) を押すと折りたたまれます。Enter キーを押すと、変数の表現形式(repr, strなど)を変更するオプションが表示されます。

また、特定の式の値を常に監視したい場合は、「ウォッチ式 (Watch expressions)」機能が便利です。コマンドライン (Ctrl + x で切り替え) で `watch <式>` と入力するか、設定画面 (Ctrl + p) から追加できます。ウォッチ式は変数ウィンドウの上部に表示され、ステップ実行ごとに値が更新されます。

スタックトレースの確認

スタックウィンドウ (S でフォーカス) では、現在の関数呼び出し履歴を確認できます。上下キーでスタックフレームを選択すると、ソースコードウィンドウと変数ウィンドウの内容が、選択したフレームのコンテキストに切り替わります。これにより、呼び出し元の関数の状態を簡単に確認できます。

ポストモーテムデバッグ

プログラムが例外(エラー)でクラッシュした場合、その原因を調査するのに役立つのがポストモーテムデバッグです。スクリプトを `python -m pudb script.py` で実行していた場合、キャッチされなかった例外が発生すると自動的にPuDBが起動し、例外が発生した時点の状態からデバッグを開始できます。

あるいは、例外が発生した後に手動でポストモーテムデバッグを開始することもできます。

import pudb
import sys
try: # ... 例外が発生する可能性のあるコード ... result = 1 / 0
except Exception: # 例外が発生したら、その情報を元にPuDBを起動 pudb.post_mortem(sys.exc_info()[2])

これにより、エラー発生時の変数の値やコールスタックを確認し、原因究明の手がかりを得ることができます。例外発生時に e を押すと、トレースバック情報を表示できます。

Pythonシェル (REPL) の利用

デバッグ中に ! を押すと、現在のスコープ(変数が定義されている状態)でPythonの対話シェルが起動します。ここで変数の値を変更したり、任意のPythonコードを実行して動作を確認したりできます。IPythonがインストールされていれば、より高機能なIPythonシェルを使用することも可能です(設定が必要な場合があります)。シェルを終了するには `exit()` または `Ctrl+d` を入力します。

設定のカスタマイズ

PuDBの外観や動作は、設定画面からカスタマイズできます。Ctrl + p を押すと設定画面が開きます。

主な設定項目:

  • Theme: 画面の配色テーマを選択します。`dark` や `light` を含むいくつかのプリセットテーマが用意されています。`classic` は伝統的な表示です。
  • Line Numbers: ソースコードに行番号を表示するかどうか。
  • Show variable types: 変数ウィンドウで型情報を表示するかどうか。
  • Wrap lines: 長い行を折り返して表示するかどうか。
  • Prompt on quit: 終了 (q) 時に確認プロンプトを表示するかどうか。
  • Shell: `!` で起動するシェルを指定します(`python` または `ipython` など)。

設定項目は上下キーで移動し、Enter やスペースキーで値を変更します。変更後、右矢印キーで OK に移動し Enter を押すと設定が保存されます。設定内容は通常 `~/.config/pudb/pudb.cfg` に保存されます。

PuDB vs pdb vs IDEデバッガ

ここで、PuDBを他のデバッグツールと比較してみましょう。

特徴PuDBpdb (標準)IDEデバッガ (VSCode, PyCharmなど)
インターフェースCUI (ビジュアル)CUI (コマンドライン)GUI
操作性キーボード中心 (高速)コマンド入力マウス & キーボード
視覚性高い (複数ペイン表示)低い (コマンドで都度確認)非常に高い
軽量性高い非常に高い低い (IDE依存)
環境依存低い (ターミナルがあればOK)非常に低い高い (IDEが必要)
機能豊富基本的非常に豊富 (プロファイリング等連携)
学習コスト中程度 (キー操作)低〜中程度 (コマンド)低〜中程度 (GUI操作)

PuDBの強み: 軽量でありながら視覚的なデバッグが可能で、キーボード操作による効率性が高い点です。リモートサーバーやDockerコンテナ内など、GUIが使えない環境でのデバッグに特に威力を発揮します。

pdbの強み: 標準ライブラリなのでインストール不要で、どんな環境でも確実に使えます。非常にシンプルです。

IDEデバッガの強み: GUIによる直感的な操作と、エディタや他の開発ツールとのシームレスな連携です。非常に高機能ですが、IDEのセットアップが必要です。

どのツールを選ぶかは、開発環境、プロジェクトの性質、個人の好みによって異なります。PuDBは、ターミナルでの作業を好み、効率性を重視する開発者にとって、非常に魅力的な選択肢となるでしょう。

まとめ

PuDBは、Python開発者にとって強力なデバッグツールです。CUIベースでありながら、シンタックスハイライトされたソースコード、変数、スタック、ブレークポイントをリアルタイムで表示する視覚的なインターフェースを提供し、デバッグ作業の効率を大幅に向上させます。キーボードショートカットによる軽快な操作性も魅力です。

標準の`pdb`では物足りない、しかしIDEのデバッガは重すぎる、あるいはGUIが使えない環境でデバッグしたい、といった場合に、PuDBは最適なソリューションとなり得ます。

この記事を参考に、ぜひPuDBを導入して、より快適なPythonデバッグライフを送ってください!