pythonでのdebug(pdb,pudb)のメモ

Pythonのdebugで使用するpdbとpudbについてのメモ

pdb

対話形式のデバッガ、標準ライブラなのでインストールなしで使える
https://docs.python.jp/3/library/pdb.html

主なコマンドは下記

コマンド 効果
b ブレークポイントを設定
c ブレークポイントまで移動
n 現在の行を実行し、次の行で停止。次の行が関数だった場合は関数の中では止まらない
s 現在の行を実行し、次の行で停止。次の行が関数だった場合は関数の中で停止
p 変数の値を表示
pp pretty-printで変数を表示
q デバッガ停止
r 関数を抜ける
list 実行中の行の周辺を表示
whatis 式の型を表示
# python -m pdb スクリプト名
$ python -m pdb sample.py
(Pdb) b 19 # <- 19行目にブレークポイントを設置
(Pdb) n # <- 1行実行
-> from __future__ import print_function
(Pdb) list # <- 現在の行の周辺を表示
  1     # vim: fileencoding=utf-8
  2
  3     from __future__ import division
  4  -> from __future__ import print_function
  5     from __future__ import unicode_literals
  6     from __future__ import absolute_import
  7     try:
  8         from future_builtins import ascii, filter, hex, map, oct, zip
  9     except ModuleNotFoundError:
 10         pass  # running python version is 3
 11
(Pdb) c # <- ブレークポイントまで移動
-> x = div(x, i)
(Pdb) list
 14         return x / y
 15
 16     def main():
 17         x = 6
 18         for i in [3, 2, 1]:
 19 B->         x = div(x, i)
 20         return x
 21
 22     if __name__ == '__main__':
 23         main()
[EOF]
(Pdb) c
-> x = div(x, i)
(Pdb) list
 14         return x / y
 15
 16     def main():
 17         x = 6
 18         for i in [3, 2, 1]:
 19 B->         x = div(x, i)
 20         return x
 21
 22     if __name__ == '__main__':
 23         main()
[EOF]
(Pdb) p i # <- iの値を表示、ループの2回目なので、i は現在2
2
(Pdb)

起動時に指定する以外にも、import pdb; pdb.sey_trace() を記述することで、コード中で起動することもできる。

# vim: fileencoding=utf-8

from __future__ import print_function

def main():
    print('hoge')
    import pdb; pdb.set_trace()  # ここでpdbを起動する
    print('fuga')

if __name__ == '__main__':
    main()

pudb

pdbよりも高機能なデバッガ、こちらはインストールが必要

$ pip install pudb

基本的な操作はpdbと同じ。 困った時は?でヘルプがでるのでそれを見ればいい。 <C-x>pythonを実行できるペインに移動でき、ここでreplのようにいろいろ試せるのが便利。

起動は下記

$ pudb3 sample.py