2016-05-13 2 views
0

Я написал связанный список в C сегодня на работе на машине Linux, и все проверено в Valgrind. Затем я выполнил тот же тест (несколько нажатий, а затем удалил список) дома на OS X и получил сумасшедшее количество выделов.Valgrind показывает более 200 ассигнований для приветственной мировой программы на 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) 

Я знаю, что код в порядке и не имеет утечек. Поэтому я просто прокомментировал тест списка и скомпилировал только printf("test\n");, и он показал 263 allocs с 76 frees (у меня было 4 намеренных выделения в тестовом списке). Почему я получаю так много ассигнований на OS X? Это то, что сделала ОС? Я не понимаю, почему у меня было бы 263 ассигнований, когда я только что сделал printf ...

ответ

-1

OS X имеет очень плохую архитектуру. Потому что libdl, libdyld, libm, libc и некоторые другие библиотеки «упакованы» в libSystem, все они инициализируются при загрузке библиотеки. Большинство из них родом из dyld. Dyld написан на языках C и C++, поэтому часть C++ может увеличивать количество выделов.

Это только вещь Apple, а не вещь OS X. Я написал альтернативную библиотеку C. В нем не так много «ненужных ассигнований».


Кроме того, вычеты вызваны открытием FILE *. Обратите внимание, что три потока (stdin, stdout и stderr) инициализируются при запуске.

+0

По крайней мере, в Linux, stdio-streams (включая 'stdin/stdout')' mmap() 'их буферы при первом использовании, а не при запуске программы. – EOF

0

Поддержка Valgrind на OS X в настоящее время активно работает. Ваш лучший подход заключается в том, чтобы убедиться, что вы используете сборку SVN-стволов и часто обновляетесь.

Ошибки Valgrind сообщает, что вы присутствуете в системных библиотеках OS X. Это не вина вашей программы, а потому, что даже простые программы, включая эти системные библиотеки, Valgrind продолжает их подбирать. Подавления в ветке Valgrind постоянно обновляются, чтобы уловить эти проблемы, позволяя сосредоточиться на реальных проблемах, которые могут присутствовать в вашем коде.

Следующие команды позволяют использовать багажник Valgrind, если вы еще не:

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

Полное раскрытие: Я один из разработчиков VALGRIND, которые способствовали патчи для поддержки OS X 10.11