CPython - печать трассировки - PullRequest
0 голосов
/ 03 июня 2019

Как я могу преобразовать объект трассировки в его строковое представление в CPython? Я пробовал это, но вывод не очень полезен.

    PyObject *type, *value, *traceback;
    PyErr_Fetch(&type, &value, &traceback);

    PyObject* strTrace = PyObject_Repr(traceback);
    pyStrTrace = PyUnicode_AsEncodedString(strTrace, "utf-8", "strict");
    Py_XDECREF(strTrace);
    const char* sTrace = PyBytes_AS_STRING(pyStrTrace);

Содержимое sTrace:

 <traceback object at 0x000002594A5CC598>

1 Ответ

0 голосов
/ 10 июня 2019

В одном комментарии предлагалось импортировать traceback модуль Python, который наверняка будет работать хорошо, но я предпочитаю решение только на C ++, поэтому я придумал этот фрагмент.Надеюсь, кто-то найдет это полезным.

if (PyTraceBack_Check(traceback))
{
    PyTracebackObject* traceRoot = (PyTracebackObject*)traceback;
    PyTracebackObject* pTrace = traceRoot;

    while (pTrace != NULL)
    {
        PyFrameObject* frame = pTrace->tb_frame;
        PyCodeObject* code = frame->f_code;

        int lineNr = PyFrame_GetLineNumber(frame);
        const char *sCodeName = PyUnicode_AsUTF8(code->co_name);
        const char *sFileName = PyUnicode_AsUTF8(code->co_filename);

        printf("at %s (%s:%d); ", sCodeName, sFileName, lineNr);
        pTrace = pTrace->tb_next;
    }        
}
...