16

我正在尝试调试我用 C 编写的 python 扩展模块。我使用以下代码对其进行了编译:

python setup.py build -g install --user

然后我调试:

gdb python
...
b py_node_make
run test.py

它在 py_node_make (我定义的函数之一)处中断,但随后我尝试:

(gdb) print node
No symbol "node" in current context.

我要调试的功能是:

static Python_node_t* py_node_make(
        node_t* node)
{
    Python_node_t* pyNode;

    pyNode = PyObject_New(Python_node_t, &t_node);
    pyNode->node = node;
    pyNode->borrowed = true;

    return pyNode;
}
4

2 回答 2

19

要进行源代码调试,您的 C 扩展必须使用调试信息 ( gcc -g) 构建。由于您正在使用 驱动编译过程distutils,因此您可以通过CFLAGS环境变量指定使用的编译器标志(安装 Python 模块:调整编译器/链接器标志):

CFLAGS='-Wall -O0 -g' python setup.py build

请注意,即使 distutils 默认使用比-O0更高的优化级别,只要传递了-g并且大多数 Python 构建默认传递-g,您就真的不应该在当前上下文中得到No symbol "node"错误。

于 2013-03-09T00:05:47.720 回答
3

问题是优化。我不确定如何从命令行执行此操作,但在 setup.py 脚本中,我刚刚添加extra_compile_args=['-O0'],到 Extension 构造函数中,一切正常。

仍然希望(并且会接受)一个涉及命令行 arg(之后的东西)的答案,python setup.py build它会完成同样的事情,所以我不必在 setup.py 文件中有编译器特定的行。

于 2013-03-06T18:02:15.887 回答