我在C ++类上实现了Python扩展。我没有运行valgrind的C ++目标。我想用valgrind进行内存检查。
我可以在Python中使用valgrind吗?
答案 0 :(得分:42)
是的,您可以在Python中使用valgrind
。您只需要使用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
另请参阅Python SVN repo中的这个README文件,该文件描述了使用Python和valgrind的不同方法: http://svn.python.org/projects/python/trunk/Misc/README.valgrind
* - 或者,您可以在禁用PyMalloc的情况下重新编译Python,这样可以捕获更多内存泄漏,如果您只是抑制PyMalloc则不会显示这些泄漏。
答案 1 :(得分:8)
在Python 2.7和3.2中,现在有一个--with-valgrind
编译时标志,允许Python解释器检测它何时在valgrind下运行并禁用PyMalloc。这应该可以让你更准确地监视你的内存分配,因为PyMalloc只是以大块的形式分配内存。
答案 2 :(得分:0)
是的,你可以:你做有一个目标来运行valgrind - 它是python解释器本身:
valgrind python foo.py
然而,上面的结果可能不是很令人满意 - Python是以opt模式构建的,并且带有一个特殊的malloc,它可能会让你误入歧途。
首先构建Python的调试版本,您可能会获得更好的结果。开始here。