2011-01-26 1 views
28

Имея трудное отслеживание сбоя в приложении iPad. Трудность на самом деле связана с тем фактом, что при сбое приложения нет ошибок или трассировки стека. Он просто уходит, как Кейзер Соз, «И вот так, пуф. Он ушел».iOS Crash без ошибок или трассировки стека

Я воспроизвел авария как на симуляторе, так и на устройстве. Есть нулевые журналы устройств, ничего в консоли и т. Д.

Я знаю, что во время сбоя в фоновом потоке происходят некоторые операции CoreGraphics. Как правило, три или около того NSOperations пинают некоторые смешанные изображения.

Смешивание состоит из вызовов CGContext * (DrawImage, SetBlendMode, SetAlpha и т. Д.). NSOperation обращается к делегату в основном потоке для обработки изображения и устанавливает его в UIImage, поэтому он не должен быть конфликтом основного потока пользовательского интерфейса, но в данный момент я ничего не обесцениваю.

Есть ли какие-то уловки Xcode, которые мне не хватает, чтобы отследить, что именно происходит? Или, по крайней мере, лучше понять, где проблема?

EDIT Я запустил приложение в приложении для отслеживания памяти приборов и увидел, что он довольно устойчив к камню около 2 МБ. Поэтому не думайте, что это проблема памяти. Но после рассмотрения эта скальная устойчивая 2 МБ кажется аномально низкой. Есть ли шанс, что инструменты не собирают выделение CoreGraphics?

+1

Я никогда не занимался разработкой iOS *, но когда приложения iOS начали рушиться (и не оставляли никаких журналов), это в конечном итоге было проблемой с низкой памятью: закрытие всех приложений и перезагрузка устройства прояснили все. – Ken

+0

@ Ken - добавлено редактирование, связанное с низкой памятью. Благодарю. – MarkPowell

+0

Убедитесь, что вы не просто запускаете приложение, но и отлаживаете его. Чтобы проверить, убедитесь, что точки останова включены. –

ответ

9

Из-за отсутствия лучшего решения, и если это не очевидно, перетащите приложение в NSLogs, чтобы окружить его, затем будьте глубже оттуда, используя точки останова и/или дополнительные журналы.

16

Попробуйте прочитать регистры.

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

Сначала перейдите на вкладку «Исключения» и «Добавить точку останова исключения», используя + в левом нижнем углу. enter image description here

Затем, когда происходит сбой приложения нажмите на кнопку "0 objc_exception_throw" под тему 1 enter image description here

Наконец, в консоли введите:

  • регистр чтения (вы должны получить список регистров)
  • po $ rax (обычно исключение составляет «rax»)

    (вы должны увидеть выход исключений на консоли)

Надеюсь, это поможет.

+0

Вы сказали: «Обычно исключение находится в« rax ». Любые предложения о том, где еще попробовать? – Nerrolken

+0

@Nerrolken вы можете опробовать другие регистры из списка «rab» и т. Д. – shrishaster

+0

Большое спасибо, что это работает для меня! – Leo

2

Супер поздний ответ, но я обнаружил, что использование try/catch помогает предоставить информацию, когда я не могу получить трассировку стека, и мое приложение вытаскивает Keizer Soze.

@try 
{ 
    // suspected code causing crash/errors 
} 
@catch (NSException *exception) 
{ 
    NSLog(@"Exception: %@", exception); 
} 
+0

почему-то я никогда не видел эту работу. Каждый раз, когда я пытался использовать его, приложение вылетает одинаково. Никакое исключение не было поймано за меня. – SpaceDog

+0

Вы проверили @ Paul-Slocum ответ ниже? Кроме того, включение объектов зомби не бросает исключения Objective C. Хороший ответ здесь: http://stackoverflow.com/a/8738527/2907798. – dragonflyesque

+0

ДА. Когда я включаю это, приложение прекращается до тех пор, пока память не будет исчерпана, и он сработает без сообщений или не предоставит способ для отладки. Инструменты не показывают утечки в моем коде, но это интенсивность памяти. Поскольку зомби хранят выделенные элементы, он будет использовать всю память и сбой. – SpaceDog

0

В моем случае это было связано с тем, что объект был выпущен. Обычно это означает, что сообщение отправлено на освобожденный экземпляр или что-то в этом роде, но это не так.Я проверил журналы iPhone и нашел это: KERN_INVALID_ADDRESS, с которым я столкнулся в googled и наткнулся на это: KERN_INVALID_ADDRESS

Включил объекты зомби и обнаружил, что я пытался использовать освобожденный экземпляр. Он также рассказал мне, какой объект он был в журналах впоследствии.

Надеюсь, это поможет будущим посетителям.

1

В моем случае это было связано с тем, что в схеме было включено «Объекты зомби», чтобы помочь найти проблему, которая в конечном итоге вызывала у нее нехватку памяти и сбоя.

1

В моем случае это было из-за плохого выходного соединения в раскадровке. Проверить с помощью точки останова, если вызван viewDidLoad метод UIViewController для загрузки. Если нет, проверьте свои выходные соединения в раскадровке.

Неправильное подключение отключает приложение без каких-либо ошибок или трассировки стека.

Мне интересно, что случилось с ошибкой this class is not key value coding-compliant for the key, которая была показана в старых версиях XCode.

+0

Это повторяющаяся проблема для меня. Десятки торговых точек и один плохой. Без правильного сообщения об ошибке это похоже на попытку найти иглу в стоге сена. :( –

 Смежные вопросы

  • Нет связанных вопросов^_^