使用python-c-api时调试PyObject泄漏

时间:2018-09-23 00:25:56

标签: python c memory-leaks python-c-api

我刚刚开始使用python-c-api,并且确定我会在某个时候搞砸PyObject引用计数。因此,我试图找出什么是识别内存泄漏然后对其进行跟踪的良好工作流程。

四处浏览头文件,我看到了对Py_DEBUG,Py_REF_DEBUG甚至Py_TRACE_REFS的引用。但是我不确定如何使用它们,还没有找到关于它们使用的很好的教程。

使用python-c-api时人们如何调试pyobject泄漏?
例如,我可以使用这些调试定义进行设置,以便如果我在调用Py_Finalize()之前尝试释放所有内容,那么我可以看到哪些python对象仍然存在,它们是什么,甚至它们在哪里被分配了? >

1 个答案:

答案 0 :(得分:0)

我没有足够的声誉来发表评论,因此添加为答案。

  

人们在使用python-c-api时如何调试pyobject泄漏?

一旦Python出现,使用Valgrind这样的常规工具很难做到这一点。

也不建议调用Py_Finalize(),因为已知它存在内存泄漏。仅在绝对需要时,即在析构函数中销毁对象或退出过程时,才在过程开始时调用Py_Initialize()并调用Py_Finalize()更为简单。

引用:https://bugs.python.org/issue1445210

关于内存泄漏,您必须了解新的,被盗的和借用的引用,并仔细阅读要调用的每个函数的文档,以了解将返回哪种类型的引用。

如果您使用的是C ++而不是C,那么最好使用PyCXX或boost :: python或其他使用RAII来处理refcounting的C ++包装器。

希望这会有所帮助。