2011-12-15 18 views
10

gdbにdispに相当するpdbはありますか?Python pdb(デバッガ)disp相当?

など。私はGDBを使ってCをデバッグしていたとき、私は次のように入力して、コードを通じて、すべての「ステップ」に印刷された変数を持つことができます。

disp var 

私は同様の機能をご希望のPDBを使ってPythonをデバッグするんだけど、dispはいないようですそこには、pythonのpdbのドキュメントは、代替手段を提供していないようです - しかし、それは奇妙な省略のように思われる?

+0

おそらくipdbは、別の方法として、いくつかの代替機能 – bph

+0

を持っているあなたは素敵なUIが好きなら、あなたは[使用する場合がありますpudb](https://pypi.python.org/pypi/pudb)。 –

答えて

1

pdbのデバッグでは、普通のPythonコードを1文字コマンドを超えて入力することができます。print varを使用するだけでうまくいくはずです。

+0

これはpdbが 's'または' n'を打つたびに自動的に 'var'を再印刷することを意味しますか?それが確実であるかどうかは、私に 'p var'と入力するのと同じように思えます。問題は、デバッガを使って変数を出力する方法ではなく、もっと効率的に/効率的にpdbを使う方法についてです。 – bph

+0

申し訳ありません - これは一度だけ変数を出力します。 – jsbueno

+0

ok - 私の新しい答えはそれを行うべきです。 – jsbueno

3

コードでは、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のいずれかのメソッドを変更して、デバッグ済みフレームの状態が変更された後に呼び出されるメソッドを見つけることができます。

3

あなたはあなたのためにこれを行いますいくつかのエイリアスを設定することができます

alias n next;; p var 
alias s step;; p var 

読者への課題として残されている変数名のリスト全体を印刷します。残念なことに、この方法を実行すると、デバッガに空の行を送信すると、実行する「最後のコマンド」は、nではなく、p varになります。あなたはそれを修正したい場合は、のPDBこのややハックセットを使用することができます代わりに、コマンド:

!global __stack; from inspect import stack as __stack 
!global __Pdb; from pdb import Pdb as __Pdb 
!global __pdb; __pdb = [__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self") for __framerec in __stack() if (__framerec[0].f_locals.get("pdb") or __framerec[0].f_locals.get("self")).__class__ == __Pdb][-1] 

alias s step;; p var;; !__pdb.lastcmd = "!__pdb.cmdqueue.append('s')" 
alias n next;; p var;; !__pdb.lastcmd = "!__pdb.cmdqueue.append('n')"