如何在Python ctypes库中查找泄漏

时间:2012-09-30 23:55:53

标签: python memory-management memory-leaks ctypes

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

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

在修复我已经找到的泄漏的过程中,我尝试了Heapyobjgraph,但两者都没有特别用于此目的。据我所知,它们都只显示在Python堆上分配的对象,因此它们对于查找由C库分配的堆空间处理不当引起的泄漏没有用处。我可以在Python中使用一个可以在C堆上显示分配的工具,最好还有哪些Python对象(如果有的话)引用分配的地址?

1 个答案:

答案 0 :(得分:4)

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

你肯定会从Python调用中得到误报。查看this site以获取有关如何使用抑制的详细说明,它允许您明确忽略某些类型的错误。另请参阅Python's premade list of suppressions (here),description of why they are needed (here)