所以我已经整理了一些Python C扩展,虽然他们各自的行为已经过验证,但我想通过一些refcount调试验证这一点。
如何验证我是否已正确插入INC / DEC refcounts?我想从黑盒的角度进行验证,也就是说,如果所有的refcounts都已正确完成,函数的输入/输出/内存应如何显示?
我的第一种方法是使用sys.getrefcount(obj)并检查所有输入/输出对象的refcounts以查看它们是否正常。其次,我也可以查看用于查看没有内存泄漏的内存。
但我之前从未真正做到这一点,那么最简单,最正确的做法是什么?
请注意: 我不想使用任何Cython风格的库,我宁愿自己做C实质,以了解基础知识。
解决方案:因此我建议启用一个启用调试的Python解释器。我认为这会很棘手,但事实并非如此。根据此recipe,我将这些确切的行添加到Objects/object.c
。之后我在下载的Python源目录中所做的就是:
./configure --with-pydebug --prefix=/usr/local/python/
make
make install
关于为这个新解释器构建C扩展,所有必须在此前面完成的工作是将include_dirs
中的setup.py
标记指向'/usr/local/python/include/python2.7'
到_Py_CountReferences(stderr);
,然后使用新的解释器运行build和install命令。完成后,我可以在c代码中添加{{1}}行,并将refcount转储到stderr(控制台)。很高兴看到什么改变了引用计数,以及随着代码的进展它如何递增/递减。
答案 0 :(得分:1)
一个建议:在调试模式下编译Python解释器(--with-pydebug)。使用此解释器来编译和测试您的扩展。解释器显示对象总数的计数,当您重复运行测试时,此总数不应增加。确保测试代码的所有可能的退出路径 - 我发现异常时忘记了DECREF对象。