我是valgrind的新手,首先要注意的是,OS X El Capitan 上的标准 C-Library 似乎泄漏了内存(可能丢失了)。经过多读一点后,情况并非如此,并且可以使用抑制文件从valgrind 泄漏摘要中排除 system-lib。
我生成了一个这样的抑制文件(通过运行一个简单的程序)并将错误添加到抑制文件中。它看起来像这样:
osx_el_capitan_c_lib.supp
{
<osx_el_capitan_c_lib>
Memcheck:Leak
match-leak-kinds: possible
fun:malloc_zone_malloc
fun:_objc_copyClassNamesForImage
fun:_ZL9protocolsv
fun:_Z9readClassP10objc_classbb
fun:gc_init
fun:_ZL33objc_initializeClassPair_internalP10objc_classPKcS0_S0_
fun:layout_string_create
fun:_ZL12realizeClassP10objc_class
fun:_ZL22copySwiftV1MangledNamePKcb
fun:_ZL22copySwiftV1MangledNamePKcb
fun:_ZL22copySwiftV1MangledNamePKcb
fun:_ZL22copySwiftV1MangledNamePKcb
}
现在我有几个问题:
- 该文件是否有可能抑制我的实际代码(不是系统库)的泄漏?我用绝对泄漏/不泄漏的代码进行了一些测试,它似乎工作正常。但是我怎么能确定呢?
- 默认输出电流如下所示(绝对没有泄漏):
==37004== Memcheck,内存错误检测器 ==37004== 版权所有 (C) 2002-2015 和 GNU GPL,由 Julian Seward 等人撰写。 ==37004== 使用 Valgrind-3.11.0 和 LibVEX;使用 -h 重新运行以获取版权信息 ==37004== 命令:./val.o ==37004== ==37004== ==37004== 堆摘要: ==37004== 退出时使用:187 个块中的 22,100 个字节 ==37004== 总堆使用量:271 分配,84 释放,28,340 字节分配 ==37004== ==37004== 泄漏摘要: ==37004== 肯定丢失:0 个块中的 0 个字节 ==37004== 间接丢失:0 个块中的 0 个字节 ==37004== 可能丢失:0 个块中的 0 个字节 ==37004== 仍然可以访问:0 个块中的 0 个字节 ==37004== 抑制:187 个块中的 22,100 个字节 ==37004== ==37004== 对于检测到和抑制的错误计数,重新运行:-v ==37004== 错误摘要:0 个上下文中的 0 个错误(抑制:18 个中的 18 个)
正如你所看到的,抑制文件现在工作得很好(没有字节显示为丢失等)。但是堆摘要不会受到它似乎的抑制文件的影响(allocs
/mallocs
显示 - 它们发生在我的代码之外)并且泄漏摘要显示为它自己的字段被抑制。有没有办法可以禁用此字段(标志或其他东西)并在堆摘要中 抑制(allocs
/在我的代码之外)?mallocs