1

我是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
4

0 回答 0