Я пытаюсь обнаружить утечки памяти в C (и C ++) программах на macOS. В Linux и Windows я мог бы сделать это легко, используя valgrind
, но, к сожалению, он недоступен в macOS.
Поскольку у меня есть опыт работы с Obj C и iOS dev, Я думал использовать инструменты для проверки утечки памяти. На первый взгляд, это звучало идеально для этой работы.
Я написал эту очень простую утечку программы:
#include <stdlib.h>
#include <stdio.h>
int* allocSomething() {
return malloc(sizeof(int));
}
int main(int argc, const char * argv[]) {
int* p = allocSomething();
*p = 5;
printf("*p = %d\n", *p);
p = NULL;
return 0;
}
Я запустил ее через Clang Stati c Analyzer которая выполнила эту работу, но я хотел, чтобы ее также нашли в инструментах, потому что я ищу подходящую замену Valgrind Таким образом:
- Я изменил схему профиля, чтобы использовать Debug вместо Release.
- Я убедился, что оптимизаций нет.
Однако после использования Инструменты:
и, как вы можете видеть, утечки не зарегистрировано. После поиска в Интернете я обнаружил Не могу обнаружить C утечек в инструментах xcode 9 , в которых автор использовал sleep
, поэтому я подумал, что, возможно, инструменты на самом деле не перекрывают malloc
как Valgrind , но используйте технику сэмплирования, и она не сэмплирует ее в такой короткий срок, поэтому я изменил программу на:
int main(int argc, const char * argv[]) {
int* p = allocSomething();
p = NULL;
sleep(600000);
return 0;
}
Теперь я получаю:
Что совершенно не имеет смысла, так как это очевидная утечка памяти. Я бы сказал, что это связано с оптимизацией, но потом я явно отключил это. Кроме того, если я malloc
больше байтов, он обнаруживает это. Или, может быть, это ошибка в инструментах?
Так что мне интересно, если это проблема с инструментами, которые не могут обнаружить небольшие выделения? Должен отметить, что Вальгринд справляется с этим очень хорошо, поэтому я удивлен.
Есть ли у вас какие-либо предложения?