#iphone #objective-c #xcode #debugging
#iPhone #objective-c #xcode #отладка
Вопрос:
как я могу отлаживать приложения для iPhone в Objective-C, XCode
я имею в виду, что ок, XCode и режим отладки в порядке, но когда мое приложение вылетает из BAD_ACCES (или что-то в этом роде. улыбчивый) я просто получаю трассировку для сборки
когда я отлаживаю C и, допустим, хочу получить доступ к недопустимому указателю, я получаю трассировку прямо к строке кода, где все произошло сбой… здесь я просто получаю трассировку многих внутренних функций в сборке, поэтому я понятия не имею, что и где пошло не так
возможно, какая-то проблема с выпуском / сохранением, но как я могу это выяснить?
Спасибо
Комментарии:
1. Вы пробовали выполнять сборку и анализ? Хотя это не отладка в режиме реального времени, это должно помочь вам разобраться с утечками и чрезмерным выпуском.
Ответ №1:
Здесь мы приводим полный ответ:
Я посмотрел на ваше приложение и думаю, что есть проблема с комбинацией UINavigationController и асинхронной HTTP-загрузкой в двух местах. Включение zombies действительно выявило эти две ошибки. Первое, что я смог воспроизвести, второе выскакивало несколько раз, а затем больше не появлялось.
*** -[DetailViewController respondsToSelector:]: message sent to deallocated instance 0x56d6030
*** -[SearchViewController respondsToSelector:]: message sent to deallocated instance 0x56daa10
Я только что ограничил свою пропускную способность, чтобы проверить, связаны ли эти ошибки с http-запросами. Посмотрите на [Регулирование пропускной способности на Mac][1], чтобы настроить медленное соединение. Я установил его равным 5 КБ / сек.
Первая ошибка возникает, если вы очень быстро переходите к деталям, а затем снова на два уровня вверх и в качестве последнего действия, вызывающего ошибку: нажмите на поиск. Трассировка стека показывает
#2 0x004545b8 in -[UIWebView webView:decidePolicyForMIMEType:request:frame:decisionListener:]
и есть несколько открытых потоков, поэтому, если посмотреть на выпадающий список, там есть webThread. Показ этого потока показывает, что что-то происходит с webview, загружающим URL-адрес detailPages. Это указывает на то, что webview фактически завершил загрузку в отдельном потоке и не смог подключиться обратно к самому webview [DetailViewController respondsToSelector:]
. Это можно легко проверить: удалите загрузку запроса для webview: я не смог воспроизвести ошибку.
Решение проблемы 1 Проблема легко устраняется, поскольку webview не выпущен при освобождении. Также рекомендуется устанавливать для делегатов значение nil объектов, но в данном случае это необязательно.
- (void)dealloc {
webView.delegate = nil;
[webView release];
}
Вторая ошибка
Трассировка стека показывает
CLLocationManager onClientEventLocation:
Ошибка решения
Аналогично ошибке 1, установите для делегата значение nil и отпустите LocationManager.
Когда ваше приложение выходит из строя, вы не можете открыть отладчик, в левом окне вы можете увидеть трассировку стека. Вы можете дважды щелкнуть любую строку, которая переместится в правильное положение в вашем коде (если вызываемый метод принадлежит вам).
Перейти к проекту-> Редактировать активный исполняемый файл-> Вкладка Аргументы Добавьте переменную в нижнем окне, нажав на
Name:NSZombieEnabled
Value:YES
При этом выполняется попытка преобразовать адреса памяти в имена классов для устранения серьезных избыточных ошибок.
Чтобы узнать об утечках памяти, откройте «Выполнить»-> «Выполнить с помощью performance tool»-> «Утечки». Это откроет инструменты, которые являются отличным инструментом для поиска утечек.
Комментарии:
1. да, но в stacktrace я получаю кучу внутренних вызовов, и ни один из моих собственных
2. Можете ли вы опубликовать скриншот трассировки стека? Здесь может быть подсказка, и да, не каждая строка может перейти к вашему коду, поскольку это код Apple, и он не открыт.
3. Это интересно, можете ли вы указать какой-нибудь код, что и когда возникает эта ошибка?
4. отправлю вам исходный код с описанием по электронной почте (он довольно маленький), если вы предоставите мне свой адрес электронной почты
5. Отправьте в nw в yanac точку de
Ответ №2:
Используете ли вы XCode 3? Если это так, я бы настоятельно рекомендовал перейти на XCode 4. Отладчик в XCode 4 по сравнению с этим великолепен. Это позволяет вам вернуться к коду и посмотреть, что именно вызвало сбой.