Python3でエラー発生時にデバッガを起動する


このエントリーをはてなブックマークに追加

Python3のスクリプトを数時間動かしたあとにエラーで落ちるという経験はないでしょうか。エラーが発生したら pdb と呼ばれるデバッガが起動するようにしておくと、エラーの究明に役立ちます。

例えば、以下のような script.py があったとします。

def main():
    a = 10
    b = 0
    print(a / b)


main()

このスクリプト$ python3 script.py と普通に実行すると、以下のようにゼロ除算エラーが発生し、異常終了してしまいます。

$ python script.py
Traceback (most recent call last):
  File "script.py", line 7, in <module>
    main()
  File "script.py", line 4, in main
    print(a / b)
ZeroDivisionError: integer division or modulo by zero

ここで、

$ python3 -m pdb -c continue script.py

というふうに、-m pdb -c continue をつけてスクリプトを実行すると、以下のように、エラーが発生した地点でデバッガが起動します。

$ python3 -m pdb -c continue script.py
Traceback (most recent call last):
  File "/usr/lib/python3.6/pdb.py", line 1667, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/lib/python3.6/bdb.py", line 434, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/home/user/script.py", line 1, in <module>
    def main():
  File "/home/user/script.py", line 4, in main
    print(a / b)
ZeroDivisionError: division by zero
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /home/user/script.py(4)main()
-> print(a / b)
(Pdb) 

あとは、pdbを使って自由に原因究明できます。

(Pdb) print(a)
10
(Pdb) print(b)
0