跟踪PDB中发出的任意Python命令?

跟踪PDB中发出的任意Python命令?,python,debugging,pdb,Python,Debugging,Pdb,我知道我可以使用PDB来跟踪一个模块,并且我可以通过在PDB前面加上一个!(例如,!“foo.upper()) 是否有某种方法可以结合这些功能来跟踪在当前上下文中执行的任意命令?例如,step!“foo.upper()”这将允许我逐步执行upper方法,然后返回到前面的上下文?使用pdb.runcall (Pdb) pdb.runcall(func, *args, **kwds) # e.g. pdb.runcall(myfunc, arg1, arg2) 然后按(n或s)步进或设置断点

我知道我可以使用PDB来跟踪一个模块,并且我可以通过在PDB前面加上一个!(例如,
!“foo.upper()


是否有某种方法可以结合这些功能来跟踪在当前上下文中执行的任意命令?例如,
step!“foo.upper()”
这将允许我逐步执行
upper
方法,然后返回到前面的上下文?

使用
pdb.runcall

(Pdb) pdb.runcall(func, *args, **kwds)   # e.g. pdb.runcall(myfunc, arg1, arg2)
然后按(n或s)步进或设置断点

(Pdb) b my_module.py:123    # b ([file:]lineno | function) [, condition]
然后按“c”键运行到断点

您无法跟踪示例中使用的str.upper之类的内置函数

编辑:您还要求当前上下文
您可以在当前上下文中使用用户定义的函数计算和调试表达式。示例:

pdb.runeval("[myfunc(x) for x in range(3)]", globals(), locals())
# or with ... some_module.globals())

参数
globals()、locals()
非常重要,因为如果没有这些参数,表达式将在
\uuuuuu main\uuuuuu
模块上下文中计算,如果不使用局部变量()则直接在当前模块上下文中计算,但不是在当前全局和本地上下文中,就像在
!expression

中通常那样。实际上,您只能在框架堆栈中上下移动