【发布时间】:2011-04-28 06:39:51
【问题描述】:
我在 C++ 类上实现了 Python 扩展。我没有用于运行 valgrind 的 C++ 目标。我想使用 valgrind 进行内存检查。
我可以在 Python 中使用 valgrind 吗?
【问题讨论】:
我在 C++ 类上实现了 Python 扩展。我没有用于运行 valgrind 的 C++ 目标。我想使用 valgrind 进行内存检查。
我可以在 Python 中使用 valgrind 吗?
【问题讨论】:
是的,你可以:你确实有一个运行 valgrind 的目标——它是 python 解释器本身:
valgrind python foo.py
但是,上面的结果可能不是很令人满意——Python 是在 opt 模式下构建的,并且带有一个特殊的 malloc,这可能会淹没你的误报。
首先构建 Python 的调试版本可能会获得更好的结果。开始here。
【讨论】:
是的,您可以在 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 文件,该文件描述了将 Python 与 valgrind 结合使用的不同方式: http://svn.python.org/projects/python/trunk/Misc/README.valgrind
* - 或者,您可以在禁用 PyMalloc 的情况下重新编译 Python,这样您就可以捕获更多的内存泄漏,如果您只是抑制 PyMalloc,这些泄漏不会出现。
【讨论】:
Misc/valgrind-python.supp 中抑制PyObject_Free 和PyObject_Realloc 警告的行吗?
在 Python 2.7 和 3.2 中,现在有一个 --with-valgrind 编译时标志,允许 Python 解释器检测它何时在 valgrind 下运行并禁用 PyMalloc。这应该可以让您比其他方式更准确地监控内存分配,因为 PyMalloc 只是大块分配内存。
【讨论】: