Xcode, Instruments: как найти постоянно растущий объект? - PullRequest
2 голосов
/ 22 февраля 2011

Сложно объяснить, что мне нужно в теме письма.Если у вас есть идея получше, не стесняйтесь редактировать ее.

Проблема заключается в следующем:

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

Так что есть утечка.Код не освобождает (выпускает) что-то.Может быть, это массив, который добавляет ссылку на элемент документа и который никогда не очищается, хотя и должен.

Конечно, инструмент утечки здесь не поможет, так как он все "правильный" (он только находит распределение без владельца).

Как мне использовать инструменты (или dtrace), чтобы найти этого пуговца сейчас?Было бы полезно, если бы я мог просто идентифицировать один из тех когда-либо добавленных объектов в Инструментах, остальное будет легко.

До сих пор я использовал инструмент Allocations, устанавливая диапазон проверки на время, когдастарый документ закрывается, а новый открывается.Тем не менее, это показывает тысячи объектов, и только один из них - это тот, который остался от предыдущего документа и все еще жив, хотя не должен.Этот один объект, который мне нужно идентифицировать.

Я предполагаю, что мне нужна функция в инструменте Распределения, которая вычитает все только что добавленные выделения и также вычитает все выделения, которые существовали после запуска - чтоостанутся элементы, созданные новым документом, но не выпущенные с тех пор.Есть ли какой-нибудь способ получить наборы собранных объектов, сгруппировать их в наборы и выполнить операции с наборами, как это?Скорее всего, нет.

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

О, и статический анализатор тоже не помогает.

Ответы [ 2 ]

8 голосов
/ 23 февраля 2011

Кажется, я понял это:

Секрет заключается в правильном использовании кнопки Mark Heap :

Пока я пробовал только один раз до и один раз после загрузки нового документа.

Но когда я к этому три раза (загрузить, Heapshot, загрузить, Heapshot, загрузить, Heapshot), тогда средний Heapshot будет перечислять объекты, которые все еще живы только между двумя загрузками документов вокруг это именно то, что я искал.

3 голосов
/ 22 февраля 2011

Я бы подумал, что инструментальный инструмент будет идеальным для этого, просто отследите распределения (а не только утечки) и откройте / закройте несколько документов, чтобы просмотреть эти распределения, проходящие через ... В конечном итоге нажмите на все еще выделенные области, чтобы увидеть, что все еще выделяется и, вероятно, позволит вам обработать «дерево выделения», чтобы найти любой корневой объект (ы), который все еще должен быть освобожден.

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

...