如何在python中跟踪内置函数

Kod*_*rok 3 python debugging pdb

我想了解如何__enter____exit__方法被调用文件上下文管理。

with open("test.txt") as fp:
  fp.read()
Run Code Online (Sandbox Code Playgroud)

step在 pdb 中尝试过命令 - 而不是去定义函数open,它只是执行它并移动到下一行。

我尝试使用sys.settrace()过,但即使没有捕捉到的函数调用open__enter____exit__在任何事件。

当然,这适用于从其他模块和同一模块中导入的函数。我假设这应该以类似的方式适用于这些开箱即用的内置函数。我找不到任何指向此的文档。是否可以单步执行或跟踪内置函数的执行?

使用 Python 2.7。

M. *_*ber 5

在跟踪内置函数时尝试使用sys.setprofile而不是sys.settrace

系统的配置文件函数的调用方式与系统的跟踪函数类似(参见 settrace()),但它是用不同的事件调用的,例如,它不会为每个执行的代码行调用(仅在调用和返回时调用,而是返回即使设置了异常也会报告事件)

除了事件“call”和“return”,setprofile还提供了“c_call”和“c_return”,它们指的是调用和从内置函数返回。

要注意的其他两个参数的改变意义framearg
如果event等于“c_call”或“c_return”,frame是从哪儿内建函数被调用的外部框架,所以frame.f_code.co_name不会是内建函数的名字,但名字了调用它的python函数。相反,arg是 C 函数对象,而不是返回值。

所以要回答你的问题:

是否可以单步执行或跟踪内置函数的执行?

是的,可以跟踪内置函数的调用/返回,但是,您无法进入其中。我想你甚至没有看到调试器的 c_call/c_return 的原因是因为它使用了 settrace 而不是 setprofile。