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()
も....
そのうち、調べたいと思います。 今日はこれだけ。