Как отлаживать приложения для iPhone

#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 по сравнению с этим великолепен. Это позволяет вам вернуться к коду и посмотреть, что именно вызвало сбой.