Подтвердить что ты не робот

Ошибка iOS без ошибки или трассировки стека

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

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

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

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

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

РЕДАКТИРОВАТЬ Я запустил приложение в приложении отслеживания памяти инструментов и увидел, что он довольно устойчив к камню около 2 МБ. Поэтому не думайте, что это проблема памяти. Но после рассмотрения эта скальная устойчивая 2 МБ кажется аномально низкой. Есть ли шанс, что инструменты не собирают распределения CoreGraphics?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Затем при сбое приложения нажмите "0 objc_exception_throw" в разделе "1" enter image description here

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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