Pythonはどうやってデバッグしますか?


問題
あなたのプログラムが壊れたらどうやってデバッグしますか?
ソリューション
もしあなたのプログラムが異常で崩壊したら、 python3 -i someprogram.py を実行して簡単なデバッグができます。iオプションは、プログラムが終了したらインタラクティブshellを開くことができます。次に環境を確認できます。例えば、下記のコードがあるとします。

# sample.py

def func(n):
 return n + 10

func('Hello')
python3 -i sample.py を実行すると以下のような出力があります。

bash % python3 -i sample.py
Traceback (most recent call last):
 File "sample.py", line 6, in <module>
 func('Hello')
 File "sample.py", line 4, in func
 return n + 10
TypeError: Can't convert 'int' object to str implicitly
>>> func(10)
20
>>>
上のようなものが見えない場合は、プログラムが崩壊した後、Pythoonの調合器を開くことができます。たとえば:

>>> import pdb
>>> pdb.pm()
> sample.py(4)func()
-> return n + 10
(Pdb) w
 sample.py(6)<module>()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q
>>>
あなたのコードがある環境では、インタラクティブshell(例えば、あるサーバの上にある)を取得するのが難しい場合、通常は異常を捕まえてから自分で追跡情報を印刷することができます。たとえば:

import traceback
import sys

try:
 func(arg)
except:
 print('**** AN ERROR OCCURRED ****')
 traceback.print_exc(file=sys.stderr)
もしあなたのプログラムが崩壊していないなら、あなたが読めない結果が発生しただけです。興味のあるところにprint() 文を挿入してもいいです。でも、このようにするつもりなら、いくつかの技術があります。まず、traceback.print_stack() 関数は、その時点までプログラムが実行される時に追跡スタックを作成します。たとえば:

>>> def sample(n):
...  if n > 0:
...    sample(n-1)
...  else:
...    traceback.print_stack(file=sys.stderr)
...
>>> sample(5)
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 5, in sample
>>>
また、次のように pdb.set_trace() を使って任意の場所で手動で調合器を起動することもできます。

import pdb

def func(arg):
 ...
 pdb.set_trace()
 ...
プログラムが大きくて、コントロールフローと関数パラメータをデバッグしたい時にはこれが役に立ちます。例えば、調合器が起動すると、パラメータ値を観測したり、wなどのコマンドを叩いたりして追跡情報を得ることができます。
討論する
デバッグを複雑にしないでください。いくつかの簡単なエラーはプログラムスタックの情報を観察するだけで分かります。実際のエラーは一般的にスタックの最後の行です。開発時に、調整が必要なところにprint() 関数を挿入して情報を診断してもいいです。(最後に発表する時にこれらの印刷文を削除すればいいです。)
試聴器の一般的な使い方の一つは、崩壊した関数の変数を観測することである。関数が崩壊した後、どのように調合器に入るかを知るのは有用なスキルです。
非常に複雑なプログラムを解剖したいとき、下の制御ロジックがよく分かりません。pdb.set_trace() という言葉を入れると役に立ちます。
実際には、プログラムはset_trace() 文の位置に到達するまで実行されます。その後、すぐに調律器に入ります。そしてあなたはもっと多くのことができます。
IDEを使ってPythonを開発すれば、通常IDEはpdbの代わりに自分のコーディネーターを提供します。もっと多くのこの方面の情報はあなたが使っているIDEマニュアルを参照することができます。
以上はPythonがどうやってプログラムをデバッグしますか?