Инструменты обнаружения утечки памяти - PullRequest
62 голосов
/ 27 сентября 2008

Предоставляет ли среда разработки Apple Xcode какие-либо инструменты для обнаружения утечек памяти?

Меня особенно интересуют инструменты, которые применяются к iPhone SDK. В настоящее время моя любимая платформа для проектов хобби программирования

Документация / учебные пособия для указанных инструментов будут очень полезны.

Ответы [ 11 ]

64 голосов
/ 28 сентября 2008

Существует один, специально названный Leaks, и, как сказал предыдущий автор, самый простой способ запустить его - прямо из Xcode:

Выполнить -> Начать с Performance Tool -> Утечки

Кажется, он очень хорошо выявляет утечки памяти, и такой голове, как я, было легко разобраться.

25 голосов
/ 28 сентября 2008

Выберите Profile в меню Product в Xcode 6, чтобы запустить инструмент Apple's Instruments. (Приложение находится внутри содержимого пакета приложения Xcode: /Applications/Xcode.app/Contents/Applications/)

Коммерческая альтернатива: OmniObjectMeter . (прекращено Omni Group)

12 голосов
/ 28 сентября 2008

Clang Static Analyser отлично подходит для поиска ошибок в кодах C, C ++ и Objective-C:

6 голосов
/ 29 августа 2013

Вот ссылка для использования инструмента из xcode для обнаружения утечки памяти / производительности вашего приложения ios / mac Шаги для запуска прибора из Xcode

6 голосов
/ 28 сентября 2008

Вы можете запустить инструменты в XCode через menu -> run -> start with performance tool -> ...

5 голосов
/ 29 марта 2011

Предоставляет ли среда разработки Apple Xcode какие-либо инструменты для обнаружения утечек памяти?

Меня особенно интересуют инструменты, которые применяются к iPhone SDK.

Да. Apple называет их «Инструменты» (это больше, чем просто инструменты памяти).

См. Apple's Introduction to Instruments User Guide. В частности, см. Locating Memory Issues in Your App. В нем приведены примеры использования шаблонов трассировки, ориентированных на память.

4 голосов
/ 16 сентября 2010

Суммированы основные утечки памяти: iphone-essential-performance-tools-list

4 голосов
/ 28 сентября 2008

При использовании rustyshelf's solution убедитесь, что вы тестируете на iPhone, а не на симуляторе. Использование памяти резко отличается.

4 голосов
/ 28 сентября 2008

ObjectAlloc и MallocDebug должны быть вам полезны. Если вы установили весь SDK, они будут найдены в Developer-> Applications-> Performance Tools.

Их имена дают вам довольно хорошее представление об их функциях: OA, отслеживает создание объектов, а MA - это общий инструмент утечки памяти.

Я еще не пробовал их с разработкой для iPhone, но должен верить, что они там тоже будут работать.

Если вы зарегистрировались на сайте разработчика ADC iPhone, перейдите по следующей ссылке: Instruments User Guide

3 голосов
/ 24 апреля 2016

enter image description here

Шаг 1. Выберите инструмент Allocations

  1. Выберите шаблон профилирования для Распределений:

enter image description here

  1. В главном интерфейсе инструментов нажмите VM Tracker, если он есть, и нажмите клавишу Delete, поскольку вам не нужен этот конкретный инструмент:

enter image description here

Нажав кнопку «плюс» в правом верхнем углу, вы можете добавить больше инструментов для различных видов тестирования, но я не буду описывать их в этом руководстве.

Шаг 2. Установите настройки инструментов

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

Чтобы выбрать цель, нажмите Мой компьютер в верхней части, наведите курсор мыши на свое устройство и выберите приложение из подменю:

enter image description here

Далее, есть панель, где вы можете изменить настройки для типов распределений, которые вы будете просматривать. Помимо проверки того, что пузырек Created & Persistent отмечен, вам не нужно ничего делать заранее.

enter image description here

Шаг 3. Нажмите запись, чтобы запустить прибор

