如何使valgrind忽略某一行?

时间:2017-09-29 05:37:05

标签: c valgrind

例如

==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不检查这一行?

2 个答案:

答案 0 :(得分:3)

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

但是Valgrind确实有一个抑制警告的功能。 专门用于此目的的功能支持最简便的抑制特定消息的方法:

--gen-suppressions=yes

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

见FAQ中的5.1:
http://valgrind.org/docs/manual/faq.html#faq.writesupp

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

答案 1 :(得分:1)

你应该修复泄漏;这样做要好得多。

你不能阻止Valgrind检查泄漏,但你可以通过抑制泄漏来阻止它报告它们。

使用:

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

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

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

如果您像我一样在Mac上工作,并使用前沿系统,您通常会发现有必要抑制系统启动代码泄漏 - 在{{1}之前分配的内存被调用,因此你无法控制。

OTOH,在新版本的macOS发布后,需要一段时间才能让Valgrind再次运行。我升级到macOS High Sierra 10.13; Valgrind再次停止工作,因为内核无法识别。