Guard Malloc мгновенно обнаружил ошибку EXC_BAD_ACCESS. Почему бы не использовать все время? - PullRequest
6 голосов
/ 19 марта 2011

Я отлаживал печально известную ошибку EXC_BAD_ACCESS уже несколько дней.NSZombieEnabled = ДА ничего не предлагал.Стек вызовов менялся каждый раз, когда я получал ошибку, которая была однажды каждые 5 или 6 запусков.

Я видел совет по включению защиты malloc (который сейчас находится в редакторе схем для Xcode 4) на сайте Лу Франко: Понимание EXC_BAD_ACCESS .Как только я это сделал, моя программа остановилась именно на той линии, которая вызывала эту неуловимую ошибку.

Согласно своему описанию, guard malloc создает отдельные страницы для каждого malloc и удаляет всю страницу, когда освобождается память, таким образом сбивая программу при обращении к освобожденной памяти.Для общего развития, почему бы мне просто не охранять malloc все время?Кажется, легко ловить определенные типы ошибок памяти.Если я специально не тестирую управление памятью или производительность, есть ли у нее недостатки?

Ответы [ 3 ]

7 голосов
/ 19 марта 2011

Мало того, что он тратит адресное пространство, но и значительно замедляет вашу программу (потенциально до такой степени, что она не может использоваться даже на симуляторе).Я полагаю, для программы IOS, когда вы запускаете его на тренажере это немного спорный вопрос (память не является проблемой, и падение производительности не страшен ни), но, возможно, во имя лучшей практики вы не должнызапустить его постоянно.

3 голосов
/ 19 марта 2011

Выделение целой страницы 4K для пары байтов на malloc() тратит впустую адресное пространство очень быстро.

2 голосов
/ 01 декабря 2011

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

Я включаю GuardMalloc для отладки сбоя, который искажает стек.Часто они имеют objc_msgSend на вершине того, что осталось от стека.

С GuardMalloc предотвращаются случайные эффекты висячих указателей.Адрес в указателе нельзя использовать повторно, и его местоположение в памяти становится недействительным.Сбой произойдет почти сразу, задолго до того, как стек будет поврежден.Это отлично подходит для унаследованного кода C ++, а также для нового Objective-C.

Я оставляю другие средства отладки памяти на постоянной основе.

...