Как только вы нажмете кнопку записи в левом верхнем углу, ваше приложение запустится на вашем устройстве, и инструменты начнут составлять график ваших распределений. Все, что вам нужно сделать, - это запустить ваше приложение, сосредоточившись на возможных проблемных областях, чтобы увидеть, выделяет ли больше памяти, чем освобождает. Это может означать выполнение множества повторяющихся заданий, но вы поблагодарите себя позже.

Вы должны увидеть что-то вроде этого:

enter image description here

Я рекомендую один раз запустить ваше приложение и достичь стабильной точки в памяти, чтобы у вас была хорошая базовая линия, которая сделает любое увеличение заметным. Когда вы убедитесь, что у вас достаточно данных для тестирования, нажмите кнопку остановки в верхнем левом углу.

Шаг 4. Анализ

  1. Первое, что я делаю, это устанавливаю свой диапазон проверки для измерения общего количества постоянных байтов на моей базовой линии. Этот постоянный номер байта находится прямо под сводкой распределения.

enter image description here

Чтобы фактически установить диапазон контроля, используйте сочетание клавиш Команда <</strong> для левого диапазона контроля и Команда> для правого диапазона контроля. В нашем приложении базовый уровень составляет около 20 МБ.

enter image description here

  1. Затем я перемещаю свой правый диапазон проверки в точку, где я снова запустил приложение и вернулся к нашему корню. Здесь видно, что память примерно такая же. Таким образом, выполнив это еще несколько раз и увидев, что ваша память возвращается к нашей базовой линии, вы можете предположить, что нет серьезных проблем с памятью.

enter image description here

Существуют различные способы анализа этих данных, которые я не буду здесь описывать, но имейте в виду, что существует целый раскрывающийся список способов просмотра и анализа ваших данных.

enter image description here

Шаг 5. Маркировка поколений

Если вы предпочитаете не иметь дело с диапазонами проверок, есть функция, называемая Mark Generation. На правой панели приборов есть кнопка для этого.

enter image description here

Эта кнопка будет отмечать точки на временной шкале инструментов в зависимости от того, где находится контрольная линия. Это делается для того, чтобы отслеживать все распределения с предыдущей отметки или с начала, если нет других отметок. Вы можете пометить поколения, когда вы запускаете инструмент распределения или после того, как вы остановили цикл, как в этом примере:

enter image description here

Шаг 6. Проверьте трассировку стека

Последнее, что нужно рассмотреть, - это посмотреть на трассировку стека. Для этого вы хотите установить диапазон проверки, чтобы выделить все распределения, а затем посмотреть на представление статистики, убедившись, что на правой панели выбран пузырь Created & Persistent . В статистическом представлении убедитесь, что постоянные байты отсортированы от старшего к младшему. Здесь много распределений, и может быть трудно понять, что происходит, поскольку многие из них являются системными.

enter image description here

углубляясь

  1. Посмотрите на самые большие выделения и нажмите на стрелку вправо. Часто внутри выделенных ресурсов будут выделяться ресурсы, и многие из них не будут иметь для вас значения.

enter image description here

  1. Поскольку вы выделяете различные выделения после нажатия стрелки, продолжайте смотреть на расширенные детали на правой панели. В конце концов вы встретите какой-то жирный текст, который приведет к фактическому коду в вашем проекте, сообщая вам, в чем может быть проблема.

enter image description here

  1. Если дважды щелкнуть один из элементов, выделенных жирным шрифтом в трассировке стека, вы перейдете к реальному коду (при условии, что вы выполнили выделение для собственного приложения).

enter image description here

  1. В этом представлении есть много полезных вещей, один из которых состоит в основном из желтых тегов справа, показывающих, сколько памяти занимает каждый вызов метода. Каждое приложение уникально, поэтому вам, разработчику, нужно решить, является ли выделенный метод проблемой, чем-то, что вы можете оптимизировать, или просто неизбежной частью вашего приложения.

  2. В моем случае эта переменная UIColor является постоянной и используется в нашем приложении и, следовательно, приемлема на протяжении всего жизненного цикла нашего приложения.

найдено здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...