Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以最简单的方式调试Python C扩展中的refcounts?_Python_C_Debugging_Refcounting - Fatal编程技术网

如何以最简单的方式调试Python C扩展中的refcounts?

如何以最简单的方式调试Python C扩展中的refcounts?,python,c,debugging,refcounting,Python,C,Debugging,Refcounting,因此,我收集了一些PythonC扩展,虽然它们各自的行为都得到了验证,但我想通过一些refcount调试来验证这一点 如何验证已正确插入INC/DEC参考计数?我想从黑盒的角度进行验证,也就是说,如果所有引用计数都正确完成,函数的输入/输出/内存应该是什么样子 我的第一种方法是使用sys.getrefcount(obj)并检查所有输入/输出对象的refcount是否正常。第二,我也可以检查一下内存,看看是否有内存泄漏 但是我以前从来没有这样做过,那么最简单最正确的方法是什么呢 请注意: 我不想使

因此,我收集了一些PythonC扩展,虽然它们各自的行为都得到了验证,但我想通过一些refcount调试来验证这一点

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

我的第一种方法是使用sys.getrefcount(obj)并检查所有输入/输出对象的refcount是否正常。第二,我也可以检查一下内存,看看是否有内存泄漏

但是我以前从来没有这样做过,那么最简单最正确的方法是什么呢

请注意: 我不想使用任何Cython风格的库,我宁愿自己动手学习基础知识

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

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

关于为这个新的解释器构建C扩展,前面需要做的就是将
setup.py
中扩展中的
include\u dirs
标记指向
'/usr/local/python/include/python2.7'
,然后使用新的解释器运行build-and-install命令。完成后,我可以添加
\u Py\u CountReferences(stderr)行和refcount将转储到stderr(控制台)。很高兴看到什么改变了refcount,以及它如何随着代码的进行而递增/递减

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

我在一些博客文章中读到了这一点。我想也许我不用编译解释器就可以做到。但是如果它告诉了我我需要知道的一切,我想这是最好的方法。我可以为此设置一个virtualenv,对吗?我没有任何使用virtualenv的经验。快速浏览文档意味着virtualenv为同一版本的Python创建了不同的环境。在本例中,您将编译一个稍微不同的Python版本。我不知道virtualenv是否能帮上忙。好吧,所以我设法构建了Python的调试版本,我的C扩展链接并编译了它。但是现在怎么办,我如何获取这些信息呢?我试图从示例(取自Python烹饪书)中获得可工作的_Py_CountReferences,但它不起作用。当我尝试插入
COUNTREFS()时,编译器会抱怨行。通过快速阅读链接,它似乎希望您修改Python本身的源代码,然后定义创建COUNTREFS()的宏。我还没试过。我通常会验证所有返回对象的refcount是否正确,并且在重复测试时,总refcount不会增加。总引用计数可以作为sys.gettotalrefcount()进行访问(从调试生成)。是的,我跳过了旧的recepie,只是使用了gettotalrefcount()。在哪里可以找到其他使用Python调试模式的sys方法的信息?多谢!