【问题标题】:Valgrind memcheck keeps dying before it finishesValgrind memcheck 在完成之前一直死机
【发布时间】:2021-02-28 04:04:37
【问题描述】:

在运行 valgrind memcheck 时,它会不断死亡并终止进程,输出如下:

valgrind: m_oset.c:156 (elem_of_node): Assertion 'n->magic == OSET_MAGIC' failed.
valgrind: bad magic on node 0x1574B69EE0 = ffffdddd (expected 5b1f)
possible causes:
 - node metadata corrupted by overwriting end of element?

我将此解释为 valgrind 停止,因为其内部数据结构之一似乎由于断言失败而损坏。不过,我不明白为什么会发生这种情况。在我的环境中似乎有些可重复。每次运行的确切节点地址都不同,但总是大致相同的地址(另一次运行显示0x1573C405E0)。这是否表示 RAM 损坏、我的软件中存在内存损坏错误、valgrind 中的错误或其他原因?

如果有帮助,我正在运行以下命令:

valgrind --tool=memcheck --gen-suppressions=all --leak-check=full --show-leak-kinds=all --leak-resolution=med --track-origins=yes --vgdb=no [my_application]

我过去使用过 valgrind memcheck 没有遇到类似的问题,但我不确定这里发生了什么。

【问题讨论】:

  • 哪个 valgrind 版本?在哪个平台(处理器、操作系统)上?通常,在使用 memcheck 时,在此类断言失败之前,您应该会看到 valgrind 报告的一些(应用程序)错误。然后先修复这些错误。
  • 版本 3.13.0。 16 核 Intel 服务器上的 RedHat 7。之前打印的结果没有错误。但是,在挖掘输出后,我确实看到了另一个 valgrind 断言:valgrind: m_oset.c:726 (avl_remove): Assertion 't->root == n' failed.
  • 经过进一步挖掘,看起来 valgrind 的崩溃问题与在我的代码中添加一些 valgrind 宏有关,即VALGRIND_DO_LEAK_CHECKVALGRIND_DO_CHANGED_LEAK_CHECK。 Valgrind 只会在打完其中一个电话后立即死亡。
  • 3.13 现在已经 3 年多了。我建议获取最新的官方版本(3.16.1),并编译它。构建 valgrind 非常容易/几乎没有依赖关系。此外,最好有一个尽可能小的复制器。例如。如果你的问题与 valgrind 宏有关,也许你会用一个我们可以查看的几行非常小的程序来重现这个问题。
  • 在这一点上,我认为我可以通过显着间隔 valgrind 宏调用来查看更改来从 valgrind 获得我需要的东西,因为我知道它会在第二次调用后崩溃。不幸的是,更改我目前正在使用的开发工具并不简单,因此必须这样做。如果我有机会升级,我会这样做,看看它是否仍然会发生。我最初的假设是这是用户错误或硬件问题,而不是 valgrind 错误,但也许它是/至少对于我正在使用的版本。感谢您的建议。

标签: valgrind


【解决方案1】:

根据我最初问题的第 5 条评论,这似乎与 valgrind 宏有关,并且至少可以通过间隔宏调用以在崩溃前提供更多处理时间来解决。迁移到较新的版本也可能会有所帮助,但目前尚不清楚,而且对我来说不是一个选择。

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多