Возможная утечка памяти Valgrind в OSX El Capitan
Я получаю предупреждение для possibly lost: 2,064 bytes in 1 blocks
при использовании Valgrind на OSX Yosemite. Есть ли исправление к этому? Я установил valgrind с помощью brew.
Ниже приведен пример того, как воспроизводить
~/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)
Ответы
Ответ 1
Valgrind - это в основном инструмент для Linux и менее поддерживается для OSX. Это означает, что Valgrind генерирует много ложных срабатываний на OSX. Если вы хотите отключить те, возможно, потерянные утечки, затем добавьте --gen-suppressions=all
(или --gen-suppressions=yes
, если вы хотите выбрать вариант утечки по одному) для вашего вызова valgrind
. Что это будет сделано, так это распечатать фрагмент текста для каждой утечки сообщаемой памяти, которая будет выглядеть примерно так:
{
<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
}
Скопируйте и вставьте это, скобки и все, в файл, называемый как-то вроде /Users/username/leak1.supp
. Не стесняйтесь изменять <...>
на фактическое имя для вашего подавления. Затем, когда вы вызываете valgrind
, если вы добавите параметр --suppressions=/Users/<username>/leak1.supp
, этот отчет об утечке памяти будет подавлен. Чтобы сделать это проще, вы можете просто поместить материал в файл ~/.valgrindrc
. Этот файл может выглядеть примерно как
--tool=memcheck
--leak-check=full
--show-reachable=yes
--suppressions=/Users/benlindsay/leak1.supp
--suppressions=/Users/benlindsay/leak2.supp
Или, если вы можете просто проверить свой код на машине Linux, вам не придется беспокоиться обо всем этом;)
- EDIT -
Я получил много информации из этого другого сообщения SO