AWESOME LINUX WORLD

Linux 成分多めの技術系ブログ

Python の CUI デバッガ「PuDB」の紹介

はじめに

今回は Python デバッガである「PuDB」のご紹介です。

PuDB とは、軽量さと機能性を兼ね備えた CUI ベースの Python デバッガです。次のような特徴を持つ(主観)ことから、やや重たい環境や、そもそも GUI(IDE) が使えないような環境でサクッとデバッグしたい時に重宝しています(お気に入りです)。

  • 軽量
  • CUI ベースのデバッガ
  • GDB ライクな操作性
  • 変数の自動監視が可能など多機能
  • CUI ベースでありながら、グラフィカルで見栄えが良い

インストール

$ pip install pudb

基本的な使い方

まずは起動

$ pudb <スクリプト名>.py

or

$ python -m pudb <スクリプト名>.py

起動したら、次の表にあるキーを入力し操作(デバッグ)を行います1

挙動 入力キー
ブレイクポイント切り替え b
条件付きブレイクポイント設定 後述の 3.3 を参照
ステップオーバー n
ステップイン s
コンティニュー c
文字列検索 /<文字列>
検索結果(前方/後方)検索 .(ドット)、,(カンマ)
カーソル移動(上/下、 左/右) k/j、 h/l
カーソル移動(最初の行/最終行) g/G
カーソル(行指定) L[Enter] ---> Go to Line に行指定
ソースコード表示枠フォーカス C or 十字キー(↑↓←→)
変数表示枠フォーカス V or 十字キー(↑↓←→)
スタック表示枠フォーカス S or 十字キー(↑↓←→)
ブレイクポイント表示枠フォーカス B or 十字キー(↑↓←→)
終了 q[Enter] ---> Quit[Enter]
ヘルプ ?

実際の操作画面

文字だけだと伝わりにくいと思いますので、2つほど(3.2, 3.3)実際の操作画面を載せておきます。

なお、以降の操作画面(デバッグ)では次のソースを使用します。

# ファイル名: pudb_demo.py

 def main():
    cnt = 0
    while cnt < 10:
        cnt+=1
        print(cnt)
 
 if __name__ == '__main__':
    main()

デバッガ起動後の画面

$ pudb pudb_demo.py

などで起動すると、次のような画面が表示されます。左側にソースコード表示枠、右側が3つに分割されており、右上から、変数表示枠(Variables:)、スタック表示枠(Stack:)、ブレイクポイント表示枠(Breakpoints:)という構成になっています。変数表示枠から、変数を確認できます。(変数の定義を通ると、自動で変数表示枠に追加されます)。

f:id:Kernel_OGSun:20200329201802p:plain

ちなみに、次の黒画面のように行数の表示有無や、テーマカラーなどを変更することができます。設定を変更するには、Ctrl + p から行います。

f:id:Kernel_OGSun:20200329201907p:plain

文字列検索

次の例では、デバッガのエディタ内を cnt で検索しています。 .(ドット) で前方検索、,(カンマ) で後方検索しています。

画面内で入力しているキー(/cnt....,,,,)

f:id:Kernel_OGSun:20200329201947g:plain

条件付きブレイクポイントの設定

次の例では、5行目にブレイクポイントを貼り、cnt 変数が 5 の時に止まるように条件(cnt == 5)を設定しています(その後にコンティニュー(c)しています)。

右上の変数表示枠(Variables:)を確認すると、cnt が 5 のときにヒットしています。

画面内で入力しているキー(L5→[Enter]bB[Enter]↓cnt == 5→[Enter]Cc)

f:id:Kernel_OGSun:20200329202007g:plain

設定手順は、次のとおりです。 1. 任意の箇所へブレイクポイントを設定(bキー) 2. ブレイクポイント表示枠(右下)から手順 1 のブレイクポイントを選択[Enter] 3. Edit Breakpoint 画面の Condition: に「cnt == 5」のように条件を入力し、OK[Enter] 4. コンティニュー(c)などで走らせる

補足

より深く知りたい方向けに、ドキュメントやソースコードのリンクを張っておきます。


  1. ヘルプを実行すると分かりますが、入力キーは他にもあります。個人的に基本的と思うものだけ載せています。