【问题标题】:How can I use valgrind with Python C++ extensions?如何将 valgrind 与 Python C++ 扩展一起使用?
【发布时间】:2011-04-28 06:39:51
【问题描述】:

我在 C++ 类上实现了 Python 扩展。我没有用于运行 valgrind 的 C++ 目标。我想使用 valgrind 进行内存检查。

我可以在 Python 中使用 valgrind 吗?

【问题讨论】:

    标签: c++ python valgrind


    【解决方案1】:

    是的,你可以:你确实有一个运行 valgrind 的目标——它是 python 解释器本身:

    valgrind python foo.py
    

    但是,上面的结果可能不是很令人满意——Python 是在 opt 模式下构建的,并且带有一个特殊的 malloc,这可能会淹没你的误报。

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

    【讨论】:

      【解决方案2】:

      是的,您可以在 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,这些泄漏不会出现。

      【讨论】:

      • Python 2.7 看起来很调皮。一个空脚本(valgrind --leak-check=yes --suppressions=valgrind-python.supp python -tt -E "")在 Fedora 16 上给出“来自 315 个上下文的 315 个错误(抑制:2 个来自 2)”。跨度>
      • @Ling 你记得取消注释Misc/valgrind-python.supp 中抑制PyObject_FreePyObject_Realloc 警告的行吗?
      • 我做到了。这就是我感到惊讶的原因。
      • 在我刚刚打开 python 解释器的快速测试中,我从:==9872== 错误摘要:75 个上下文中的 793 个错误(抑制:10 个中的 15 个)到 ==9920== 错误摘要:来自 23 个上下文的 31 个错误(已抑制:来自 62 个的 777 个)与抑制文件(PyObject_Free 和 PyObject_Realloc 未注释)。我确实尝试了 python 配置标志,但它们似乎并没有摆脱剩余的错误。
      【解决方案3】:

      在 Python 2.7 和 3.2 中,现在有一个 --with-valgrind 编译时标志,允许 Python 解释器检测它何时在 valgrind 下运行并禁用 PyMalloc。这应该可以让您比其他方式更准确地监控内存分配,因为 PyMalloc 只是大块分配内存。

      【讨论】:

      • 这是你运行python还是编译python的时候?我正在运行 2.7.1,不能只执行 'valgrind python --with-valgrind myscript.py'
      • 对不起,我应该更清楚。这是一个编译时标志,它将配置 Python 以检测它何时在 valgrind 下运行。一些细节在这里:bugs.python.org/issue2422
      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多