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

时间:2013-01-12 18:32:46

标签: python debugging pdb

我知道我可以使用PDB来跟踪模块,并且我可以通过在它前面添加一个来执行pdb中的任意命令! (例如!"foo".upper())。

是否有某种方法可以将这些功能组合起来跟踪在当前上下文中执行的任意命令?例如。像step !"foo".upper()"之类的东西可以让我逐步执行upper方法,然后返回到早期的上下文?

1 个答案:

答案 0 :(得分:3)

使用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()很重要,因为如果没有它们,表达式将在__main__模块上下文中进行评估,或者直接在当前模块上下文中进行评估(如果在没有locals()的情况下使用),但不在当前全局与!expression一样常见的本地情境。