python 標準デバッガ pdb の使い方
[履歴] [最終更新] (2015/09/09 10:22:39)
最近の投稿
注目の記事

概要

pdb はこちらに記載した ruby デバッガ rdb の python 版です。

起動方法

$ python -m pdb buggy.py

buggy.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

def div(x, y):
    return x / y

def main():
    x = 6
    for i in [3, 2, 1, 0]:
        x = div(x, i)
    return x

if __name__ == '__main__':
    main()

デバッグコマンド

現在地の表示 (l)

例えば l 0 とすると下まで閲覧した後であっても最初の行を表示できます。

(Pdb) l
  1     #!/usr/bin/python
  2     # -*- coding: utf-8 -*-
  3
  4  -> def div(x, y):
  5         return x / y
  6
  7     def main():
  8         x = 6
  9         for i in [3, 2, 1, 0]:
 10             x = div(x, i)
 11         return x

ブレークポイントまで進む (b, c)

(Pdb) b 8
Breakpoint 1 at /home/vagrant/buggy.py:8
(Pdb) c
> /home/vagrant/buggy.py(8)main()
-> x = 6

1 行進んでプリント (s, p, pp, dir)

(Pdb) s
> /home/vagrant/buggy.py(9)main()
-> for i in [3, 2, 1, 0]:
(Pdb) l
  4     def div(x, y):
  5         return x / y
  6
  7     def main():
  8 B       x = 6
  9  ->     for i in [3, 2, 1, 0]:
 10             x = div(x, i)
 11         return x
 12
 13     if __name__ == '__main__':
 14         main()
(Pdb) pp x
6
(Pdb) p x
6
(Pdb) dir(x)
['__abs__', '__add__', '__and__',..., 'real']

ブレークポイントの解除 (cl)

(Pdb) cl
Clear all breaks? y

関数の中に入らない (n)

s は中に、中にと入っていく。n は同じレベルで次の行に進む。同じコマンドの繰り返しはエンターで代用できます。一度 s を実行してからエンターを連打する、ということが可能です。

現在の関数を抜ける (r + s)

一度 r を実行して、次に s を実行すると現在の関数から抜けた直後の状態になります。

デバッガの終了 (q, ctrl-d)

どのような経路で現在の状況に至ったのか (w)

スクリプトに直接記載

set_trace() と記載した箇所からデバッガを起動することができます。

$ python buggy.py

buggy.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
import pdb

def div(x, y):
    return x / y

def main():
    x = 6
    for i in [3, 2, 1, 0]:
        x = div(x, i)
        pdb.set_trace()
    return x

if __name__ == '__main__':
    main()
関連ページ
    概要 pytest の基本的な使い方を記載します。 適宜参照するための公式ドキュメントページ Full pytest documentation API Reference インストール 適当なパッケージマネージャ等でインストールできます。 sudo apt install python-pip pip install pytest which pytest /home/vagran