2010-10-20 22 views

回答

1

是的,你可以:你有一个目标与运行Valgrind的 - 这是Python解释器本身:

valgrind python foo.py 

然而,上述结果可能不会很理想 - Python是建在选择模式和特殊的malloc,这可能会淹没你的误报。

通过首先构建Python的调试版本,您可能会获得更好的结果。开始here

+0

您能否更新该链接? – 2014-02-06 16:24:03

39

是的,你可以在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回购其描述使用Python用Valgrind的方式的不同,此README文件: http://svn.python.org/projects/python/trunk/Misc/README.valgrind

* - 或者,你可以用禁用PyMalloc来重新编译Python,这样可以捕获更多的内存泄漏,如果你只是禁止PyMalloc,就会显示出来。

+1

Python 2.7看起来很淘气。一个空脚本(valgrind --leak-check = yes --suppressions = valgrind-python.supp python -tt -E“”) 在Fedora 16上给出了“来自315个上下文的315个错误(压制:2个)”。 – Ling 2012-03-12 21:44:37

+1

@Ling您是否记得取消注释'Misc/valgrind-python.supp'中的行,以阻止“PyObject_Free”和“PyObject_Realloc”的警告? – 2012-03-12 21:46:49

+0

我做到了。这就是我感到惊讶的原因。 – Ling 2012-03-13 01:45:04

8

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

+0

这是当你运行python或当你编译python?我正在运行2.7.1,不能只是'valgrind python --with-valgrind myscript.py' – oob 2011-11-27 19:16:56

+2

对不起,我应该已经更清楚了。这是一个编译时标志,它将配置Python来检测它在valgrind下运行的时间。一些细节在这里:http://bugs.python.org/issue2422 – 2011-11-27 20:19:36