Ответ 1
Из-за отсутствия лучшего решения, и, если это не очевидно, перетащите приложение в NSLogs, чтобы окружить его, затем сверните глубже оттуда через точки останова и/или дополнительные журналы.
Нелегко отслеживать сбой в приложении iPad. Трудность на самом деле связана с тем фактом, что при сбое приложения нет ошибок или трассировки стека. Он просто уходит, как Кейзер Соз, "И вот так, пуф, он ушел".
Я реплицировал крах как на симуляторе, так и на устройстве. Есть нулевые журналы устройств, ничего в консоли и т.д.
Я знаю, что во время сбоя в фоновом потоке происходят некоторые операции CoreGraphics
. Как правило, три или около того NSOperations пинают некоторые смеси изображений.
Смешивание состоит из вызовов CGContext * (DrawImage, SetBlendMode, SetAlpha и т.д.). NSOperation обращается к делегату в основном потоке для обработки изображения и устанавливает его в UIImage
, поэтому он не должен быть конфликтом основного потока пользовательского интерфейса, но в данный момент я ничего не обесцениваю.
Есть ли какие-то трюки Xcode, которые мне не хватает, чтобы точно отслеживать, что происходит? Или, по крайней мере, лучше понять, где проблема?
РЕДАКТИРОВАТЬ Я запустил приложение в приложении отслеживания памяти инструментов и увидел, что он довольно устойчив к камню около 2 МБ. Поэтому не думайте, что это проблема памяти. Но после рассмотрения эта скальная устойчивая 2 МБ кажется аномально низкой. Есть ли шанс, что инструменты не собирают распределения CoreGraphics?
Из-за отсутствия лучшего решения, и, если это не очевидно, перетащите приложение в NSLogs, чтобы окружить его, затем сверните глубже оттуда через точки останова и/или дополнительные журналы.
Попробуйте прочитать регистры.
Всякий раз, когда мое приложение падает без ошибок, в большинстве случаев я обнаружил исключение в регистрах.
Сначала перейдите на вкладку "Исключения" и "Добавить точку останова исключения", используя + в левом нижнем углу.
Затем при сбое приложения нажмите "0 objc_exception_throw" в разделе "1"
Наконец, в консоли введите:
po $rax (обычно исключение находится в 'rax')
(вы должны увидеть выход исключения на консоли)
Надеюсь, что это поможет.
Супер поздний ответ, но я обнаружил, что использование try/catch помогает предоставить информацию, когда я не могу получить трассировку стека, и мое приложение вытаскивает Keizer Soze.
@try
{
// suspected code causing crash/errors
}
@catch (NSException *exception)
{
NSLog(@"Exception: %@", exception);
}
В моем случае это было связано с тем, что в схеме было включено "Объекты зомби", чтобы помочь найти проблему, которая в конечном итоге вызывала у нее нехватку памяти и сбой.
В моем случае это было из-за плохого выходного соединения в раскадровке.
Проверьте с помощью точки останова, если вызов метода viewDidLoad
для UIViewController
, который будет загружен. Если нет, проверьте свои выходные соединения в раскадровке.
Неправильное подключение отключает приложение без ошибок или трассировки стека.
Мне интересно, что случилось с ошибкой this class is not key value coding-compliant for the key
, которая была показана в старых версиях XCode.
В моем случае это было связано с выпуском объекта. Обычно это означает, что сообщение отправлено на освобожденный экземпляр или что-то в этом роде, но это не так. Я проверил журналы iPhone и нашел это: KERN_INVALID_ADDRESS, с которым я столкнулся в Google и наткнулся на это: KERN_INVALID_ADDRESS
Включенные объекты зомби и обнаружили, что я пытался использовать освобожденный экземпляр. Он также рассказал мне, какой объект он был в журналах впоследствии.
Надеюсь, это поможет будущим посетителям.