gpt4 book ai didi

python - 如何以最简单的方式调试 Python C 扩展中的引用计数?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:35 26 4
gpt4 key购买 nike

所以我整理了一些 Python C 扩展,虽然它们各自的行为都得到了验证,但我想通过一些引用计数调试来验证这一点。

如何验证我是否正确插入了 INC/DEC 引用计数?我想从黑盒的角度来做这个验证,也就是说,如果所有的引用计数都正确完成,函数的输入/输出/内存应该是什么样子?

我的第一个方法是使用 sys.getrefcount(obj) 并检查所有输入/输出对象的引用计数以查看它们是否正常。其次,我也许还可以检查使用的内存,看看没有内存泄漏。

但我以前从未真正这样做过,那么最简单、最正确的方法是什么?

请注意:我不想使用任何 Cython 风格的库,我宁愿自己做一些 C 细节来学习基础知识。

解决方案: 因此,我按照建议构建了一个启用调试的 Python 解释器。我以为这会很棘手,但事实并非如此。根据这个recipe我将这些确切的行添加到 Objects/object.c .之后,我在下载的 Python 源目录中要做的就是:

./configure --with-pydebug --prefix=/usr/local/python/
make
make install

关于为这个新的解释器构建 C 扩展,在这方面要做的就是指向 include_dirssetup.py 中扩展中的标记至 '/usr/local/python/include/python2.7' ,然后使用新解释器运行构建和安装命令。完成后,我可以添加,只需添加 _Py_CountReferences(stderr); c 代码中的行和引用计数将转储到 stderr(控制台)。很高兴看到什么改变了引用计数,以及它如何随着代码的进行而增加/减少。

最佳答案

一个建议:在 Debug模式下编译 Python 解释器 (--with-pydebug)。使用此解释器编译和测试您的扩展。解释器显示对象总数,并且这个总数不应随着您重复运行测试而增加。确保测试代码的所有可能退出路径 - 我忘记在发生异常时删除对象。

关于python - 如何以最简单的方式调试 Python C 扩展中的引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8650972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com