らっちゃいブログ

日々の学びと気づきを発信するブログ

【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 の紹介は以上です。それではみなさんよいデバッグライフを!

合わせて読みたい

racchai.hatenablog.com

racchai.hatenablog.com

racchai.hatenablog.com