はじめに
Web開発初心者が学んだ内容の整理も込めてipdbを用いたデバッグについてまとめていきます。
ipdbとは?
Pythonに標準で備わったデバッガであるpdbの拡張機能を提供している。
使い方
デバッガを始めたい位置に以下のコードを記入し、プログラムを実行する。
import ipdb; ipdb.set_trace()
実行すると、標準入力待ちになるので、コマンドを入力することでデバッガを操作できる。以下にはよく使う(らしい)コマンドをまとめる。
コマンド | 動作 |
---|---|
n | 次の行まで実行 |
s | 次の関数まで実行 |
p 変数名 | 変数の値を表示 |
a | 実行中の関数の引数を表示 |
h | ヘルプ |
q | 終了 |
使ってみる
POJ No.3468のAggressive Cowsのプログラムを用いて、実際にipdbを使ってみる。
Aggressive.py
import ipdb
n = 5
m = 3
x = [1, 2, 8, 4, 9]
def C(d):
last = 0
for _ in range(1, m):
crt = last + 1
while crt<n and x[crt]-x[last]<d:
crt += 1
if crt == n:
return False
last = crt
return True
x.sort()
lb, ub = 0, max(x)
while ub-lb > 1:
ipdb.set_trace()
mid = int( (lb+ub)/2 )
if C(mid):
lb = mid
else:
ub = mid
print(lb)
実行する。
$ python Aggressive.py
>c:/users/~/aggressive.py(21)<module>()
20 import ipdb; ipdb.set_trace()
---> 21 mid = int( (lb+ub)/2 )
22 if C(mid):
設定したブレークポイントが矢印で出力される。
ipdb> h
Documented commands (type help <topic>):
========================================
EOF cl disable interact next psource rv unt
a clear display j p q s until
alias commands down jump pdef quit source up
args condition enable l pdoc r step w
b cont exit list pfile restart tbreak whatis
break continue h ll pinfo return u where
bt d help longlist pinfo2 retval unalias
c debug ignore n pp run undisplay
Miscellaneous help topics:
==========================
exec pdb
使えるコマンド一覧が出力される。
ipdb> p mid
*** NameError: name 'mid' is not defined
まだ21行目が実行されていないので変数mid
は定義されていない。
ipdb> n
> c:/users/~/aggressive.py(22)<module>()
21 mid = int( (lb+ub)/2 )
---> 22 if C(mid):
23 lb = mid
ブレークポイントを示す矢印が1つ下にずれる。
ipdb> p mid
4
21行目を実行したので変数mid
の値が表示される。
ipdb> s
--Call--
> c:/users/~/aggressive.py(6)C()
5
----> 6 def C(d):
7 last = 0
次の関数の呼び出しまで実行されたらしい。
ipdb> a
d = 4
次の関数の呼び出しはすぐ下だったので、先ほど確認した変数mid
の値が引数として表示される。
ipdb> q
Exiting Debugger.
デバッガを終了する。
まとめ
ipdbでよく使われる(らしい)コマンドを一通り使ってた。デバッガを使用するのは初めてだったのですが、プログラムを途中まで実行し、その都度変数の中身を確認したり、プログラムを書き変えなくても望む位置まで実行して確認していけるのは非常に便利だと感じた。
プログラム書いててやっぱしんどいのはデバッグなので、デバッガをうまく利用して効率的に、かつミスのないプログラムを書いていきたいな~