Нахождение утечек памяти
Утечки памяти являются блоками выделенной памяти что программа больше ссылки. Утечки тратят впустую пространство путем заполнения страниц памяти с недоступными данными и напрасно тратят время вследствие дополнительного действия разбивки на страницы. Пропущенная память в конечном счете вынуждает систему выделить дополнительные страницы виртуальной памяти для приложения, выделения которого, возможно, избежали путем предъявления претензий в отношении пропущенной памяти.
Для приложений, использующих malloc, утечки памяти являются ошибками и должны всегда фиксироваться. Для приложений, использующих только объекты Objective C, функция ARC компилятора освобождает объекты для Вас и обычно избегает проблемы утечек памяти. Однако приложения, смешивающие использование объектов Objective C и структур на базе С, должны управлять владением объектов более непосредственно, чтобы гарантировать, что не пропущены объекты.
malloc библиотека может только предъявить претензии в отношении памяти, в отношении которой Вы говорите ей предъявлять претензии. Если Вы вызываете malloc
или любая подпрограмма, выделяющая память, необходимо сбалансировать тот вызов с соответствия free
. Когда Вы забываете освобождать память для указателя, встроенного в структуру данных, происходит типичная утечка памяти. При выделении памяти для встроенных указателей в коде удостоверьтесь, что Вы выпускаете память для того указателя до освобождения самой структуры данных.
Другой типичный пример утечки памяти происходит, когда Вы выделяете память, присваиваете ее указателю, и затем присваиваете различное значение указателю, не освобождая первый блок памяти. В этом примере, перезаписывая адрес в указателе стирает ссылку на исходный блок памяти, лишая возможности выпускать.
Нахождение утечек Используя инструменты
Инструментальное приложение может использоваться для нахождения утечек и в OS X и в приложениях для iPhone. Для нахождения утечек создайте новый шаблон документа в Инструментах и добавьте инструмент Утечек к нему. Инструмент Утечек обеспечивает возможности обнаружения утечки, идентичные тем в leaks
инструмент командной строки. Инструмент Утечек записывает все события выделения, происходящие в Вашем приложении, и затем периодически ищет перезаписываемую память приложения, регистры и штабель для ссылок на любые блоки активной памяти. Если это не находит ссылку на блок в одном из этих мест, это считает блок «утечкой» и выводит на экран релевантную информацию в области Detail.
В области Detail можно просмотреть пропущенную Таблицу использования блоков памяти и Режимы контуров. В режиме Table Инструменты выводят на экран полный список пропущенных блоков, сортированных размером. Выбор записи в таблице и щелчок по кнопке стрелки рядом с адресом памяти показывают историю выделения для блока памяти в том адресе. Выбор записи от этой истории выделения тогда показывает отслеживание стека для того события в области Extended Detail окна документа. В Режиме контуров, утечки приборных панелей Утечек, организованные деревом вызова, которое можно использовать для получения информации об утечках в определенном ответвлении кода.
Для получения дополнительной информации об использовании Инструментального приложения, включая большую информацию об информации, выведенной на экран инструментом Утечек, см. Инструментальное Руководство пользователя.
Используя Инструмент утечек
В OS X, leaks
инструмент командной строки ищет пространство виртуальной памяти процесса для буферов, выделенных malloc
но больше не ссылаются. Для каждого пропущенного буфера это находит, leaks
дисплеи следующая информация:
адрес пропущенной памяти
размер утечки (в байтах)
содержание пропущенного буфера
Если leaks
может решить, что объект является экземпляром Objective C или Базового объекта Основы, он также выводит на экран имя объекта. Если Вы не хотите просматривать содержание каждого пропущенного буфера, можно указать -nocontext
опция при вызове leaks
. Если MallocStackLogging
переменная окружения установлена, и Вы запускаете свое приложение в gdb
, leaks
выводит на экран отслеживание стека, описывающее, где был выделен буфер. Для получения дополнительной информации о malloc
параметры отладки, посмотрите Включение Функций отладки Malloc.
Подсказки для улучшения обнаружения утечки
Следующие инструкции могут помочь Вам найти утечки памяти быстро в Вашей программе. Большинство этих инструкций предназначается, чтобы использоваться с leaks
инструмент, но некоторые также применимы для использования с MallocDebug и общего использования.
Выполненный
leaks
во время поблочного тестирования. Поскольку поблочное тестирование осуществляет все пути выполнения кода повторимым способом, Вы, более вероятно, найдете утечки, чем Вы были бы то, при тестировании кода в продуктивной среде.Используйте
-exclude
опцияleaks
отфильтровывать утечки в функциях с известными утечками памяти. Эта опция помогает сократить сумму посторонней информации, сообщеннойleaks
.Если
leaks
сообщает утечка периодически, установила цикл вокруг целевого пути выполнения кода и выполняет код сотни или тысячи времен. Это увеличивает вероятность утечки, вновь появляющейся более регулярно.Выполните свою программу против
libgmalloc.dylib
вgdb
. Эта библиотека является агрессивной отладкой malloc библиотека, которая может помочь разыскать коварные ошибки в Вашем коде. Для получения дополнительной информации посмотритеlibgmalloc
страница справочника.Для Какао и приложений для iPhone, если Вы фиксируете утечку и Вашу программу, начинает отказывать, Ваш код, вероятно, пытается использовать уже освобожденный объектный или буфер памяти. Установите
NSZombieEnabled
переменная окружения кYES
найти сообщения к уже освобожденным объектам.
Большая часть кода поблочного тестирования выполняет желаемые пути выполнения кода и выходы. Несмотря на то, что это совершенно нормально для поблочного тестирования, оно создает проблему для leaks
инструмент, которому требуется время для анализа пространства памяти процесса. Для решения этой проблемы необходимо удостовериться, что код поблочного тестирования не выходит непосредственно после завершения его тестов. Можно сделать это путем помещения процесса для сна неопределенно вместо того, чтобы обычно выйти.