python - 通过 sys.set_trace 访问 Python 解释器的数据栈
问题描述
我正在使用sys.set_trace(..)
对 python 代码执行字节码分析。
更具体地说,我设置了一个跟踪函数,每次执行字节码时都会触发。
对于我的分析,我需要获取带有操作码的字节码"STORE_ATTR"
将在其上存储值的对象。
例如我有这个字节码:
Instruction(opname='STORE_ATTR', opcode=95, arg=9, argval='pos', argrepr='pos', offset=188, starts_line=None, is_jump_target=False)
看到这一点后,解释器将尝试从数据堆栈中弹出顶部元素,以便在其中存储一个值。我也有办法访问该对象吗?是否有一个类似于TOP()函数的 API,我可以从跟踪器中调用它并获取当前正在执行的帧的堆栈的顶部值?
解决方案
不幸的是,此类信息无法通过 Python 访问,但您可以使用 C API 进行访问。这里的另一个问题是,这高度依赖于您拥有的 Python 版本。以下适用于Python 3.8.5
,但稍作修改也适用于其他版本。
等价物PyEval_SetTrace
可以访问类的f_stacktop
字段PyFrameObject
。该字段由TOP()
at使用ceval.c
。
您还可以在此处验证f_stacktop
没有暴露给 Pythonframe
类。
在这里,您可以看到一个可以访问当前帧的 TOS 的代码示例:
int tracefunc(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg) {
[...]
PyObject **stack_pointer = frame->f_stacktop;
PyObject *tos = stack_pointer[-1];
[...]
}
推荐阅读
- c# - 我应该为我的桌面应用程序使用 Chromium Embedded Framework 还是 .net?
- java - Spring @Transaction 和 @Async 用于数据库操作
- c - 隐藏赋值的C宏技巧?
- bash - 如何逐行比较两个文件并在不同时输出整行
- java - 为什么我不能像行一样简单地获得一维数组?
- java - 如何在 Wiremock Servlet 上启用响应模板?
- php - 在 codeigniter 中的多个表中插入数据时出错
- python - 运行 .py 文件和直接与 Python 交互的时区差异
- java - 如何使java小程序自动全屏?(蚀)
- ios - 我可以在 Swift Playground 中加载 Alex Voice