Debugerの使用法

Python Debuggerモジュールを読み込むには, import pdb とする.

import pdb
def f(x):
    print("x=", 100 / (x + 5))

プログラムを停止したい行の前に pdb.set_trace() と書くとデバッガが起動する.

重要なコマンド一覧

  • h (help) でヘルプが出る.(help <コマンド> でコマンドの説明が出る.)
  • q (quit) でデバッガを終了する.(デバッガをちゃんと終了させないとカーネルが暴走するので注意!)
  • p (print) でプリント(コマンドと同じ変数でなければ,それを入れるだけでプリントしてくれる.)
  • n (next) で次の行に進む.
  • c (continue) で次の停止位置(ブレークポイント)まで進む.
  • s (step into) で現在の行を実行(関数呼び出しで止まる)
  • l (list) で現在の近所のプログラムリストを表示する.

以下のプログラムを動かして,コマンドを色々試してみよう.

  • 関数 f(x) 内では,変数 y はどうなっているだろうか?
  • もとのプログラム内では,変数 x はどうなっているだろうか?
for i in range(3):
    #pdb.set_trace()   #止めたいときにはこの行を生かす
    y = i + 2
    f(y)

意図的にエラーを起こしてみる.

%debug とうつと,エラー箇所からデバッグを開始できる.

  • 変数xを表示させ,何故エラーが起きたかを考えてみよう.
for i in range(-10, 0):
    y = i + 2
    f(y)
x= -33.333333333333336
x= -50.0
x= -100.0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/var/folders/69/5y96sdc94jxf6khgc8mlmxrr0000gn/T/ipykernel_37338/103814889.py in <module>
      1 for i in range(-10, 0):
      2     y = i + 2
----> 3     f(y)

/var/folders/69/5y96sdc94jxf6khgc8mlmxrr0000gn/T/ipykernel_37338/2476642032.py in f(x)
      1 # 呼び出し用の関数を準備する.
      2 def f(x):
----> 3     print("x=", 100 / (x + 5))

ZeroDivisionError: division by zero
%debug
> /var/folders/69/5y96sdc94jxf6khgc8mlmxrr0000gn/T/ipykernel_37338/2476642032.py(3)f()
      1 # 呼び出し用の関数を準備する.
      2 def f(x):
----> 3     print("x=", 100 / (x + 5))

-5