matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

Pythonデバッガーのドキュメントにさっと目を通した

Pythonデバッガーのドキュメントにさっと目を通しました。 短時間ですが、学んだことをメモしておきます。 あと、気になったのでそのうち試したいことも。

念のためですがここです。

27.3. pdb --- Python デバッガ — Python 3.6.7 ドキュメント

事後デバッグモードで起動する

こんな感じで起動できるらしい。いつも pdb.set_trace() を使うので使ったことがなかった。

python -m pdb my_script.py

とりあえず試して見ます。

Exceptionを吐くコードを書きました。これでExceptionが出たときにどういう値が入ってるのかを検査します。

class MyClass:
    def __init__(self):
        self.num = 0
        self.result = 0

    def calc(self):
        self.num = self.num + 1
        self.result = self.result + self.num
        return self.result


def main():
    myclass = MyClass()
    for x in range(100):
        if myclass.calc() > 100:
            raise Exception("100超えたよ")

main()

普通に実行するとこうなります。

$ python my_script.py
Traceback (most recent call last):
  File "my_script.py", line 19, in <module>
    main()
  File "my_script.py", line 17, in main
    raise Exception("100超えたよ")
Exception: 100超えたよ

やって見ます。

$ python -m pdb my_script.py
> /Users/mtb/work/pdb/my_script.py(2)<module>()
-> class MyClass:
(Pdb) l
  1
  2  -> class MyClass:
  3        def __init__(self):
  4            self.num = 0
  5            self.result = 0
  6
  7        def calc(self):
  8            self.num = self.num + 1
  9            self.result = self.result + self.num
 10            return self.result
 11
(Pdb) c
Traceback (most recent call last):
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pdb.py", line 1667, in main
    pdb._runscript(mainpyfile)
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/bdb.py", line 434, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/Users/mtb_beta/work/pdb/my_script.py", line 2, in <module>
    class MyClass:
  File "/Users/mtb_beta/work/pdb/my_script.py", line 17, in main
    raise Exception("100超えたよ")
Exception: 100超えたよ
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /Users/mtb_beta/work/pdb/my_script.py(17)main()
-> raise Exception("100超えたよ")
(Pdb) l
 12
 13    def main():
 14        myclass = MyClass()
 15        for x in range(100):
 16            if myclass.calc() > 100:
 17  ->             raise Exception("100超えたよ")
 18
 19    main()
[EOF]
(Pdb) myclass.num
14
(Pdb) myclass.result
105

Exceptionが出た時の値を見れました。 便利そう。

疑問一覧

ざっとドキュメント読んでこんな疑問が出ました。

  • ソースコードリスティングって何?
  • 事後解析デバッギングって何?
  • デバッガーは拡張可能とはあるけど、どんなときに拡張するんだろう
  • pdb.run というのを使ったことないので使ってみたい
  • pdb.runeval というのを使ったことないので...
  • pdb.runcall というのを使ったこと...
  • pdb.post_mortem pdb.pm() も....

そのうち、調べたいと思います。 今日はこれだけ。