2016-03-28 11 views
3

tutorial on Python's debuggerに続いて、pdb.set_trace()を使用してサンプルコードを中断しました。それはうまくいったが、インタラクティブなプロンプトで別のネストされたブレークポイントが必要な場合はどうなるだろうか?pdbにネストされたブレークポイントが可能ですか?

(Pdb) def test(): pdb.set_trace(); print "don't print this yet" 
(Pdb) test() 
don't print this yet 

停止しませんでした。デバッガは基本的に「1つ深い」ですか?例えばこれはPythonのフックの制限ですか、あるいは単にpdbが選択しないものですか?

答えて

0

これはPythonのフックの制限ですか、それともpdbが選択しないものですか?

フックには制限があるようです。

私はクイック検査がpdb.pyset_traceを見つけ

と呼ばれ、( /usr/lib/python2.7/bdb.pyにprint文を入れて)ものではありませんでしたされていたかを確認するテストをしました: bdb.py

でset_traceを呼び出し

def set_trace(): 
    Pdb().set_trace(sys._getframe().f_back) 

def set_trace(self, frame=None): 
    """Start debugging from `frame`. 
    If frame is not specified, debugging starts from caller's frame. 
    """ 
    if frame is None: 
     frame = sys._getframe().f_back 
    self.reset() 
    while frame: 
     frame.f_trace = self.trace_dispatch 
     self.botframe = frame 
     frame = frame.f_back 
    self.set_step() 
    sys.settrace(self.trace_dispatch) 

これは、trace_dispatchへのコールバック、also in bdb.pyを設定します。 sys.settraceコード自体はthreading.pyで、おそらくです:

def settrace(func): 
    global _trace_hook 
    _trace_hook = func 

GitHubの検索が_trace_hookのためにこれ以上の言及を見つけていないので、おそらくそれは、どこかCコードで魔法のように拾っています。

test()が呼び出されると、sys.settrace()呼び出しが行われたことが判明しますが、trace_dispatch()の呼び出しは行われません。

関連する問題