如何在Python C++扩展中使用valgrind?
我有一些用C++类实现的Python扩展。可是我没有C++的目标可以用valgrind来运行。我想用valgrind来检查内存。
我可以在Python中使用valgrind吗?
3 个回答
当然可以:你可以用 valgrind 来检查的对象就是 Python 解释器本身:
valgrind python foo.py
不过,上面的结果可能不太理想——因为 Python 是用优化模式构建的,并且使用了一种特殊的内存分配方式,这可能会让你看到很多错误的警告。
如果你先构建一个调试版本的 Python,结果可能会更好。你可以从 这里 开始。
在Python 2.7和3.2版本中,现在有一个叫做--with-valgrind
的编译选项。这个选项可以让Python解释器在使用valgrind工具时进行检测,并关闭PyMalloc功能。这样做的好处是,你可以更准确地监控内存的使用情况,因为PyMalloc通常是一次性分配一大块内存。
是的,你可以在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库的README文件,里面描述了使用valgrind与Python的不同方法:http://svn.python.org/projects/python/trunk/Misc/README.valgrind
* - 另外,你也可以重新编译Python,禁用PyMalloc,这样可以捕捉到更多的内存泄漏,而这些在仅仅抑制PyMalloc时是无法发现的。