2

因此,我整理了一些 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(控制台)。很高兴看到引用计数发生了什么变化,以及随着代码的进行它如何增加/减少。

4

1 回答 1

1

一个建议:在调试模式下编译 Python 解释器(--with-pydebug)。使用这个解释器来编译和测试你的扩展。解释器显示对象总数的计数,当您重复运行测试时,该总数不应增加。确保测试代码的所有可能退出路径 - 当发生异常时我忘记了 DECREF 对象。

于 2011-12-28T02:58:00.347 回答