gpt4 book ai didi

python - 如何查找 Python ctypes 库中的泄漏

转载 作者:太空狗 更新时间:2023-10-29 18:08:47 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

您肯定会从 Python 调用中得到误报。查看this site有关如何使用抑制的很好的描述,它允许您专门忽略某些类型的错误。另见 Python's premade list of suppressions (here),和一个 description of why they are needed (here) .

关于python - 如何查找 Python ctypes 库中的泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com