dprintf в Cpython - PullRequest
       10

dprintf в Cpython

0 голосов
/ 13 января 2019

Я хочу проверить журнал, напечатанный dprintf в Cpython, например этот , но здесь есть только один параметр для dprintf, как проверить эти журналы? Большое спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Если у вас есть выпущенная версия Python, dprintf s удаляются, и эти операторы не регистрируют. Невозможно увидеть выходные данные из них.

dprintf - это макрос, который фактически определен только в thread.c. Определение

#ifdef Py_DEBUG
static int thread_debug = 0;
#define dprintf(args)   (void)((thread_debug & 1) && printf args)
#define d2printf(args)  ((thread_debug & 8) && printf args)
#else
#define dprintf(args)
#define d2printf(args)
#endif

т.е.. если установлено Py_DEBUG и thread_debug & 1, то журнал печатается с использованием printf для стандартного вывода. Для этого вам понадобится отладочная сборка Python. Если у вас есть отладочная сборка, значением thread_debug можно управлять с помощью переменной окружения PYTHONTHREADDEBUG:

void
PyThread_init_thread(void)
{
#ifdef Py_DEBUG
    char *p = Py_GETENV("PYTHONTHREADDEBUG");

    if (p) {
        if (*p)
            thread_debug = atoi(p);
        else
            thread_debug = 1;
    }
#endif /* Py_DEBUG */
    if (initialized)
        return;
    initialized = 1;
    dprintf(("PyThread_init_thread called\n"));
    PyThread__init_thread();
}

т.е. переменная должна присутствовать для переменной, установленной на значение 1, и если она установлена, например, на 9, это включит как dprintf, так и d2printf.

0 голосов
/ 13 января 2019

Я думаю, вам нужно перекомпилировать Python, чтобы увидеть их. При настройке укажите опцию --with-pydebug. Это должно выйти на стандартном выходе. Вам также может потребоваться установить переменную окружения PYTHONTHREADDEBUG в 1, но это не обязательно.

https://docs.python.org/3/using/cmdline.html#debug-mode-variables

...