Приложение iPhone падает и не оставляет после себя файл журнала .crash - PullRequest
4 голосов
/ 24 апреля 2009

Я работаю над обнаружением серьезной ошибки, которая происходит в моем коде. Проблема в том, что ошибка совершенно случайна и может произойти либо через 9 минут после запуска приложения, либо через 30 минут. Я пошел дальше и добавил потрясающий PLCrashReporter в свой проект (http://code.google.com/p/plcrashreporter), и он отлично работает для простых ошибок. Кроме того, когда у меня есть сомнения, я перейду к журналам сбоев, найденным в ~ / Library / Logs / CrashReporter / MobileDevice / и запускает symbolicatecrash в журнале сбоев. Этот + GDB в конечном итоге обнаружит любую ошибку, кроме той, с которой я столкнулся сейчас.

Видимо, природа этой ошибки не позволяет правильно записать в хранилище даже журналы сбоев Apple. Это показывает, когда я синхронизирую свой iPhone или iPod Touch с iTunes и запускаю symbolicatecrash в моем приложении:

sf$ symbolicatecrash foo.crash 
No crash report version in foo.crash at /usr/local/bin/symbolicatecrash line 741.

Возможно, мое приложение вообще не оставляет отчет о сбое, а завершает работу из-за проблем с памятью. Я действительно вижу applicationWillTerminate: выполнение моего оператора NSLog перед выходом в моем делегате приложения. Тем не менее, после запуска приложения через ObjectAlloc, мое приложение никогда не достигает> 2,08 МБ использования. Хотя, если я читаю правильные результаты, я выделил более 28 МБ памяти на протяжении всего периода выполнения теста.

Еще раз спасибо за все.

1 Ответ

5 голосов
/ 24 апреля 2009

Пара предложений:

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

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

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

Избавившись от очевидного / легкого, оно становится более неясным. Скорее всего, вы повредите свою кучу или стек где-то по пути, переполнением буфера, повторным использованием недопустимого указателя и т. Д., И т. Д. Вот несколько вещей, которые нужно попробовать:

  1. Попробуйте запустить с NSZombieEnabled = YES в переменных окружения. Это поможет вам найти повторное использование освобожденных объектов. Тем не менее, он оказывает огромное влияние на использование памяти, поэтому может не подходить для всех. Вот статья Apple , касающаяся NSZombie (среди прочего).

  2. При запуске в имитаторе iPhone используйте пункт «Предупреждение о симуляции памяти» в меню «Оборудование», чтобы вызвать состояние нехватки памяти - это может вывести ошибки в этом коде, которые в противном случае выполняются в непредсказуемое время.

  3. И последнее, но не менее важное: выполните поиск в своем коде везде, где вы используете низкоуровневые функции манипулирования памятью C - malloc, calloc, realloc, memcpy, strcpy, strncpy и т. Д. - и убедитесь, что размеры буфера соответствующие.

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