【问题标题】:How to make valgrind ignore certain line?如何让 valgrind 忽略某些行?
【发布时间】:2018-03-10 23:29:57
【问题描述】:

例如

==26460== 2 bytes in 1 blocks are still reachable in loss record 2 of 105
==26460==    at 0x4C28BE3: malloc (vg_replace_malloc.c:299)
==26460==    by 0x580D889: strdup (in /usr/lib64/libc-2.17.so)
==26460==    by 0x4F50AF: init (init.c:468)
==26460==    by 0x406D75: main (main.c:825)

我不想检查 init.c:468:mode = strdup,我敢肯定这只 malloc 一次,并且将持续整个进程生命。

是否可以让 valgrind 不检查这一行?

【问题讨论】:

  • 为什么要操纵valgrind的输出?我不会关心“可能”。我建议不要。要么解决任何 valgrind 抱怨的问题,要么接受它抱怨某事的事实。

标签: c valgrind


【解决方案1】:

正如我在评论中所说:我建议不要这样做。

但 Valgrind 确实具有抑制警告的功能。 专门用于该目的的功能支持抑制特定消息的最便捷方式:

--gen-suppressions=yes

这显然会为每个/任何生成的消息输出精确的抑制语法。

请参阅常见问题解答中的 5.1:
http://valgrind.org/docs/manual/faq.html#faq.writesupp

(我喜欢他们的风格:
“F:你能为我写……吗?”我期望一个完全足够的
“A:没有。”但他们实际上回答了
“答:是的……”。太酷了。)

【讨论】:

    【解决方案2】:

    您应该修复漏洞;这样做要好得多。

    您无法停止 Valgrind 检查泄漏,但您可以通过抑制泄漏来阻止它报告泄漏。

    用途:

    valgrind --gen-suppressions=yes --leak-check=all -- tested-program …
    

    然后您可以将抑制保存在一个文件中,例如 tp.suppressions,然后您可以使用:

    valgrind --suppressions=tp.suppressions -- tested-program …
    

    如果您像我一样在 Mac 上工作,并且使用最先进的系统,您通常会发现有必要抑制系统启动代码的泄漏——在调用 main() 之前分配的内存,因此您不能控制。

    OTOH,在 macOS 新版本发布后,Valgrind 需要一段时间才能再次运行,这是常规操作。我升级到 macOS High Sierra 10.13;由于内核无法识别,Valgrind 再次停止工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2019-10-29
      相关资源
      最近更新 更多