2009-11-08 2 views
2

У меня есть довольно странные проблемы в мое приложение iPhone, который, я думаю, связано с памятью поврежденным:Проблема с памятью iPhone OS - как отлаживать?

В какой-то момент, мне нужно отсортировать массив, который я делаю с -[sortArrayUsingFunction].

Результат неправильный, если я не выделил какую-либо память с чем-то вроде void *test = malloc(2 * sizeof(int)) перед вызовом метода или, например, вызов NSLog() (который никогда не вызывается) в функции сортировки.

Другими словами: сортировка работает только в том случае, если я немного увеличил память, которая использовалась до вызова функции сортировки. Я думаю, это связано с тем, что в какой-то момент память повреждается.

Как вы отлаживаете что-то вроде этого?

+0

Предполагаю, что вы используете NSMutableArray sortUsingFunction: context :? Вы должны опубликовать функцию сортировки; – TechZen

+0

Публикация функции сортировки не поможет, если вы не знаете (слишком сложный) контекст моего приложения. Я также не думаю, что проблема заключается в функции сортировки, потому что тогда она всегда терпит неудачу. – mrueg

ответ

3

Похоже, что некоторые из ваших кодов используют уже выпущенные объекты. Большая помощь в отладке такого рода ошибок содержится в замечательном техническом примечании Apple Mac OS X Debugging Magic, особенно в части foundation.

Для вашего случая я бы отключил пулы автоопределения (установив переменную окружения NSEnableAutoreleasePool=NO) или воспользовавшись функцией zombie (NSZombieEnabled=YES), чтобы найти места, где вы отправляете сообщения выпущенным объектам.

+0

Проблема, кажется, исчезает, когда я устанавливаю NSEnableAutoreleasePool = NO. Но я не получаю никаких сообщений при установке NSZombieEnabled, и если я не устанавливаю NSEnableAutoreleasePool в NO, но устанавливаю пул в nil в main.m (что должно быть эквивалентно), проблема все еще там ... Все по-прежнему очень странно, но проблема autorelease _might_. – mrueg

+0

Хорошо, теперь вы сейчас, что перевыпуск, вероятно, проблема. Сначала попробуйте статический анализатор (clang). Затем, если вы не найдете проблему, начните искать подозрительные объекты и сохраните их. Если проблема затем исчезнет, ​​вы знаете, какой объект выпущен до своего времени. –

+0

B.t.w .: Конечно, вы должны включить пулы автоопределения при включении обнаружения зомби. –

0

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

Возможно, вам стоит сохранить две копии массива и сравнить их с различиями. Распечатайте различия. Характер «мусора», который был введен в один из массивов, может дать нам подсказку о том, откуда он появился.

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