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

41 投票
3 回答
17514 浏览
提问于 2025-04-16 05:49

我有一些用C++类实现的Python扩展。可是我没有C++的目标可以用valgrind来运行。我想用valgrind来检查内存。

我可以在Python中使用valgrind吗?

3 个回答

0

当然可以:你可以用 valgrind 来检查的对象就是 Python 解释器本身:

valgrind python foo.py

不过,上面的结果可能不太理想——因为 Python 是用优化模式构建的,并且使用了一种特殊的内存分配方式,这可能会让你看到很多错误的警告。

如果你先构建一个调试版本的 Python,结果可能会更好。你可以从 这里 开始。

9

在Python 2.7和3.2版本中,现在有一个叫做--with-valgrind的编译选项。这个选项可以让Python解释器在使用valgrind工具时进行检测,并关闭PyMalloc功能。这样做的好处是,你可以更准确地监控内存的使用情况,因为PyMalloc通常是一次性分配一大块内存。

53

是的,你可以在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时是无法发现的。

撰写回答