简体   繁体   English

OSX El Capitan中可能的内存泄漏Valgrind

[英]Possible Memory Leak Valgrind in OSX El Capitan

I'm getting a warning for possibly lost: 2,064 bytes in 1 blocks when using Valgrind on OSX Yosemite. 我收到一个possibly lost: 2,064 bytes in 1 blocks的警告possibly lost: 2,064 bytes in 1 blocks在OSX Yosemite上使用Valgrind时possibly lost: 2,064 bytes in 1 blocks Is there a fix to this? 有没有解决这个问题? I installed valgrind using brew. 我用brew安装了valgrind。

Below is an example of how to reproduce 以下是如何重现的示例

~/cat hello.c
int main() {
    return 123;
}

~/uname -a
Darwin mac.local 15.2.0 Darwin Kernel Version 15.2.0: Fri Nov 13 19:56:56 PST 2015; root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64 i386 MacBookAir6,2 Darwin

~/clang --version
Apple LLVM version 7.0.2 (clang-700.1.81)
Target: x86_64-apple-darwin15.2.0
Thread model: posix

~/valgrind --version
  valgrind-3.11.0

~/brew info valgrind
valgrind: stable 3.11.0 (bottled), HEAD
Dynamic analysis tools (memory, debug, profiling)
http://www.valgrind.org/
/usr/local/Cellar/valgrind/3.11.0 (328 files, 46.7M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/valgrind.rb

~/clang hello.c -o hello.o

~/valgrind --leak-check=full ./hello.o
==7972== Memcheck, a memory error detector
==7972== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7972== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7972== Command: ./hello.o
==7972== 
==7972== 
==7972== HEAP SUMMARY:
==7972==     in use at exit: 22,411 bytes in 187 blocks
==7972==   total heap usage: 271 allocs, 84 frees, 28,651 bytes allocated
==7972== 
==7972== 2,064 bytes in 1 blocks are possibly lost in loss record 57 of 62
==7972==    at 0x10000817C: malloc_zone_malloc (in /usr/local/Cellar/valgrind/3.11.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==7972==    by 0x1004F3EFD: _objc_copyClassNamesForImage (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E7182: protocols() (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E7093: readClass(objc_class*, bool, bool) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E4C13: gc_init (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004EC24E: objc_initializeClassPair_internal(objc_class*, char const*, objc_class*, objc_class*) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004F9132: layout_string_create (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E783C: realizeClass(objc_class*) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E7300: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E72E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E72E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==7972==    by 0x1004E72E9: copySwiftV1MangledName(char const*, bool) (in /usr/lib/libobjc.A.dylib)
==7972== 
==7972== LEAK SUMMARY:
==7972==    definitely lost: 0 bytes in 0 blocks
==7972==    indirectly lost: 0 bytes in 0 blocks
==7972==      possibly lost: 2,064 bytes in 1 blocks
==7972==    still reachable: 0 bytes in 0 blocks
==7972==         suppressed: 20,347 bytes in 186 blocks
==7972== 
==7972== For counts of detected and suppressed errors, rerun with: -v
==7972== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 17)

Valgrind is mostly a tool for Linux, and is less supported for OSX. Valgrind主要是Linux的工具,对OSX的支持较少。 This means that Valgrind will generate a lot of false positives on OSX. 这意味着Valgrind将在OSX上产生大量误报。 If you want to suppress those possibly lost leaks, then add the --gen-suppressions=all (or --gen-suppressions=yes if you want to pick and choose reported leaks one by one) option to your valgrind call. 如果你想抑制那些可能丢失的泄漏,那么在你的valgrind调用中添加--gen-suppressions=all (或者--gen-suppressions=yes如果你想逐个选择报告的泄漏)选项。 What this will do is print off a chunk of text for each reported memory leak that will look something like this: 这将做的是为每个报告的内存泄漏打印一大块文本,看起来像这样:

{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   match-leak-kinds: indirect
   fun:malloc
   fun:__Balloc_D2A
   fun:__rv_alloc_D2A
   fun:__dtoa
   fun:__vfprintf
   fun:__v2printf
   fun:vfprintf_l
   fun:printf
   fun:main
}

Copy and paste that, brackets and all, to a file called something like /Users/username/leak1.supp . 将该括号和所有内容复制并粘贴到名为/Users/username/leak1.supp的文件中。 Feel free to change the <...> to an actual name for your suppression. 您可以随意将<...>更改为抑制的实际名称。 Then when you call valgrind , if you add a --suppressions=/Users/<username>/leak1.supp option, that memory leak report will be suppressed. 然后,当您调用valgrind ,如果添加--suppressions=/Users/<username>/leak1.supp选项,则将禁止该内存泄漏报告。 To make this easier, you can just put stuff in a ~/.valgrindrc file. 为了使这更容易,你可以把东西放在~/.valgrindrc文件中。 This file could look something like 这个文件看起来像

--tool=memcheck
--leak-check=full
--show-reachable=yes
--suppressions=/Users/benlindsay/leak1.supp
--suppressions=/Users/benlindsay/leak2.supp

Or if you can just test your code on a Linux machine instead, you won't have to worry about all this ;) 或者,如果您只是在Linux机器上测试代码,则不必担心所有这些;)

--EDIT-- - 编辑 -

I got a lot of my info from this other SO post 我从其他SO帖子中获得了很多信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM