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

+0

我相信麻烦的是该功能被完全优化了。我知道-g标志被设置,因为其他函数在这里和那里有很多信息,只是不是py_node_make。 – CrazyCasta 2013-03-09 05:41:53

+0

我明白了。 py_node_make()是一个小的静态函数,也是嵌入的主要目标。在其上设置断点仍然有效,但参数名称** node **丢失。 – scottt 2013-03-09 09:24:20

问题是优化。我不知道如何从命令行执行它,但在setup.py脚本中,我只是将extra_compile_args=['-O0'],添加到Extension构造函数,并且一切正常。

仍然会喜欢(也会接受)一个涉及命令行参数(在python setup.py build之后)的答案,它可以完成同样的任务,所以我不必在setup.py文件中具有编译器特定的行。