2016-01-03 21 views
14

OSX YosemiteでValgrindを使用している場合、possibly lost: 2,064 bytes in 1 blocksの警告が表示されます。これに修正がありますか?私は醸造を使用してvalgrindをインストールしました。OSXエルキャピタンでメモリリークバグが発生する可能性があります

は以下

~/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) 
+0

から私の情報の多くを得た:) –

+0

TBH、私はValgrindのかに触れていません私は何ヶ月もの間、私はwhについての情報に基づいた意見を持っていないで正しい。この状況ではSOプロトコルとは何ですか? – Idr

+0

わかりません。私はあなたの問題を解決する方法をまだ考えているのか、あるいは将来何かを解決しようと計画している場合は、誰かの答えが役に立つか、あなた自身の答えを投稿するまで見つけることができます。問題をすべて放棄して戻ってくることを計画していないのであれば、あなたはそれを閉じるための答えを選ぶかもしれません。あなたが良い答えが出たら、いつでも答えを変えることができます –

答えて

12

Valgrindのは、ほとんどがLinux用のツールであり、以下OSXのためにサポートされて再現する方法の一例です。これは、ValgrindがOSXで多くの誤検出を生成することを意味します。それらの可能性のある漏れを抑制したい場合は、valgrindコールに--gen-suppressions=all(または、報告されたリークを1つずつ選択して選択したい場合は--gen-suppressions=yes)オプションを追加します。

{ 
    <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--

あなたはそれが違っていた場合、私はそれを感謝し、正しい私の答えをマークするか、あなたのソリューションを投稿どちらか気にしないだろう場合は、私がthis other SO post

+0

それが偽陽性であることをどう知っていますか? – Idr

+1

一般的に、偽陽性であるかどうかをどのように判断するのかは分かりませんが、特定のケースではメモリを割り当てていないので、漏れていないと仮定するのはかなり合理的です任意のメモリ。 –

+0

ちょうど出力をもう一度見て、私は迅速なものを参照してください。奇妙な!? – Idr

関連する問題