修复Valgrind错误内存泄漏的错误

时间:2017-07-22 20:32:17

标签: c++ ubuntu memory-leaks valgrind

我刚刚在我的Windows计算机上安装了Ubuntu(终端)。此外,当提前并安装Valgrind,“sudo apt install Valgrind”时,为了测试一切,我继续创建一个c ++ hello world程序。然后用Valgrind测试它。 Valgrind说我有“一块72,704字节”。进一步的研究,我表示这是Valgrind的一个bug,它带有c ++标准库函数,可能是iostream。我的问题是如何修复此错误。我不能忽视,因为如果我正在研究程序,我需要能够准确地测量它的来源。如果任何人都可以为外行人的问题提供一步一步的解决方案来解决这个问题,那将是非常宝贵的。 这是我的代码和错误:

#include <iostream>
using std::cout; using std::endl;

int main() {
        cout << "Hello World" << endl;
}

==195== Memcheck, a memory error detector
==195== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==195== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==195== Command: ./helloworld
==195==
Hello World
==195==
==195== HEAP SUMMARY:
==195==     in use at exit: 72,704 bytes in 1 blocks
==195==   total heap usage: 2 allocs, 1 frees, 76,800 bytes allocated
==195==
==195== LEAK SUMMARY:
==195==    definitely lost: 0 bytes in 0 blocks
==195==    indirectly lost: 0 bytes in 0 blocks
==195==      possibly lost: 0 bytes in 0 blocks
==195==    still reachable: 72,704 bytes in 1 blocks
==195==         suppressed: 0 bytes in 0 blocks
==195== Rerun with --leak-check=full to see details of leaked memory
==195==
==195== For counts of detected and suppressed errors, rerun with: -v
==195== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

更新: 似乎我可以通过创建抑制文件来处理误报泄漏。但是,我并不像那里的一些人知道如何做到那样精通技术。我如何在Valgrind上创建抑制文件(特别是针对我的情况)?请以LAYMAN的条款解释,请尽可能详细。 第二次更新: 我已经半成功地抑制了内存泄漏,但我想知道是否有更可行的长期解决方案。

1 个答案:

答案 0 :(得分:1)

我想说这些很可能是真正的问题,但对于libc / libstdc ++开发人员来说可能太小了。

您可以通过指定--gen-suppressions=yes在Valgrind输出中生成抑制。这将产生如下输出:

==28328== 56 bytes in 1 blocks are still reachable in loss record 1 of 7
==28328==    at 0x4C290F1: malloc (vg_replace_malloc.c:298)
==28328==    by 0x4111D8: xmalloc (xmalloc.c:43)
==28328==    by 0x41120B: xmemdup (xmalloc.c:115)
==28328==    by 0x40F899: clone_quoting_options (quotearg.c:102)
==28328==    by 0x40742A: decode_switches (ls.c:1957)
==28328==    by 0x40742A: main (ls.c:1280)
==28328== 
{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   match-leak-kinds: reachable
   fun:malloc
   fun:xmalloc
   fun:xmemdup
   fun:clone_quoting_options
   fun:decode_switches
   fun:main
}

在上面,带有pid(== 28328 ==)的部分是通常的输出。它之后的部分(由大括号分隔)是生成的抑制。您可以将此块复制到一个文件中,例如my_suppressions,然后您可以运行valgrind并告诉它读取文件--suppressions=my_suppressions

如果您计划长时间维护您的抑制文件,那么最好在'insert_a_suppression_name_here'的位置放置一些有意义(且唯一)的文本。这将帮助您监视正在使用哪些抑制,因为如果以详细模式运行valgrind(-v或--verbose),它将列出所有使用的抑制。例如

--30822-- used_suppression:      2 Example for SO my_suppressions:2 suppressed: 112 bytes in 2 blocks
--30822-- used_suppression:      4 U1004-ARM-_dl_relocate_object /remote/us01home48/pfloyd/tools/vg313/lib/valgrind/default.supp:1431