以下のPythonのデバッガのチュートリアル、私が使用しpdb.set_trace()
たサンプルコードを中断します。それは機能しましたが、インタラクティブプロンプトが表示されていて、別のネストされたブレークポイントが必要な場合はどうでしょうか。
(Pdb) def test(): pdb.set_trace(); print "don't print this yet"
(Pdb) test()
don't print this yet
止まらなかった。デバッガーは基本的に「1つの深さ」ですか?たとえば、これはPythonのフックの制限ですか、それともpdbが選択しないことですか?
これはPythonのフックの制限ですか、それともpdbが選択しないことですか?
フックの制限のようです。
何が呼び出され、何が呼び出されなかったかを確認するためにテストを行いました(printステートメントを入れて/usr/lib/python2.7/bdb.py
)
クイック検査はpdb.pyset_trace
で見つかります:
def set_trace():
Pdb().set_trace(sys._getframe().f_back)
それはbdb.pyのset_traceを呼び出します
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)
これにより、同じくbdb.pyにあるtrace_dispatchへのコールバックが設定されます。sys.settraceコード自体はおそらくthreading.pyにあります:
def settrace(func):
global _trace_hook
_trace_hook = func
GitHub検索では、の参照がこれ以上見つからないため_trace_hook
、おそらくCコードのどこかで魔法のように検出されています。
test()が呼び出されると、sys.settrace()呼び出しが行われることがわかります...しかし、その後、trace_dispatch()の呼び出しは発生しません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加