CPython中的dprintf

时间:2019-01-13 18:34:35

标签: python c cpython

我想检查dprintf在Cpython中打印的日志,例如this one,但是这里dprintf只有一个参数,如何检查那些日志?非常感谢你的帮助。

2 个答案:

答案 0 :(得分:3)

如果您拥有Python的发行版,则将dprintf剥离,并且这些语句不会记录日志。无法看到它们的输出。

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的调试版本。如果您具有调试版本,则可以使用环境变量PYTHONTHREADDEBUG控制thread_debug的值:

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,则将同时启用dprintfd2printf

答案 1 :(得分:1)

我认为您需要重新编译Python才能看到这些内容。配置时,请提供--with-pydebug选项。它应该标准输出。您可能还需要将环境变量PYTHONTHREADDEBUG设置为1,但这不是必需的。

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