pdb 中是否可能存在嵌套断点——如果不能,是什么阻止了它们?
Are nested breakpoints possible in pdb--if not, what prevents them?
下面一个tutorial on Python's debugger,我用pdb.set_trace()
打断了示例代码。它有效,但是如果您在交互式提示符下并想要另一个嵌套断点怎么办?
(Pdb) def test(): pdb.set_trace(); print "don't print this yet"
(Pdb) test()
don't print this yet
它没有停止。调试器从根本上是"one deep"?例如这是 Python 的钩子的限制,还是 pdb 没有选择做的事情?
is this is a limitation of Python's hooks, or just something pdb doesn't choose to do?
这似乎是挂钩的限制。
我做了一个测试,看看什么被调用了,什么没有调用(在 /usr/lib/python2.7/bdb.py
中放置打印语句)
快速检查发现 set_trace
在 pdb.py:
def set_trace():
Pdb().set_trace(sys._getframe().f_back)
中调用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)
这会设置回调到 trace_dispatch,also in bdb.py. The sys.settrace code itself is perhaps in threading.py:
def settrace(func):
global _trace_hook
_trace_hook = func
GitHub 搜索找不到 _trace_hook
的更多引用,所以大概是在某处的 C 代码中神奇地提取了它。
当调用 test() 时,结果是调用了 sys.settrace()...但是随后对 trace_dispatch() 的调用没有发生。
下面一个tutorial on Python's debugger,我用pdb.set_trace()
打断了示例代码。它有效,但是如果您在交互式提示符下并想要另一个嵌套断点怎么办?
(Pdb) def test(): pdb.set_trace(); print "don't print this yet"
(Pdb) test()
don't print this yet
它没有停止。调试器从根本上是"one deep"?例如这是 Python 的钩子的限制,还是 pdb 没有选择做的事情?
is this is a limitation of Python's hooks, or just something pdb doesn't choose to do?
这似乎是挂钩的限制。
我做了一个测试,看看什么被调用了,什么没有调用(在 /usr/lib/python2.7/bdb.py
中放置打印语句)
快速检查发现 set_trace
在 pdb.py:
def set_trace():
Pdb().set_trace(sys._getframe().f_back)
中调用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)
这会设置回调到 trace_dispatch,also in bdb.py. The sys.settrace code itself is perhaps in threading.py:
def settrace(func):
global _trace_hook
_trace_hook = func
GitHub 搜索找不到 _trace_hook
的更多引用,所以大概是在某处的 C 代码中神奇地提取了它。
当调用 test() 时,结果是调用了 sys.settrace()...但是随后对 trace_dispatch() 的调用没有发生。