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 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
(Pdb) b 8
Breakpoint 1 at /home/vagrant/buggy.py:8
(Pdb) c
> /home/vagrant/buggy.py(8)main()
-> x = 6
(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']
(Pdb) cl
Clear all breaks? y
s は中に、中にと入っていく。n は同じレベルで次の行に進む。同じコマンドの繰り返しはエンターで代用できます。一度 s を実行してからエンターを連打する、ということが可能です。
一度 r を実行して、次に s を実行すると現在の関数から抜けた直後の状態になります。
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()