python - 如何使用 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
?
解决方案
sys.settrace
设置全局跟踪功能。每当输入新的 Python 堆栈帧(事件)时都会调用此跟踪函数'call'
,它的返回值是新作用域的本地跟踪函数。活动堆栈帧的本地跟踪功能是用于所有其他事件类型的功能。
您需要设置现有堆栈帧的本地跟踪功能,但设置全局跟踪功能并不能帮助您做到这一点。要设置现有框架的本地跟踪功能,您可以手动将框架对象的f_trace
属性分配给您想要的功能。例如,设置当前帧的本地跟踪功能:
import sys
sys._getframe().f_trace = whateverfunc
请注意,如果没有全局跟踪函数,则不会调用本地跟踪函数,因此您还需要设置全局跟踪函数。(这似乎没有记录。)
您可以结合sys.settrace
手动f_trace
分配来跟踪新的和现有的堆栈帧;例如,在一个'return'
事件中,您可以检查您将要返回的帧的本地跟踪功能,并将该跟踪功能设置为您想要的任何内容。bdb
调试器框架源代码是如何使用跟踪函数的一个很好的例子。
推荐阅读
- python - JSON在python中转换为字符串
- ios - UMPConsentStatusObtained 对用户消息传递平台 SDK 的同意意味着什么
- javascript - Puppeteer 是否让我的 NodeJS 进程退出?
- javascript - Redux hook useSelector 没有给出正确的状态
- race-condition - 一次运行一条指令的程序中是否可能出现竞争条件?
- c# - C# 检查字符串数组中是否包含任何字符串并获取值
- swift - 使用元数据将应用程序对象链接到磁盘上的文件
- amazon-web-services - AWS 用户管理上的 Kibana:创建了新用户,但看不到我的索引模式
- javascript - 异步 JavaScript 执行顺序?
- python-3.x - 创建新标签(ttk笔记本)时如何保留小部件?