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_tracepdb.py:

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)

这会设置回调到 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() 的调用没有发生。