因此,我整理了一些 Python C 扩展,虽然它们各自的行为已经过验证,但我想通过一些 refcount 调试来验证这一点。
如何验证我是否正确插入了 INC/DEC 引用计数?我想从黑盒的角度来做这个验证,也就是说,如果所有的引用计数都正确完成,函数的输入/输出/内存应该如何?
我的第一种方法是使用 sys.getrefcount(obj) 并检查所有输入/输出对象的引用计数以查看它们是否正常。其次,我也许还可以检查用于查看没有内存泄漏的内存。
但是我以前从未真正这样做过,那么最简单,最正确的方法是什么?
请注意: 我不想使用任何 Cython 样式库,我宁愿自己做 C nitty gritty 来学习基础知识。
解决方案:所以按照建议,我构建了一个启用调试的 Python 解释器。我以为这会很棘手,但事实并非如此。根据这个食谱,我将这些确切的行添加到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'
,然后使用新解释器运行构建和安装命令。完成后,我只需在 c 代码中添加_Py_CountReferences(stderr);
行,引用计数将转储到 stderr(控制台)。很高兴看到引用计数发生了什么变化,以及随着代码的进行它如何增加/减少。