コードでは、Pythonのイントロスペクション機能を使用して、PDBモジュール0 に2つの新しいコマンドを追加し、別のモジュールにその呼び出しを呼び出し、デバッグを開始する前にこのモジュールをインポートします。 'および' undisp 'コマンドは、ウォッチを変数に追加したり、取り消したりします。
これは、pure pythonで書かれたPythonのpdbモジュールをmonkeypatchingすることによって動作します。
# -*- coding: utf-8 -*-
def patch_pdb():
import pdb
def wrap(func):
def new_postcmd(self, *args, **kw):
result = func(self, *args, **kw)
if hasattr(self, "curframe") and self.curframe and hasattr(self, "watch_list"):
for arg in self.watch_list:
try:
print >> self.stdout, "%s: %s"% (arg, self._getval(arg)) + ", ",
except:
pass
self.stdout.write("\n")
return result #func(self, *args, **kw)
return new_postcmd
pdb.Pdb.postcmd = wrap(pdb.Pdb.postcmd)
def do_disp(self, arg):
if not hasattr(self, "watch_list"):
self.watch_list = []
self.watch_list.append(arg)
pdb.Pdb.do_disp = do_disp
def do_undisp(self, arg):
if hasattr(self, "watch_list"):
try:
self.watch_list.remove(arg)
except:
pass
pdb.Pdb.do_undisp = do_undisp
patch_pdb()
if __name__ == "__main__":
# for testing
import pdb; pdb.set_trace()
a = 0
for i in range(10):
print i
a += 2
残念ながら、前回のコマンドの実行時に変数の状態を表示することしかできませんでした。 (私はちょっと試しましたが、Pdbのベースとなるbdbモジュールのmonkeypatchingはうまく動作していませんでした)。 wrap
で修飾されたpdb.Pdb、bdb.Bdb、またはcmd.Cmdのいずれかのメソッドを変更して、デバッグ済みフレームの状態が変更された後に呼び出されるメソッドを見つけることができます。
おそらくipdbは、別の方法として、いくつかの代替機能 – bph
を持っているあなたは素敵なUIが好きなら、あなたは[使用する場合がありますpudb](https://pypi.python.org/pypi/pudb)。 –