12

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

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

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

4

1 回答 1

5

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

你肯定会从 Python 调用中得到误报。查看此站点以获取有关如何使用抑制的很好的描述,它允许您专门忽略某些类型的错误。另请参阅Python 的预制抑制列表(此处),以及为什么需要它们的描述(此处)

于 2012-10-01T01:34:02.077 回答