В большинстве случаев, когда программа Iphone дает сбой, компилятор показывает стек с полными нет, но эти нет не имеют для меня никакого смысла. Очень редко он указывает, где может быть проблема, и в основном это бесполезные нет. Как вы можете убедиться, что когда ваша программа падает во время разработки/тестирования, она показывает, в каком месте это вызывает этот сбой?
Отчет о сбое программы iPhone и стеке, отображаемый компилятором, совершенно бесполезен!
Ответы (3)
Моя жизнь разработчика iPhone была ужасной, пока я не нашел NSZombieEnabled. Добавление этого флага в ваш исполняемый файл поможет вам увидеть любые проблемы с памятью, сообщив вам, каково имя объекта, который находится в сбое.
Это работает, никогда фактически не освобождая объект, а обертывая его как «зомби» и устанавливая внутри него флаг, который говорит, что обычно он был бы освобожден. Таким образом, если вы попытаетесь получить к нему доступ снова, он все равно будет знать, что было до того, как вы совершили ошибку, и с помощью этого небольшого количества информации вы обычно можете вернуться, чтобы увидеть, в чем была проблема.
Это особенно помогает в фоновых потоках, когда отладчик иногда выдает любую полезную информацию.
Однако ОЧЕНЬ ВАЖНО ЗАМЕЧАТЬ: вам нужно на 100 % убедиться, что это только в вашем коде отладки, а не в коде вашего дистрибутива. Поскольку ничего никогда не выпускается, ваше приложение будет протекать, протекать и протекать. Чтобы напомнить мне об этом, я поместил этот журнал в свой appdelegate:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Ключевое слово, которое вы ищете, — «символизировать». Если у вас есть журнал сбоев с устройства, вы должны использовать символы солнца для него, чтобы трассировка стека давала вам номера строк.
Функция, которая у меня есть в моем .profile, чтобы помочь мне запустить команду:
function desym
{
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
По сути, вы помещаете пакет приложения, файл dsym, сгенерированный при сборке, и журнал сбоев в один и тот же каталог, а затем запускаете «dysm [имя файла журнала сбоев]», чтобы символы правильно отображались в трассировке стека.
Обратите внимание, что это должен быть тем же исполняемым файлом и файлом Dysm, которые вызвали сбой! Каждый раз, когда вы перекомпилируете, расположение вещей может меняться.
Список задач:
1) Отладка с включенной точкой останова
2) Добавьте глобальную точку останова: objc_exception_throw
Затем посмотрите в окно отладчика