Valgrind报告在OS X 10.8.1上泄露了内存

rav*_*ron 5 c valgrind memory-leaks osx-mountain-lion

我在Mountain Lion的OS X 10.8.1上使用Valgrind版本3.8.0.关于与10.8.1的兼容性,Valgrind的网站说(italics mine):

Valgrind 3.8.0适用于 {x86,amd64} -darwin(Mac OS X 10.6和10.7,支持10.8).

那么,我知道10.8.1只有"有限的支持".尽管如此,这个错误报告说(斜体矿):

这个(最新的3.8.0版本)使Valgrind 编译并能够在OSX 10.8上运行小程序.但是请注意,它仍然使用更大的应用程序断言,并且根本没有正确检查32位程序(Memcheck错过了大多数错误).

好没关系.因此,如果气质,Valgrind应该在10.8.1上工作.所以现在我的问题是:

我能够很好地让Valgrind在10.8.1上编译,但是当我在几个小C程序上运行它时,我看到了一些奇怪的结果.为了尝试减少问题的可能原因,我最终编写了以下"程序":

int main () {                                                               
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我会说,不是很令人兴奋,而且很少有虫子的余地.然后,我编译并通过Valgrind运行它:

gcc testC.c
valgrind ./a.out
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

==45417== Command: ./a.out
==45417== 
==45417== WARNING: Support on MacOS 10.8 is experimental and mostly broken.
==45417== WARNING: Expect incorrect results, assertions and crashes.
==45417== WARNING: In particular, Memcheck on 32-bit programs will fail to
==45417== WARNING: detect any errors associated with heap-allocated data.
==45417== 
--45417-- ./a.out:
--45417-- dSYM directory is missing; consider using --dsymutil=yes
==45417== 
==45417== HEAP SUMMARY:
==45417==     in use at exit: 58,576 bytes in 363 blocks
==45417==   total heap usage: 514 allocs, 151 frees, 62,442 bytes allocated
==45417== 
==45417== LEAK SUMMARY:
==45417==    definitely lost: 8,624 bytes in 14 blocks
==45417==    indirectly lost: 1,168 bytes in 5 blocks
==45417==      possibly lost: 4,925 bytes in 68 blocks
==45417==    still reachable: 43,859 bytes in 276 blocks
==45417==         suppressed: 0 bytes in 0 blocks
==45417== Rerun with --leak-check=full to see details of leaked memory
==45417== 
==45417== For counts of detected and suppressed errors, rerun with: -v
==45417== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Run Code Online (Sandbox Code Playgroud)

我知道Valgrind还没有准备好在10.8.1的黄金时段.尽管如此,我希望能够在这里使用它 - 我只需要在小程序中使用它,并且没有任何关于结果的任务至关重要.但显然,它报告了一个似乎不太可能泄漏的程序中的大量泄漏.从而:

我该怎么做才能解决这个问题?


其他信息:

  • 添加一个故意泄露整数通过适当的4个字节递增"肯定失去了"数量.
  • 同样,故意泄漏通过不释放内存到malloc的调用适当地递增堆ALLOC计数.
  • 使用-g标志进行编译然后运行到Valgrind(以解决dSYM directory is missing错误)确实会导致该错误消失,但不会更改报告的大量内存泄漏问题.

n. *_* m. 6

它告诉你那里:

期待不正确的结果,断言和崩溃.

如果您仍想运行它,请打印有关虚假泄漏(--leak-check=full)的详细信息,并使用它来抑制有关它们的消息.


lee*_*ker 6

Valgrind后备箱似乎已经改进到现在可以使用的程度.我还没有看到它崩溃,但确实有很多误报,可以使用抑制文件处理.

现在,我的抑制文件如下所示:

# OS X 10.8 isn't supported, has a bunch of 'leaks' in the loader
{
   osx_1080_loader_false_positive_1
   Memcheck:Leak
   ...
   fun:_ZN11ImageLoader23recursiveInitializationERKNS_11LinkContextEjRNS_21InitializerTimingListE
   ...
}
{
   osx_1080_loader_false_positive_2
   Memcheck:Leak
   ...
   fun:_ZN16ImageLoaderMachO16doInitializationERKN11ImageLoader11LinkContextE
   ...
}
{
   osx_1080_loader_false_positive_3
   Memcheck:Leak
   ...
   fun:map_images_nolock
   ...
}
{
   osx_1080_loader_false_positive_4
   Memcheck:Leak
   ...
   fun:_objc_fetch_pthread_data
   fun:_ZL27_fetchInitializingClassLista
   fun:_class_initialize
   fun:_class_initialize
   fun:_class_initialize
   fun:_class_initialize
   fun:prepareForMethodLookup
   fun:lookUpMethod
   fun:objc_msgSend
   fun:_libxpc_initializer
   fun:libSystem_initializer
}
Run Code Online (Sandbox Code Playgroud)