使用 PDB 进入表达式中的非最内层调用

Step into the non-innermost call in an expression with PDB

考虑这样一段代码:

breakpoint()
x = foo(bar(baz()))

在 PDB(或 PDB++)中,step 命令通常会进入 baz() 函数。

如何进入对 bar()baz() 的调用而不是对 baz() 的调用?我在 PDB 或 PDB++ 文档中没有看到任何关于此的信息。

查看调试器命令列表here

您可以在 foo 或 bar:

中使用 break 放置断点或使用 tbreak 放置临时断点
$ python3 x.py 
> /tmp/0/x.py(14)<module>()
-> x=foo(bar(baz(42)))
(Pdb) break foo
Breakpoint 1 at /tmp/0/x.py:1
(Pdb) continue
> /tmp/0/x.py(2)foo()
-> ret=x+1

或运行直到baz结束使用return然后再次step

$ python3 x.py 
> /tmp/0/x.py(14)<module>()
-> x=foo(bar(baz(42)))
(Pdb) step
--Call--
> /tmp/0/x.py(9)baz()
-> def baz(x):
(Pdb) return
--Return--
> /tmp/0/x.py(11)baz()->45
-> return ret
(Pdb) step
--Call--
> /tmp/0/x.py(5)bar()
-> def bar(x):
(Pdb) return
--Return--
> /tmp/0/x.py(7)bar()->47
-> return ret
(Pdb) step
--Call--
> /tmp/0/x.py(1)foo()
-> def foo(x):