获取帧堆栈的内容

时间:2016-01-02 00:18:06

标签: python-3.x stack python-c-extension stackframe

我正在解析一些Python字节码,以获取表达式所赋予的变量的名称。我认为如果我能读取Python框架的堆栈内容,这会更容易。

我已尝试使用此C扩展程序,但我始终得到ValueError: no value stack,因此PyFrameObject::f_stackop始终为NULL

static PyObject*
_get_frame_valuestack(PyObject* self, PyObject* args)
{
  PyFrameObject* frame;
  if (!PyArg_ParseTuple(args, "O", &frame)) {
    return NULL;
  }

  if (((PyObject*) frame)->ob_type != &PyFrame_Type) {
    PyErr_SetString(PyExc_TypeError, "expected frame object");
    return NULL;
  }

  if (frame->f_valuestack == NULL || frame->f_stacktop == NULL) {
    PyErr_SetString(PyExc_ValueError, "no value stack");
    return NULL;
  }

  PyObject* list = PyList_New(0);
  PyObject** p;
  for (p = frame->f_valuestack; p < frame->f_stacktop; ++p) {
    PyList_Append(list, *p);
  }
  return list;
}

这是一个测试片段。

def foo():
  print(_utils.get_frame_valuestack(sys._getframe(1)))
  return 40

var = 2 + foo()

我希望在[2]中打印foo()之类的内容。实际结果可能会有所不同,具体取决于其实际执行情况。

显然f_valuestack不是我真正想要的。有没有办法可以检索框架堆栈的内容?

0 个答案:

没有答案