【问题标题】:Valgrind - blocks still reachable due to?Valgrind - 由于什么原因,仍然可以访问块?
【发布时间】:2013-04-19 19:07:57
【问题描述】:

我试图弄清楚是什么导致 Valgrind 警告一些“仍然可以到达”的块。我查看了我的代码,找不到任何 free() 丢失。我尝试使用 --leak-check=yes --show-reachable=yes 选项运行,这是输出示例:

==2999== 616 bytes in 7 blocks are still reachable in loss record 8 of 9
==2999==    at 0xD9C3: calloc (vg_replace_malloc.c:597)
==2999==    by 0x3188FA: _xpc_calloc (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x3191D4: _xpc_base_create (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x31FBEA: xpc_string_create (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x31EDFD: xpc_dictionary_set_string (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x320E8C: _libxpc_initializer (in /usr/lib/system/libxpc.dylib)
==2999==    by 0x1BE7D: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==2999==    by 0x7FFF5FC0FDA5: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0FAF1: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0D2E3: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0D27C: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==2999==    by 0x7FFF5FC0E0B6: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)


==2999== 4,096 bytes in 1 blocks are still reachable in loss record 9 of 9
==2999==    at 0xC713: malloc (vg_replace_malloc.c:274)
==2999==    by 0x17F3F7: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x175D19: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x1766C3: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x17618D: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x17F2CF: printf (in /usr/lib/system/libsystem_c.dylib)
==2999==    by 0x100003D21: printEstBasica (mod_dados.c:100)
==2999==    by 0x100001635: main (mod_main.c:179)

我所理解的行要么是指“打印”功能(如 printEstBasica),我只使用 printf 或 fprintf ......其他的我不知道它们是什么......我在其他帖子上读到人们说它可能指的是编译器使用的附加信息..但我不确定。一件事让我想到:我在不同的数据集(由程序处理)上运行 valgrind,大小不同,仍然可以访问的字节数总是相同的..

提前致谢!

【问题讨论】:

    标签: valgrind memory-leaks


    【解决方案1】:

    我正在尝试找出导致 Valgrind 警告某些“仍可访问”的块的原因。

    要求 Valgrind 用--show-reachable=yes 标志告诉您有关它们的信息。如果您不想看到它们,请不要使用该标志。

    现在,您的真正问题可能是“什么是可到达的块,我应该关心什么?”。

    答案:并非如此。仍然可到达的块意味着程序可以释放()它们,如果它愿意(它仍然可以找到 == 到达它们),它只是不关心这样做。

    下面是一个生成“仍然可达”的程序示例:

    int DoSomething()
    {
      // Heap-allocated so as not to exhaust stack.
      // Allocated only once.
      static char *const error_buf = malloc(10000);
      return DoSomethingWithErrorBuf(error_buf);
    }
    
    int main()
    {
      return DoSomething();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2016-05-13
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      相关资源
      最近更新 更多