traceback from embedded python

S

Skink

hi,

I'm using boost::python for calling some python code and when the
exception is thrown I want to get type, value and traceback of it.

The problem is with traceback: I got only *one* frame (the first one)

// this always returns Py_None
tb_frame = PyObject_GetAttrString(tb_frame, "f_back");

What I'm doing wrong?

void
Deployer::showError() {
// PyErr_Print();

PyObject *exc_type, *exc_value, *exc_traceback, *pystring;

PyErr_Fetch(&exc_type, &exc_value, &exc_traceback);

// type works
pystring = PyObject_Str(exc_type);
char *type = QString(python::extract<char*>(pystring));
Py_XDECREF(pystring);

// value works
pystring = PyObject_Str(exc_value);
char *value = QString(python::extract<char*>(pystring));
Py_XDECREF(pystring);

// traceback does't work ;(
PyObject *tb_frame = PyObject_GetAttrString(exc_traceback, "tb_frame");
while (tb_frame != Py_None) {
PyObject *f_lineno = PyObject_GetAttrString(tb_frame, "f_lineno");
int lineno = python::extract<int>(f_lineno);
Py_XDECREF(f_lineno);

PyObject *f_code = PyObject_GetAttrString(tb_frame, "f_code");
PyObject *co_filename = PyObject_GetAttrString(f_code,
"co_filename");
char *filename = python::extract<char*>(co_filename);
Py_XDECREF(f_code);
Py_XDECREF(co_filename);

PyObject *tmp = tb_frame;
// PyObject_Print(tb_frame, stderr, Py_PRINT_RAW);
// fprintf(stderr, "\n");
tb_frame = PyObject_GetAttrString(tb_frame, "f_back");
// PyObject_Print(tb_frame, stderr, Py_PRINT_RAW);
// fprintf(stderr, "\n");
Py_XDECREF(tmp);
}

Py_XDECREF(exc_type);
Py_XDECREF(exc_value);
Py_XDECREF(exc_traceback);
}


thanks,
Skink
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,128
Latest member
ElwoodPhil
Top