如何在Python C++扩展中使用valgrind?

41

我有在C++类上实现的Python扩展。我没有可用于运行valgrind的C++目标文件。我希望使用valgrind进行内存检查。

我能否在Python中使用valgrind?

3个回答

53

是的,你可以使用valgrind来检查Python程序。你只需要使用Python开发人员提供的valgrind suppression文件,这样就不会因为Python的自定义内存分配/重新分配函数而出现大量的误报。

可以在这里找到valgrind suppression文件: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

另外,您还可以重新编译禁用PyMalloc的Python,这样可以捕获更多的内存泄漏,如果只是抑制PyMalloc,则无法发现这些泄漏。

请参阅 Python SVN 存储库中的此自述文件,其中描述了使用 valgrind 的不同方式:http://svn.python.org/projects/python/trunk/Misc/README.valgrind


3
Python 2.7看起来很淘气。在Fedora 16上,一个空脚本(valgrind --leak-check=yes --suppressions=valgrind-python.supp python -tt -E "")会给出“315个错误来自315个上下文(被压制的:2个来自2个)”。 - Ling
2
@Ling 你记得取消注释 Misc/valgrind-python.supp 中抑制 PyObject_FreePyObject_Realloc 警告的行吗? - Steven T. Snyder
1
我做了。这就是我为什么感到惊讶的原因。 - Ling
3
在我进行快速测试时只是打开Python解释器,我从最初的错误总结为“==9872== ERROR SUMMARY: 793 errors from 75 contexts (suppressed: 15 from 10)”到使用抑制文件(取消注释PyObject_Free和PyObject_Realloc)后的“==9920== ERROR SUMMARY: 31 errors from 23 contexts (suppressed: 777 from 62)”。我确实尝试了Python配置标志,但它们似乎不能消除剩余的错误。 - amos

9
在Python 2.7和3.2中,现在有一个名为--with-valgrind的编译时标志,使Python解释器可以检测到它在valgrind下运行并禁用PyMalloc。这应该允许您比其他方式更准确地监视内存分配情况,因为PyMalloc只是在大块内存中分配内存。

这是在运行Python还是编译Python时进行的操作?我正在运行2.7.1版本,但无法执行“valgrind python --with-valgrind myscript.py”。 - oob
2
抱歉,我应该表达得更清楚些。这是一个编译时标志,它将配置 Python 检测它是否在 valgrind 下运行。有关详细信息,请参见此处:http://bugs.python.org/issue2422。 - Kamil Kisiel

0

是的,你可以:你确实有一个目标来运行valgrind -- 它就是Python解释器本身:

valgrind python foo.py

然而,上述结果可能并不是非常令人满意——Python是在优化模式下构建的,并且使用了特殊的malloc,这可能会让您陷入错误的正面情况。
通过首先构建Python的调试版本,您很可能会获得更好的结果。从这里开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接