2016-05-10 18 views
0

突然問題が発生した[大]プログラムがあります。どこか無限ループ中です。私はこのループを見つけることができません。Python PDBは停止しません

私がやった:プログラムが無限ループに入ったときに

import pdb 
pdb.run ('main()') 

だから、私はそれが何もしない制御-Cと......を打ちます。実際、私がpdbを使わないときは、control-Cも動作しません。

私は信号を無効にしません。たとえ私がしても、control-Cは何もしません。

これは、問題がC++ - 土地のどこかにあるかどうかを調べるために、これを実行しました。そして、そうではありません - Pythonのクラップスを実行しています。

pdbを実際にcontrol-cでブレークさせるにはどうすればよいですか? pdb.set_trace() を使用して

+0

AFAIK、Ctrl-Cはメインスレッドで割り込みを発生し、プログラム全体が停止しない限りスレッド#7に影響しません。私はメインスレッドが 'KeyboardInterrupt'をキャッチしているどこか(例外クラスが指定されていないことを除いて)' try ... except: 'を持っていると思います。 –

+0

また、これはマルチスレッドプログラムです。デッドロックを起こしていないと確信していますか? –

+0

スレッド7は空き状態で実行されていましたが、スレッド1は条件変数で終了するのを待っていました。そこでcontrol-Cが動作しなかった理由を説明します。そしてはい:それはデッドロックではありませんでした(100%CPUを使用していました)。私の最初の考えは「ああ、ループだよ、デッドロックじゃないよ!」それから、私はそれをデバッグすることができませんでした... – iAdjunct

答えて

1

がここ倍各行が渡されるの数をカウントし、ラインがヒットしたときにエラーを発生させ、単純な「デバッガが」だときのデバッグのために停止するプログラムあまりにも何度も。うまくいけば、本当にループが見つかるのを助けることができます。

from bdb import Bdb 
from collections import Counter 

class LoopDetector(Bdb): 
    def __init__(self, maxhits): 
     Bdb.__init__(self) 
     self.counter = Counter() 
     self.maxhits = maxhits 

    def do_clear(self, arg): 
     pass 

    def user_line(self, frame): 
     filename = frame.f_code.co_filename 
     lineno = frame.f_lineno 
     key = (filename, lineno) 
     self.counter[key] += 1 
     if self.counter[key] >= self.maxhits: 
      raise ValueError('Too many hits at %s:%s' % key) 

LoopDetector(1000).set_trace() 

x = 1 
y = x + 2 
for i in range(200): 
    y += i 

while True: # An exception gets raised here 
    y -= 1 

print 'Does not get here' 

これは、現在のスレッドにのみ影響するため、スレッドごとに1回行う必要があります。

+0

これは私が望んでいた答えではありませんでしたが( "ここで' pdb'の働き方はどうですか?)、これは絶対にうまくいきました - 私のループは無限大になりました(-1e32から始まり、それが陽性になるまで)。 – iAdjunct

0

あなたはあなたの中にブレークポイントを追加する必要がありPDBにdocs

を見てみましょう(あなたの例ではmainを)機能次に、コマンドライン(例えばpython myprog.py)を使用して機能を実行することができますし、プログラムしますブレークポイントを設定する場所を停止します。上記の例では

import pdb 

def main(): 
    i = 0 

    while i<10: 
     print i 
     if i == 8: 
      pdb.set_trace() 
     i += 1 

i==8

+1

OPの問題は、ループがどこにあるのかわかりません。 –

+0

@AlexHallはもう少し読んで、この[質問](http://stackoverflow.com/questions/10239760/interrupt-pause-running-python-program-in-pdb)を見つけました。それはpythonでしか動作しないようです3 – lsxliron

+0

OPはCtrl + Cが決してプログラムに影響を与えないと言うので、どちらも役に立ちません。それがOPの通知を確実にするための質問になります。 –

関連する問題