【Python】いつまでprintデバッグで消耗してるの?
スポンサーリンク
Python を初めて間もない頃、自分も print デバッグしてました。効率の悪さを認識しつつも、IDEを導入してデバッグする方法を調べてセッティングして、という手順が面倒でずっと放置してました。
// 普段は vim で開発してます
そうこうしてたら print デバッグではどうにもならないバグにぶち当たり、仕方なくデバッグポイントを置く方法を調べたわけです。するとどうでしょう。
ソースコード中に以下の一文を入れるだけではないですか。
import pdb; pdb.set_trace()
たったこれだけで、上の一文を挿入した行で処理が停止し、コンソール上でステップ実行が出来るようになります。最高かよ。
個人的にですが、デバッガー起動中によく使うコマンドとしては以下です。
コマンド | 説明 |
---|---|
s(tep) | ステップイン |
n(ext) | ステップオーバー |
r(eturn) | ステップアウト |
l(ist) | 現在行の前後のソースコードを表示 |
a(rgs) | 現在いる関数の引数を表示 |
p | プリント |
c(ont(inue)) | 次のブレイクポイントまで実行 |
それでは簡単に試してみましょう。
今回は実行時の引数を print するだけの簡単なスクリプトを用意しました。main
関数実行前にブレイクポイントを置いています。
$ cat > /tmp/debug.py <<EOF #!/usr/bin/env python import sys def log(args): print args def main(args): log(args) import pdb;pdb.set_trace() main(sys.argv) EOF
これを普通に実行するだけで・・
$ python debug.py > /tmp/debug.py(12)<module>() -> main(sys.argv)
main 関数の実行前で停止してくれました。念のため、実際の停止位置を l(ist) コマンドで確認してみます。
(Pdb) l 7 8 def main(args): 9 log(args) 10 11 import pdb;pdb.set_trace() 12 -> main(sys.argv) [EOF]
はい、ばっちり main 関数で止まっています。それではステップイン!
(Pdb) s --Call-- > /tmp/debug.py(8)main() -> def main(args): (Pdb) l 3 import sys 4 5 def log(args): 6 print args 7 8 -> def main(args): 9 log(args) 10 11 import pdb;pdb.set_trace() 12 main(sys.argv) [EOF]
main 関数内に入って行きました。せっかくなので引数の値を確認してみます。
(Pdb) a args = ['/tmp/debug.py']
ちゃんと引数が渡ってきていることがわかりますね。次は p コマンドで引数の型を確認してみます。
(Pdb) p type(args) <type 'list'>
list です。まあ見ればわかりますか。引数の中身が見れたら満足したので、continue コマンドで残りの処理を一気に流してしまいましょう。
(Pdb) c ['/tmp/debug.py']
無事引数が標準出力に表示されました。簡単ですね。
pdb の紹介は以上です。それではみなさんよいデバッグライフを!
合わせて読みたい