如何将valgrind与Python C++扩展一起使用?

neu*_*ron 32 c++ python valgrind

我在C++类上实现了Python扩展.我没有运行valgrind的C++目标.我想用valgrind进行内存检查.

我可以在Python中使用valgrind吗?

Ste*_*der 43

是的,你可以使用valgrindPython.您只需要使用Python开发人员提供的valgrind抑制文件,因此您不会因Python的自定义内存分配/重新分配功能而获得大量误报.

valgrind抑制文件可以在这里找到:http://svn.python.org/projects/python/trunk/Misc/valgrind-python.supp

重要信息:您需要在抑制文件*中取消注释PyObject_Free和PyObject_Realloc的行.

推荐的用法语法是:

$ valgrind --tool=memcheck --suppressions=valgrind-python.supp \
                                          python -E -tt ./my_python_script.py
Run Code Online (Sandbox Code Playgroud)

另请参阅Python SVN repo中的这个README文件,该文件描述了使用Python和valgrind的不同方法:http: //svn.python.org/projects/python/trunk/Misc/README.valgrind

* - 或者,您可以在禁用PyMalloc的情况下重新编译Python,这样可以捕获更多内存泄漏,如果您只是抑制PyMalloc则不会显示这些泄漏.

  • 在我刚刚打开 python 解释器的快速测试中,我从:==9872== ERROR Summary: 793 errors from 75 contexts (suppressed: 15 from 10) to ==9920== ERROR summary: 31 errors from 23 contexts (suppressed) :来自 62 的 777)带有抑制文件(PyObject_Free 和 PyObject_Realloc 未注释)。我确实尝试过 python 配置标志,但它们似乎没有摆脱剩余的错误。 (3认同)
  • Python 2.7 看起来很顽皮。一个空脚本 (valgrind --leak-check=yes --suppressions=valgrind-python.supp python -tt -E "") 在 Fedora 16 上给出了“来自 315 个上下文的 315 个错误(抑制:2 个来自 2 个)”。 (2认同)
  • @Ling 你记得取消注释 `Misc/valgrind-python.supp` 中抑制 `PyObject_Free` 和 `PyObject_Realloc` 警告的行吗? (2认同)

Kam*_*iel 8

在Python 2.7和3.2中,现在有一个--with-valgrind编译时标志,允许Python解释器检测它何时在valgrind下运行并禁用PyMalloc.这应该允许你更准确地监视你的内存分配,因为PyMalloc只是在大块中分配内存.

  • 对不起,我应该更清楚了.它是一个编译时标志,它将配置Python以检测它何时在valgrind下运行.一些细节在这里:http://bugs.python.org/issue2422 (2认同)

Emp*_*ian 0

是的,你可以:你确实有一个运行 valgrind 的目标——它是 python 解释器本身:

valgrind python foo.py
Run Code Online (Sandbox Code Playgroud)

然而,上面的结果可能不是很令人满意——Python 是在 opt 模式下构建的,并且具有特殊的 malloc,这可能会让您陷入误报中。

首先构建 Python 的调试版本可能会获得更好的结果。从这里开始。