首页 > 解决方案 > 如何使用 sys.settrace 跟踪在全局范围内运行的代码?

问题描述

假设我有一段这样的代码:

import sys

def printer(frame, event, arg):
    print(frame, event, arg)
    return printer

sys.settrace(printer)
x = 1
sys.settrace(None)

自从

每当输入新的本地范围时,都会调用跟踪函数(事件设置为“调用”)

上面的代码什么也没输出。请参阅我之前的问题

那么有没有办法在全局范围内跟踪行,比如x = 1

标签: python

解决方案


sys.settrace设置全局跟踪功能。每当输入新的 Python 堆栈帧(事件)时都会调用此跟踪函数'call',它的返回值是新作用域的本地跟踪函数。活动堆栈帧的本地跟踪功能是用于所有其他事件类型的功能。

您需要设置现有堆栈帧的本地跟踪功能,但设置全局跟踪功能并不能帮助您做到这一点。要设置现有框架的本地跟踪功能,您可以手动将框架对象的f_trace属性分配给您想要的功能。例如,设置当前帧的本地跟踪功能:

import sys
sys._getframe().f_trace = whateverfunc

请注意,如果没有全局跟踪函数,则不会调用本地跟踪函数,因此您还需要设置全局跟踪函数。(这似乎没有记录。)

您可以结合sys.settrace手动f_trace分配来跟踪新的和现有的堆栈帧;例如,在一个'return'事件中,您可以检查您将要返回的帧的本地跟踪功能,并将该跟踪功能设置为您想要的任何内容。bdb调试器框架源代码是如何使用跟踪函数的一个很好的例子。


推荐阅读