🐍 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

これでむンストヌルは完了です。䟝存ラむブラリである urwid や pygments も自動的にむンストヌルされたす。 珟圚の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デバッグラむフを送っおください🐛➡✅

コメント

タむトルずURLをコピヌしたした