如何在Python ctypes库中查找泄漏

如何在Python ctypes库中查找泄漏,python,memory-management,memory-leaks,ctypes,Python,Memory Management,Memory Leaks,Ctypes,我正在开发一个Python应用程序,它使用了许多开源的第三方库。其中一个库基于ctypes,我最近发现其中有10多个独立的内存泄漏。这些泄漏的原因包括对具有显式析构函数的对象的循环引用(该析构函数)到使用c_char_p作为返回非常量字符数组的函数的返回类型(导致字符数组自动转换为Python字符串,而原始的c分配数组永远不会被释放) 我修复了发现的漏洞,并向库的作者提交了一个请求。我已经做了一些非常非正式的测试,在循环中创建和删除对象,并在测试过程中观察Python的内存使用情况,我想我已经找

我正在开发一个Python应用程序,它使用了许多开源的第三方库。其中一个库基于
ctypes
,我最近发现其中有10多个独立的内存泄漏。这些泄漏的原因包括对具有显式析构函数的对象的循环引用(该析构函数)到使用
c_char_p
作为返回非常量字符数组的函数的返回类型(导致字符数组自动转换为Python字符串,而原始的c分配数组永远不会被释放)

我修复了发现的漏洞,并向库的作者提交了一个请求。我已经做了一些非常非正式的测试,在循环中创建和删除对象,并在测试过程中观察Python的内存使用情况,我想我已经找到了所有的漏洞。然而,由于我计划在一个我想开源的应用程序中使用这个库,并且希望有其他一些人使用,所以我想更确定一点。因此,我的问题是:是否有一种系统的方法来查找基于
ctypes
的库中的内存泄漏?


在修复我已经发现的漏洞的过程中,我尝试过,但都没有特别有用。据我所知,它们都只显示在Python堆上分配的对象,因此在查找由C库分配的堆空间处理不当导致的泄漏时,它们毫无用处。在Python中是否有一个工具可以显示C堆上的分配,最好还有哪些Python对象(如果有的话)引用分配的地址?

您可以尝试在其下运行应用程序。Valgrind是分析编译应用程序中内存使用情况的有用工具。这将至少检测链接并报告其来源


您肯定会从Python调用中得到误报。查看有关如何使用抑制的详细说明,它允许您专门忽略某些类型的错误。另请参见和。

根据我(有限)的经验,Valgrind并不能真正处理通过python编写的代码。然而,一个更聪明的Valgrind用户可能会有更好的运气。Valgrind确实会将许多Python内部调用视为“泄漏”(尤其是dist和list实例化和复制)。然而,通过适当的抑制,我已经能够在Python代码调用的外部库中发现问题。Valgrind对我来说是短暂的,但我认为它会产生太多的误报而没有用处。然而,由于没有其他建议,似乎这可能是我最好的选择……米奇,到目前为止,运气如何?你最终找到了另一个解决方案吗?恐怕我还没有机会尝试。不过,我确实找到了这个抑制文件,一旦我开始尝试,它应该会有所帮助: