C Valgrind报告OS X 10.8.1上的内存泄漏

C Valgrind报告OS X 10.8.1上的内存泄漏,c,memory-leaks,valgrind,osx-mountain-lion,C,Memory Leaks,Valgrind,Osx Mountain Lion,我在OS X 10.8.1山狮上使用Valgrind 3.8.0版。关于与10.8.1的兼容性,says(斜体): Valgrind3.8.0在{x86,amd64}-达尔文(MacOSX10.6和10.7,对10.8的支持有限)上工作 因此,我知道对10.8.1的支持是“有限的”。尽管如此,他说(斜体字): 这(最新的3.8.0版本)使Valgrind 编译并能够在OSX 10.8上运行小程序。然而,请注意 它仍然声称有更大的应用程序,而32位程序不是 完全正确检查(Memcheck遗漏了大多

我在OS X 10.8.1山狮上使用Valgrind 3.8.0版。关于与10.8.1的兼容性,says(斜体):

Valgrind3.8.0在{x86,amd64}-达尔文(MacOSX10.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程序上运行它时,我看到了一些奇怪的结果。为了试图减少问题的可能原因,我最终编写了以下“程序”:

不是很刺激,我想说,虫子的空间也很小。然后,我编译并通过Valgrind运行了它:

gcc testC.c
valgrind ./a.out
以下是我的输出:

==45417==命令:./a.out
==45417== 
==45417==警告:MacOS 10.8上的支持是实验性的,而且大部分都已失效。
==45417==警告:预期结果、断言和崩溃不正确。
==45417==警告:特别是,32位程序上的Memcheck将无法执行
==45417==警告:检测与堆分配数据相关的任何错误。
==45417== 
--45417--./a.out:
--45417—缺少dSYM目录;考虑使用-DyMUTILL =是
==45417== 
==45417==堆摘要:
==45417==在出口处使用:363个块中的58576字节
==45417==总堆使用率:514个alloc,151个free,62442个字节分配
==45417== 
==45417==泄漏汇总:
==45417==肯定丢失:14个块中有8624字节
==45417==间接丢失:5个块中有1168字节
==45417==可能丢失:68个块中有4925个字节
==45417==仍可访问:276个块中有43859个字节
==45417==抑制:0个块中有0个字节
==45417==使用--leak check=full重新运行以查看泄漏内存的详细信息
==45417== 
==45417==对于检测到的和抑制的错误计数,请使用:-v重新运行
==45417==错误摘要:来自0个上下文的0个错误(已抑制:来自0的0)
我知道Valgrind还没有为10.8.1的黄金时段做好准备。尽管如此,我还是希望能够在这里使用它——我只需要在小型项目上使用它,而且没有什么是对现场结果至关重要的。但很明显,它正在报告一个看起来不太可能泄漏的项目中的大量泄漏。因此:

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


其他资料:

  • 添加故意泄漏的整数会将“绝对丢失”计数增加4个字节
  • 类似地,通过不释放内存而故意泄漏对malloc的调用确实会适当地增加堆alloc计数
  • 使用
    -g
    标志编译,然后运行到Valgrind(以解决
    dSYM目录丢失
    错误),确实会导致该错误消失,但不会改变报告大量内存泄漏的问题

它告诉您:

预期结果、断言和崩溃不正确


如果仍要运行它,请打印有关虚假泄漏的详细信息(
--leak check=full
),并将其用于发送有关这些泄漏的消息。

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

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

# 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
}

我还在MacOSX 10.8上的macports上运行valgrind。它运行时没有崩溃,但确实产生了一些疯狂的结果,就像这个stackoverflow帖子中的结果一样

我担心这可能就是答案。我会去做的。谢谢。我得到了同样的结果。这已经过时了。2017年,Valgrind抑制了大多数误报。@FranklinYu在10.8.1中是否抑制了大多数误报?如果是这样的话,写一个这样的答案,我会把它标记为接受。@ravron抱歉,没有(或者至少我不知道)。我只考了10.11分。我想说的是,这个问题可能取决于OS X的版本。但您可能仍然希望尝试使用最新的Valgrind,因为它们。它过去不抑制任何误报,这是从日志中得知的
抑制:0个块中有0个字节
。所以,至少情况有所改善。
# 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
}