2016-05-13 4 views
0

Ich schrieb heute eine verknüpfte Liste in C bei der Arbeit auf einer Linux-Maschine und alles in Valgrind ausgecheckt. Dann habe ich den gleichen Test (eine Handvoll Pushs und dann Löschen der Liste) zu Hause auf OS X und bekam eine verrückte Menge an Allocs.Valgrind zeigt über 200 Zuweisungen für ein Hallo Welt-Programm auf OS X?

==4344== HEAP SUMMARY: 
==4344==  in use at exit: 26,262 bytes in 187 blocks 
==4344== total heap usage: 267 allocs, 80 frees, 32,374 bytes allocated 
==4344== 
==4344== LEAK SUMMARY: 
==4344== definitely lost: 0 bytes in 0 blocks 
==4344== indirectly lost: 0 bytes in 0 blocks 
==4344==  possibly lost: 0 bytes in 0 blocks 
==4344== still reachable: 0 bytes in 0 blocks 
==4344==   suppressed: 26,262 bytes in 187 blocks 
==4344== 
==4344== For counts of detected and suppressed errors, rerun with: -v 
==4344== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Ich weiß, dass der Code in Ordnung ist und hat keine Lecks. Also habe ich gerade den Listentest kommentiert und nur mit printf("test\n"); kompiliert, und es zeigte 263 Alloc mit 76 Frees (ich hatte 4 absichtliche Allocs im Listentest). Warum bekomme ich unter OS X so viele Allocs? Ist das nur etwas, was das OS getan hat? Ich verstehe nicht, warum ich 263 Alloks haben würde, wenn ich nur einen Druck ...

Antwort

-1

OS X hat eine sehr schlechte Architektur. Da libdl, libdyld, libm, libc und einige andere Bibliotheken in libSystem "gepackt" werden, werden alle von ihnen initialisiert, wenn die Bibliothek geladen wird. Die meisten von ihnen kommen aus dyld. Dyld ist in C und C++ geschrieben, deshalb kann C++ Teil die Anzahl der Allocs erhöhen.

Das ist nur Apple Sache, nicht OS X Sache. Ich habe eine alternative C-Bibliothek geschrieben. Es hat nicht viele "nicht benötigte Allokierungen".


Auch Alloks werden durch Öffnen FILE * s verursacht. Beachten Sie, dass 3 Streams (stdin, stdout und stderr) beim Lauf initialisiert werden.

+0

Mindestens auf Linux, stdio-Streams (einschließlich 'stdin/stdout')' mmap() 'ihre Puffer bei der ersten Verwendung, nicht beim Programmstart. – EOF

0

Die Valgrind-Unterstützung unter OS X wird derzeit aktiv bearbeitet. Ihre beste Vorgehensweise besteht darin, sicherzustellen, dass Sie einen SVN-Trunk-Build verwenden und häufig aktualisieren.

Die Fehler, die Valgrind an Sie meldet, sind in den OS X-Systembibliotheken vorhanden. Dies ist nicht die Schuld Ihres Programms, sondern weil selbst einfache Programme, die diese Systembibliotheken enthalten, Valgrind weiterhin aufnimmt. Suppressionen innerhalb von Valgrind trunk werden ständig aktualisiert, um diese Probleme zu beheben, sodass Sie sich auf die wirklichen Probleme konzentrieren können, die möglicherweise in Ihrem Code vorhanden sind.

Die folgenden Befehle können Sie Valgrind Stamm verwenden, wenn Sie nicht bereits sind:

svn co svn://svn.valgrind.org/valgrind/trunk valgrind 
cd valgrind 
./autogen.sh 
./configure 
make -j4 
sudo make install 

Vollständige Offenlegung: Ich bin einer der Valgrind-Entwickler, die Patches beigetragen OS X 10.11 zur Unterstützung