Python扩展调试
问题描述:
我试图调试用于Python的扩展模块,我在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;
}
答
要使源代码调试工作,必须使用调试信息(gcc -g
)构建您的C扩展。既然你开车的编译过程与distutils
,您可以指定通过CFLAGS使用环境变量(Installing Python Modules: Tweaking compiler/linker flags)编译器标志:
CFLAGS='-Wall -O0 -g' python setup.py build
请注意,即使distutils的默认更高的优化级别比- O0,你真的不应该得到那当前上下文中没有符号“节点”错误只要-g被传递并且大多数Python编译默认通过-g。
答
问题是优化。我不知道如何从命令行执行它,但在setup.py脚本中,我只是将extra_compile_args=['-O0'],
添加到Extension构造函数,并且一切正常。
仍然会喜欢(也会接受)一个涉及命令行参数(在python setup.py build
之后)的答案,它可以完成同样的任务,所以我不必在setup.py文件中具有编译器特定的行。
我相信麻烦的是该功能被完全优化了。我知道-g标志被设置,因为其他函数在这里和那里有很多信息,只是不是py_node_make。 – CrazyCasta 2013-03-09 05:41:53
我明白了。 py_node_make()是一个小的静态函数,也是嵌入的主要目标。在其上设置断点仍然有效,但参数名称** node **丢失。 – scottt 2013-03-09 09:24:20