2011-01-17 6 views

答えて

9

Winpdbは、よりスマートなPythonデバッガの定義です。これは明示的にgoing down a forkをサポートしていますが、multiprocessing.Process()でうまく動作するかどうかはわかりませんが、試してみる価値はあります。

ユースケースのサポートを確認する候補リストについては、wikiのPython Debuggersのリストを参照してください。私は、この問題の解決策にシンプルを探して、これを思い付いてきた

+1

素晴らしい! Winpdbはマルチプロセッシングでうまくいきます.Process() – grep

+0

Winpdbはマルチプラットフォーム、フリー、フリーソフトウェアです。 – OliverUv

+0

winpdbについて読んで20分以内に、既存のスクリプトでインタラクティブなデバッグセッションをインポートする方法を見つけられませんでした。 pdb.set_trace() 'しかし、ここでのForkedPdbの答えは魅力的でした! – Pat

-1

サポートされているプラ​​ットフォームの場合は、DTraceを試してください。ほとんどのBSD/Solaris/OS XファミリはDTraceをサポートしています。

Here is an intro by the author。 Dtraceを使って何かをデバッグすることができます。

Here is a SO post DTraceの学習。

35

ForkedPdb().set_trace() 
+4

これは素晴らしいと私のためのトリックをした –

+0

ありがとう、これは私のためにも働いた。 – xamox

+0

素敵なトリック。プログラムが起動するときにsys.stdinを保存し、 '/ dev/stdin'を開くのではなくforkしたプロセスで使うことをお勧めします。理由は分かりませんが、readlineはうまく動作します。私は後でこれについて少し研究します。 – memeplex

2

この:

import sys 
import pdb 

class ForkedPdb(pdb.Pdb): 
    """A Pdb subclass that may be used 
    from a forked multiprocessing child 

    """ 
    def interaction(self, *args, **kwargs): 
     _stdin = sys.stdin 
     try: 
      sys.stdin = open('/dev/stdin') 
      pdb.Pdb.interaction(self, *args, **kwargs) 
     finally: 
      sys.stdin = _stdin 

はそれをあなたが古典的なPdbのを使用する場合がありますのと同じ方法を使用しますRomualdの答えの精緻化で、ファイル記述子を使って元のstdinを復元します。これにより、デバッガ内部でreadlineが動作し続けます。さらに、KeyboardInterruptのpdb特別管理は、マルチプロセッシングsigintハンドラを妨害しないように、無効になっています。

class ForkablePdb(pdb.Pdb): 

    _original_stdin_fd = sys.stdin.fileno() 
    _original_stdin = None 

    def __init__(self): 
     pdb.Pdb.__init__(self, nosigint=True) 

    def _cmdloop(self): 
     current_stdin = sys.stdin 
     try: 
      if not self._original_stdin: 
       self._original_stdin = os.fdopen(self._original_stdin_fd) 
      sys.stdin = self._original_stdin 
      self.cmdloop() 
     finally: 
      sys.stdin = current_stdin 
関連する問題