- [iOS] Просмотр системных логов
- Panic full iphone расшифровка
- Panic full iphone расшифровка
- Тема: Panic Full описание/расшифровка
- Panic Full описание/расшифровка
- 3 участника(ов) поблагодарили cooperlonely за его сообщение:
- Демистификация аварийных журналов iOS
- Что это за аварийный журнал и где его взять?
- (5) Состояние потока
- (6) Дамп памяти
- Демистификация с помощью символизации
- Сбои, вызванные нехваткой памяти
- Коды исключений
- В омут головой!
- Сценарий 1. Плохой код на завтрак
- Сценарий 2. Где эта кнопка?
- Сценарий 3. Закладкой больше, закладкой меньше.
- Сценарий 4. Леденец
- Что дальше?
[iOS] Просмотр системных логов
Существует несколько способов просмотреть логи с iOS-устройства.
1. Через само устройство — в этом случае посмотреть можно лишь только краш-репорты (crashlog), но ведь это самое то для тестировщика! Идем в «Settings» -> «General» -> «About» -> «Diagnostic & Usage» -> «Diagnostic & Usage Data» и смотрим все доступные отчеты о падении приложений. Единственная проблема заключается в том, что здесь нет удобного средства для экспорта этих самых отчетов. Тем не менее, при крайней необходимости можно скопировать нужный участок лога через стандартную функцию копирования текста.
2. Через XCode — к сожалению, среда разработки XCode доступна исключительно для MacOS. По этой и многим другим причинам было бы неплохо, если тестировщики iOS-приложений имели в своем распоряжении хотя бы Mac mini. Для просмотра краш-репортов нужно подключить iOS-устройство к компьютеру, нажать кнопку «Use for Development», после чего в разделе «Device Logs» уже можно непосредственно просматривать логи и, что не маловажно, импортировать их!
3. Через программу «iPhone Configuration Utility» — хотя основная функция этой утилиты заключается в настройки профилей для iOS-устройств, в ней имеется консоль, куда выводятся все логи с подключенного устройства. Незаменимая вещь для тестировщика. К тому же, утилита доступна и для Windows.
4. Через синхронизацию iTunes — каждый раз, когда вы синхронизируете свое iOS-устройство с iTunes на компьютере, логи сохраняются в следующие директории:
Windows XP
C:\Documents and Settings\ \Application Data\Apple Computer\Logs\CrashReporter\MobileDevice\
Windows Vista or 7
C:\Users\ \AppData\Roaming\Apple Computer\Logs\CrashReporter\MobileDevice\
Источник
Panic full iphone расшифровка
Сообщение отредактировал Богданы4 — 23.01.19, 23:11
Отправил свой Xs Max 512 Gb золото в СЦ:
— Хрустит верхний левый угол дисплея
— Хрустит заднее стекло все целиком
— При воспроизведении звука периодически не работает верхний динамик
— Еще есть какое то пятно внутри дисплея ( еле заметное )
— Заводская коцка стальной рамы задняя часть внизу справа:
Мне вот интересно, когда получу новый, то он будет из какой партии? Есть такое чувство, что продажи их хилые и будет та же самая первая косячная партия.
Есть уже кто то, кто поменял по гарантии?
Как получу новый, сразу отпишусь, что и как 🙂
Сообщение отредактировал Aleksandr10rus — 30.10.18, 22:29
Да есть, отвечу под спойлером своими цитатами из другой темы.
Есть ли те (обжёгшиеся и может быть не один раз с этой моделью), кто хочет вместо нее взять XR? Учитывая разницу в цене, после выхода XR, партии XS Max ввезенные в Россию к старту продаж не будут раскуплены никогда. Тот же функционал, почти такой же дисплей. и двукратная разница в цене.
Max обречён. Если с помощью iOS 12.1 Apple сильнее их не разведут по возможностям с XR, то шансов у линейки XS ну правда никаких
Может кому пригодится. хрустел XSm при скручиваниях и в районе логотипа (дисплей не скрипел!), в обмене по гарантии отказали. Мол, на работоспособность никак не влияет, мол хрипят все так и тд тд
В общем такие дела((
P.s. Если у кого-либо примут скрипучий корпус, отпишитесь, пожалуйста, какой сц
Сообщение отредактировал Mas_fuertee — 31.10.18, 22:28
Всем привет!
перешел недавно с X на XS Max 256 (дня 3-4 назад), и просто в легком ахире. почти все косяки что пишут у меня вылезли.
1 — скрипит задняя крышка в раене камеры и яблока.
2 — постоянно вырубается верхний динамик, и после обновления с 12 на 12.0.1 проблема не ушла.
кстати на днях интересовался этим вопросом в местном айсторе, сказали 1й раз слышат про проблему с динамиком, подрубили у себя там к компу, сделали диагностику как то, и показали мне что механически все исправно. динамики в порядке.
3 — зазоры мехду корпусом и экраном просто конские, листок бумаги пролезает. это у всех так?! какая после этого влагозащита может быть. если там щели такие.
4 — при обновлении с 12 на 12.0.1 или какая там была (перед 12.1). просто тупо завис на яблоке и кругом загрузки, после целого часа ожидания пришлось принудительно перегружать
5 — ах и да, прям с коробки на корпусе была коцка. apple вы серьезно?!
подскажите пожалуйста, интересует 2 вопроса:
1 — пропала ли проблема с вырубанием верхнего динамика в 12.1? или это все же брак и прошивками не исправить, нада менять?
2 — у вас тоже такие громадные щели между металическим корпусом и экраном, лист бумаги влезает?
Aleksandr10rus @ 30.10.18, 22:26
Отправил свой Xs Max 512 Gb золото в СЦ
Сколько дней будут держать не говорили? Я сегодня свой на диагностику отдал, сказали до 20 дней.
Вот здесь пишут, что нет: https://discussions.apple.com/thread/8551427/
Кто-то меняет, но опять сталкивается с тем же багом на новом телефоне, кто-то надеется, что баг софтовый и эппл когда-нибудь его исправит.
Пока непонятно что делать.
А у меня под задним стеклом какое-то пятнышко, на пылинку похоже. Отчетливо видно, что именно под стеклом. Особо не парюсь, но думаю, может тоже по гарантии обратиться?
И еще вопрос: покупал в МТС, мне сказали, что гарантия 2 года. Вот что-то не пойму, так 2 года или один? На сайте табличка есть, что гарантия Эплл 1 год, но по закону о защите прав потребителей 2 года. Может кто объяснит?
Источник
Panic full iphone расшифровка
When restarting the iPhone / iPad, to make it easier to do diagnostics and not to solder everything, go to Settings-Privacy-Analytics and improvements-Analytics data-find the record of the last reboot and look for keywords in it. Mostly in the logs there are abbreviations such as prs (pressure), mic (microphone), ALS (Ambient Light Sensor). Records of lines and elements from diagrams are also common, so if you do not find something from my records, you can turn on your wit yourself and try to decipher this or that log. Keep in mind that the log may not be written or not completely written, try to wait for another reboot and watch the log. I will keep updating these records. PRO-mobile, Telegram @iKolhoznik.
«AOP PANIC — PressureController» — Barometer
This error occurs mainly on iPh X and above, there is a barometer on the system cable at the bottom near the left microphone.
«ANS / ANS2» — NAND
Mostly due to NAND, but look for keywords in the logs.
“SD: 0 Missing sensor (s): TG0B” — battery / TIGRIS
The device does not see the battery.
“AOP PANIC — SCMto: 0 – prox” — PROXIMITY
A proximity sensor, usually after water, causes the phone to reboot.
«Kernel data abort» — CPU
Mainly because of the processor blade or the coils along the buck lines. Also in the log, there are sometimes specific lines and elements from the diagrams.
“Missing sensor (s): mic1” — Microphone
Often after water or mechanical stress.
mic1 is the bottom left microphone.
mic2 — next to the flash / flashlight.
mic3 — next to the front camera.
mic4 is the bottom right microphone.
“SD: 1 Missing sensor (s): Prs0” — Barometer
The barometer is damaged or its line.
«AppleSocHot: hot hot hot» — CPU / CP
Met only on iPhone 7 models.
Mainly because of the CP, but I also met a break along the AP_TO_PMU_SOCHOT_L line from the CPU to the CP.
“L2C / LLC” — North amplifier
Met on many models, sometimes there is a problem in the front loop and the punched LX coil for sound amplification.
«Prev-next / LSU» — Quartz clock generator
Only met on iPhone 5c.
“NO pulse on” — Taptic Engine
Often the connector is corroded.
“Nvme” — NAND
Nand with PCIE bus.
“Lm3539″ — Backlight Driver
On Plus models, to find out which of the two, look in the log for the i2c line.
“Mic-temp-sens2″ — mic2
Microphone next to flash / flashlight. Often found on iPhone 11.
«Kernel instructglon fetch Abort» — CPU
Termination of the CPU core.
“SCL display PMU” — Image driver
“GFX GPU” — CPU
Cessation of the CPU, only met on iPhone 8 models, often due to words in the board.
“H3K5 Tglon” — Audio Codec / Amplifiers
“SMC PANIC ASSERTION” — Processor / Top Board
Met on iPhone X and above models.
“SEP ROM to glon SMC DATA ABORT” — CPU
It can also be any item that has certificates.
“EMemory apcie” — NAND
“CP_COM_NORM REQUEST” — CPU / NAND / CAMERA
Ambiguous error, search the log for more keywords.
“Dart-dispo SMMU error” — Main camera
«Firmware fatal» — software
The flashing helps.
“Initproc exited” — Crystal Oscillator
“Invaild queue element linkage” — NAND
«AGXG10P BO NMI» — Failure of layers in the board
Punched sleeves / bushings.
«Apple tristar2″ — Tristar »
Charge controller or its lines between the tiger and tristar.
“PMP NMI FIQ power (1) -failed to transition” — CPU / coils / KP
Ambiguous error.
«Void applesynopsysMIPID SIC glontroller» — Front ribbon cable
“AppleBCMWLAN” — WF / BT
“AOP PANIC” — Ambiguous error, look for keywords in the log.
«Ememory» — Nand
Mostly on iPhone 5s / 6.
“Anc-postnand.c1260 asser failed link” — Nand
“Stacks + routined” — battery
Found mainly on iPad.
«AGXK AGXAcceletor» — Gyroscope / Accelerometer
“Apcie (0: s3e)” — NAND
“Sleep \ wake hang detected” — WF / codec / amplifiers
Ambiguous error freezing in sleep mode, look for keywords in the log.
“WKDMD ERROR code 0x2” — Memory error
Get Error 14 (APFS) on firmware,
«Apple PPM» — Lightning / Tristar / Tigris
The error occurs while charging.
Sorry my bad eng
Источник
Тема: Panic Full описание/расшифровка
Опции темы
Отображение
Panic Full описание/расшифровка
Парни привет. Подскажите есть у кого подобный журнал?
Губа не дура ) может вы конкретизируете желаемое, ошибок там сотни и не всегда указанная ошибка является следствием указанной в панике причины, порой это косвенная причина.
Есть трехстраничный документ от китайца с распространенными паник и возможными причинами, их вызвавшими, если вы этот док подразумеваете, то оно есть в инсте среди старых постов @faetrain, например.
Пытаюсь найти, и на разных языках..
Так же, как есть ошибки при прошивке, и они в свободном доступе прописаны.. и в итоге так же « косвенно/обобщённо»
Нарыл у какого-то португальца на видео ворд файл с записями, завтра буду грабить.
Сюда выложу, кто шарит тот поймёт.
Кому надо, тот дополнит
Кто шарит, у того давно есть) дополнять нечем, все обобщенно, как и по ошибкам при прошивке, кто вник в суть, тому эти шаблоны не нужны, а кто не вник, ему и не надо пока, только гуще чаща станет.
3 участника(ов) поблагодарили cooperlonely за его сообщение:
клево вы за всех решили форум в топку, все ж в инсте и ютубе есть.
А зачем разжевывать подробности тем, кто в этом пока не понимает? Кто хочет понять, тот нужную строку логи вобьет в гугл, найдет несколько результатов, переведёт и проанализирует — будет польза и, возможно, результат. Дальше будет легче. Кому надо и кто имеет желание, осилит без проблем. А кто вообще не понимает предмета, для чего ему лишняя информация? Эти молчаливые читатели находят на форумах знакомые слова из больших тем и только по этим знакомым словам и предпринимают действия. Чаще всего они меняют “u2”, потому что остальные слова и действия им не знакомы. И вот такой увидел расшифровку лога, где идет ругань на “missed 1 sensor” в «thermalmonitord” и совет проверить “thermal circuit” и пошел жарить все термодатчики и кп в айфон икс эс, например. А там проблема в шлейфе или акб. Зачем ему эта инфа?
тоесть гугл все равно может найти информацию по нужной строке лога где угодно, но лучше не здесь такая я переспрашиваю у вас логика*? Если информацию все равно можно найти то почему одним из вариантов, где она лежит не должен быть и этот ресурс?
Гугл не найдет «снимите тот резистор и проверьте ту цепь».
Гугл по правильному запросу даст ссылки на гитхаб и прочие ресурсы, где разбираются как конкретные строки, так и общее направление сути паника. Это много букв на не русском и это надо уметь анализировать , рецептов в виде солюхи там нет.
Вот вам, желающим постигать смыслы, для начала:
https://faisalmemon.github.io/ios-cr. eption-section
Последний раз редактировалось cooperlonely; 19.09.2020 в 18:55 .
Источник
Демистификация аварийных журналов iOS
Прежде чем отправить в AppStore ваше приложение, вы долго тестируете его, чтобы убедиться, что ваше приложение работает безупречно. Оно отлично работает на вашем устройстве, но после того, как приложение попало в App Store, некоторые пользователи сообщают, что оно «вылетает»!
Если вы похожи на меня, то вы хотите, чтобы ваше приложение было на пять с плюсом. Значит, вы возвращаетесь в свой код, чтобы исправить сбой… а куда надо смотреть?
Вот когда пригодятся аварийные журналы iOS. В большинстве случаев, вы получите очень подробную и полезную информацию о причинах аварии, это вроде обратной связи от хорошего учителя.
В этом уроке вы узнаете, как выглядят аварийные журналы, а также как получить аварийный журнал из iOS-устройства и iTunes Connect. Вы узнаете о символизации и о том, как вернуться от аварийного журнала назад, в код. Мы также займёмся отладкой приложения с ошибками, которые могут привести к сбою в определенных ситуациях.
Что это за аварийный журнал и где его взять?
Когда приложение «падает», то есть аварийно завершает свою работу на устройстве iOS, операционная система создает отчет о сбое или аварийный журнал. Этот журнал сохраняется на устройстве.
Вы можете найти много полезной информации в аварийном журнале, в том числе те причины, по которым приложение аварийно завершило работу. Как правило, там есть полная трассировка стека каждого исполняемого потока, так что вы сможете увидеть, что происходило в каждом потоке в момент аварии, а также определить поток, где произошла катастрофа.
Есть много способов, как получить аварийный журнал с устройства.
Устройство, которое синхронизируется с iTunes, хранит свои аварийные журналы на ПК. В зависимости от ОС, вот места, где их можно найти:
Windows XP:
Тут четыре колонки:
- Номер фрейма — в данном случае, 2.
- Название модуля — в этом случае, XYZLib.
- Адрес функции, которая была вызвана — в данном случае, 0x34648e88.
- В четвертой колонке две части, базовый адрес и смещение. Тут это 0×83000 + 8740, где первое число указывает на файл, а вторая — на строку кода в файле.
(5) Состояние потока
Этот раздел содержит значения в регистрах на момент сбоя. Обычно этот раздел не нужен, потому что трассировка потоков уже дала вам необходимую информацию, чтобы решить вашу проблему.
(6) Дамп памяти
В этом разделе перечислены все модули, которые были загружены в память на момент сбоя.
Демистификация с помощью символизации
Первый взгляд на трассировку потоков говорит о том, там нет смысла. Ты привык работать с именами функций и номерами строк, а не загадочными письменами, вроде этого:
Процесс преобразования этих шестнадцатеричных адресов исполняемого кода в имена методов и номера строк называется символизация (symbolification).
Когда вы получаете аварийный журнал от устройства используя Органайзер Xcode, то символизация автоматически происходит через несколько секунд. Строчка из журнала сбоя выше после символизации выглядит так:
Чтобы Xcode смог символизировать аварийный журнал, он должен иметь доступ к файлу приложения, который был загружено в App Store, и DSYM-файлу, который был создан при компиляции приложения. Тут должно быть точное соответствие версий, в противном случае аварийный журнал не может быть полностью символизирован.
То есть, важно сохранять каждую сборку, которую вы распространяете среди пользователей. Когда вы архивируете ваше приложение перед отправкой, Xcode сохраняет откомпилированный файл. Вы можете найти все архивы вашего приложения в Xcode Organizer, вкладка Archives.
Примечание: Вам нужно хранить и откомпилированный файл приложения и dSYM-файл, чтобы иметь возможность в полной мере символизировать отчеты о сбоях. Вы должны архивировать эти файлы для каждой сборки, которую вы выкладываете в iTunes Connect.
DSYM-файл и откомпилированный файл связаны друг с другом на уровне сборки, и последующая версия, даже из тех же самых исходных файлов, не будет работать с файлами из других сборок.
Если вы используете пункт меню Build and Archive, файлы будут сохранены в нужном месте автоматически.
Сбои, вызванные нехваткой памяти
Журнал сбоя, вызванного нехваткой памяти немного отличается от обычных аварийных журналов и мы рассмотрим его отдельно.
При нехватке памяти, система виртуальной памяти посылает сообщение об этом приложениям с просьбой освободить память. Такие сообщения направляются всем запущенным приложениям и процессам.
Если памяти всё равно не хватает, система может завершить фоновые процессы, чтобы уменьшить нагрузку на память. Если достаточный объем памяти был освобожден, ваше приложение будет продолжать работать и отчёт о нехватке памяти не будет сгенерирован. В противном случае, ваше приложение будет аварийно завершено iOS, и будет создан аварийный журнал.
В аварийных журналах, созданных при нехватке памяти, нет раздела с трассировкой потоков приложения. Вместо этого, есть отчёт об использовании памяти каждым процессом с указанием количества страниц памяти. (На момент написания документа – одна страница равняется 4 Кб.)
Пометка (jettisoned) рядом с названием процесса говорит о том, что процесс был завершён iOS, чтобы освободить память. Если такая пометка около вашего приложения, это означает, что ваше приложение было аварийно остановлено, так как использовало слишком много памяти.
Журнал сбоя, вызванного нехваткой памяти выглядит примерно так:
Когда ваше приложение прекращает работу из-за нехватки памяти, вам нужно исследовать то, как ваше приложение использует память и то как оно реагирует на предупреждения о нехватке памяти. Вы можете использовать утилиту Instruments, профили Allocations и Leaks, чтобы обнаружить утечки памяти. Если вы не знаете, как использовать эти инструменты, почитайте это руководство для начала.
И не забывайте о виртуальной памяти! Профили Leaks и Allocations утилиты Instruments не отслеживают графическую память. Вам необходимо при запуске профиля Allocations просмотреть данные профиля VM Tracker, чтобы узнать об использовании графической памяти.
Профиль VM Tracker по-умолчанию отключен. Для профилирования вашего приложения с VM Tracker, выберите строку с названием профиля VM Tracker в запущенной с профилем Allocations утилите Instrument, там поставьте флаг Automatic Snapshotting или просто нажмите кнопку Snapshot Now.
Как исследовать журнал аварийного останова, вызванного нехваткой памяти, мы рассмотрим ниже.
Коды исключений
Перед тем, как погрузиться в некоторые реальные аварийные журналы, поговорим ещё немного об интересной стороне аварийного журнала – о смешных кодах исключений.
Код исключения указывается в разделе № 3 (Исключение), см. приведенный выше пример. Есть несколько кодов исключений, которые могут возникнуть чаще, чем остальные.
Как правило, код исключения начинается с текста, потом одна или несколько шестнадцатеричных значений, которые являются процессор-специфичными кодами и которые могут дать вам информацию о характере сбоя. Эти коды могут сказать вам почему приложение аварийно остановлено, то ли из-за ошибки программирования, то ли из-за неверного доступа к памяти, то ли по какой-то другой причине.
Вот некоторые из наиболее распространенных кодов исключения:
- 0xbaaaaaad: Читается как «плоооохой». Код говорит о том, что это не аварийный журнал, а это stackshot – журнал, содержащий состояние стека системы в данный момент. Чтобы получить stackshot, нажмите одновременно на кнопку Home и любую клавишу регулировки громкости. Часто эти журналы создаются пользователями случайно и не указывают на ошибку.
- 0xc00010ff: Читается как «cool off» (остынь). Код говорит о том, что приложение было принудительно закрыто операционной системой в ответ на тепловое событие (стало горячо или холодно). Это может быть вызвано проблемой с конкретным устройством, или состоянием окружающей среды.
- 0x8badf00d: Читается как «ate bad food» (ели плохую еду). Этот код значит, что приложение было прекращено iOS по таймауту. Обычно это происходит из-за того, что время, которое потратило ваше приложение на запуск, останов или отклик на системные события было больше, чем нужно.
- 0xbad22222: Этот код означает, что ваше VoIP-приложение была прекращено iOS из-за слишком частых обращений.
- 0xdead10cc: Читается как «deadlock» (тупик). Код означает, что ваше приложение, находясь в фоновом режиме, занимало какие-нибудь системные ресурсы (вроде базы данных адресной книги).
- 0xdeadfa11: Читается как «deadfall» (западня). Код значит, что приложение было принудительно закрыто пользователем. Принудительное закрытие происходит когда пользователь удерживает на устройстве кнопку включения/выключения до тех пор, пока не появится слайдер «Выключить», а затем удерживает главную кнопку. Согласно документации Apple, принудительный выход является причиной исключения с кодом 0xdeadfa11, потому, что приложение к тому моменту перестало отвечать.
Примечание: Помните, что принудительное прекращение приложения, находящегося в фоне, путём удаления его из списка задач не вызывает создания аварийного журнала. После того, как приложение было приостановлено, оно может быть прекращено операционной системой в любое время. И аварийный журнал создан не будет.
В омут головой!
Теперь у вас есть вся основная справочная информация, чтобы нырнуть в омут аварийных журналов, а также исправить некоторые неприятные ошибки! Теперь основной сценарий развития событий:
Вы только что начали работу в Rage-O-Rage LLC. У компании есть хорошо продаваемое в App Store приложение — Rage Masters.
Ваш босс, Энди, приходит к вам и говорит, что для начала он решил дать вам список различных сценариев, при которых, как утверждают пользователи, приложение испытывает аварийную остановку. Ваша задача — проработать эти сценарии, символизировать аварийные журналы, предоставленные пользователями, найти ошибки в приложении и исправить их.
Вы можете скачать исходный код приложения отсюда.
Примечание: Если вы хотите иметь на своём устройстве аварийные журналы, созданное этим приложением, то выполните следующие действия:
- Загрузите исходный код и откройте проект в Xcode.
- Подключите авторизированное iOS-устройство с корректным профилем (Provisioning Profile).
- Выберите iOS-устройство, а не Simulator в качестве цели на панели инструментов Xcode и запустите приложение.
- Как только на устройстве вы увидите экран приложения по-умолчанию (полноэкранное изображение приложения), нажмите кнопку остановки в Xcode.
- Закройте Xcode.
- Запустите приложение непосредственно на устройстве.
- Протестируйте описанные ниже сценарии, затем подключите устройство к ПК и получить аварийные журналы из Xcode.
Сценарий 1. Плохой код на завтрак
Из писем пользователей вашего приложения: «Мужик, твоя программа — отстой! Я скачал её на свой iPod Touch, iPhone и iPod Touch моего сына. На всех устройствах, она упала сразу после запуска. »
Другое письмо: «Я загрузила вашу программу, но она не запускается. Я в печали. »
Следующее письмо более конкретное: «Я не могу запустить вашу программу. Я скачал её на все мои устройства и все устройства моей жены. На всех устройствах программа вываливается при запуске. «
Да ладно, не принимайте близко к сердцу! Как любой из этих комментариев даст вам подсказку? Взгляните лучше в аварийный журнал:
Нашли в чем проблема? Код исключения — 0x000000008badf00d, и сразу после него, в журнале сказано:
Это значит, что приложению не удалось уложиться при запуске в отведённое для этого время и сторожевой таймер операционной системы прекратил работу приложения. Круто! Вы нашли причину, но почему (и что ещё более важно, где) это происходит?
Смотрим дальше журнал. Трассировку потоков принято читать в обратном порядке, снизу вверх. Самый последний фрейм (25 фрейм: libdyld.dylib) – это первый вызов, затем фрейм 24, Rage Masters, main (main.m:16) и так далее.
Нам интересны фреймы, которые связаны с кодом вашего приложения. Так что игнорируйте системные библиотеки и фреймворки. Вот эта строчка нам интересна:
Приложение получило сбой в методе application:didFinishLaunchingWithOptions:, в 35-ой строке файла RMAppDelegate.m (RMAppDelegate.m: 35). Откройте Xcode и посмотрите на эту строку:
Да, вот оно! Синхронный вызов веб-сервиса? В главном потоке? В application:didFinishLaunchingWithOptions. Кто писал этот код?
Во всяком случае, теперь это ваша работа — исправить это. Этот вызов должен быть асинхронным, а еще лучше, должен быть выполнен в другой части приложения, после того как application:didFinishLaunchingWithOptions: вернёт YES.
Чтобы перенести вызов в другое место потребуются значительные изменения, поэтому, в данный момент, просто сделаем минимум изменений, просто, чтобы приложение аварийно не останавливалось при запуске. Вы всегда можете вернуться к этому вопросу и сделать это совсем правильно. Замените строку «плохого» кода (и три строки после неё) на асинхронную версию:
Сценарий 2. Где эта кнопка?
Пользователь пишет: «Я не могу отметить моего любимого персонажа закладкой. Когда я пытаюсь это сделать, приложение падает. «.
Другой пользователь: «Закладки не работают. Я вхожу в Подробную информацию, нажимаю на кнопку «Закладка» и БА-БАХ!»
Эти жалобы о многом не говорят, и существует куча причин, почему программа так себя ведёт. Посмотрим в аварийный журнал:
Код исключения — SIGABRT. Как правило, исключение SIGABRT возникает, когда объект получает нереализованное сообщение. Или, проще говоря, когда есть вызов несуществующего метода объекта.
Обычно этого не происходит, так как если вы вызываете метод «foo» объекта «bar», то компилятор выдаст ошибку, что метод «foo» не существует. Но когда вы косвенно вызываете метод используя селектор, компилятор не сможет определить, существует или нет метод у объекта.
Вернёмся к аварийному журналу. Он говорит, что аварийный останов произошёл в потоке №0. Это значит, что у нас, скорей всего, ситуация, когда метод был вызван объектом главного потока, там где объект не реализует метод.
Если вы продолжите читать журнал трассировки, вы видите, что единственный вызов, связанный с вашим кодом – это фрейм 22, main.m: 16. Это не особенно помогло.
Посмотрим на вызовы фреймворков, и видим это:
Это не ваш код. Но по крайней мере, есть подтверждение, что был вызов нереализованного метода объекта.
Идём в RMDetailViewController.m, где реализована кнопка закладок. Найдём код, который делает закладку:
Тут всё выглядит нормально, так что проверим сториборд (XIB файл) и убедимся, что кнопки подключены правильно.
Вот оно! В MainStoryboard.storyboard, кнопка связана с bookmarkButtonPressed: вместо bookmarkButtonPressed (обратите внимание на двоеточие в конце, которое говорит о том, что у метода есть параметр). Чтобы это исправить, замените название метода на такой:
Конечно, вы можете просто удалить связь с неправильным методом в XIB-файле и связать событие к правильным методом. В любом случае сработает.
И вот ещё одна причина аварийного останова устранена.
Сценарий 3. Закладкой больше, закладкой меньше.
Ещё одна жалоба от пользователя: «Я не могу удалить закладку на персонажа из окна закладок. «. И ещё одно письмо о том же: «Если я пытаюсь удалить персонажа из закладок, приложение падает. «
К этому моменту, вы уже привыкли, что письма от пользователей не бывают полезными. К аварийным журналам!
Этот журнал очень похож на предыдущий аварийный журнал. Тут тоже SIGABRT исключение. Может тут та же причина: отправка сообщения объекту, у которого не реализован метод?
Давайте посмотрим трассировку, какие методы вызывались. Начните с нижней части. Последний вызов на ваш код в Rage Masters был в фрейме №6:
Это вызов метода UITableViewDataSource. И что? Если вы не уверены, что компания Apple реализовала этот метод — можете переписать его, но не похоже, что это так. Кроме того, это дополнительный, не обязательный метод делегата. Так что проблема не в вызове нереализованного метода.
Посмотрим на фреймы дальше:
В фрейме №5, UITableView вызывает другой собственный метод, deleteRowsAtIndexPaths:withRowAnimation: а потом вызывается _endCellAnimationsWithContext:, который выглядит как внутренний метод Apple. Затем, происходит исключение фреймворка Foundation, handleFailureInMethod:object:file:lineNumber:description:.
Если собрать это вместе с жалобами пользователей, то это выглядит так, как будто вы имеете дело с ошибкой в процедуре удаления UITableView. Идём в Xcode. Вы знаете, куда идти? Может ли это сказать нам аварийный журнал? Смотрим строку №68 в RMBookmarksViewController.m:
Нашли, где проблема? Я буду ждать, пока вы не найдёте.
Кто-то забыл про источник данных! Код удаляет строку в представлении, но не меняет источник данных. Чтобы это исправить, замените код на следующий:
Вот так будет с каждой ошибкой! Бац! Бах! Бум!
Сценарий 4. Леденец
Письмо: «Мое приложение падает, когда персонаж лижет леденец. «. Другой пользователь: «Я нажимаю кнопку «Лизнуть леденец» несколько раз, а затем приложение вылетает!»
Вот аварийный журнал:
Этот журнал очень отличается от тех, что мы видели до сих пор!
Это аварийный журнал нехватки памяти iOS 6. Как уже говорилось ранее, аварийный журнал нехватки памяти отличается от других аварийных журналов, потому что он не указывает на конкретный файл или строку кода. Вместо этого, он рисует картину, сложившуюся в памяти устройства в момент ситуации, которая привела к аварийному останову.
Заголовок, впрочем, похож на заголовок обычного аварийного журнала: те же поля Incident Identifier, CrashReporter Key, Hardware Model, OS Version и другие.
Вот следующий раздел специфичен только для аварийный журнал нехватки памяти:
- Free pages – количество свободной памяти в страницах. Каждая страница соотвествтвует примерно 4КБ, поэтому наш журнал говорит о свободной памяти в размере около 3 872 КБ (или 3,9 МБ).
- Purgeable pages – часть памяти, которая может быть очищена от предыдущего использования и снова использована. В нашем журнале её 0 КБ.
- Largest process – имя приложения, которое использовало самое большое количество памяти на момент аварийного останова, и там написано наше приложение!
- Processes — список процессов, а также как они использовали память во время аварии. Тут имя процесса (первый столбец), уникальный идентификатор процесса (второй столбец) и количество страниц, используемых в процессе (третий столбец). В последнем столбце (State), вы видите состояние каждого приложения. Как правило, приложения, которые привели к аварийному останову находятся в состоянии frontmost. И тут наш Rage Masters, который использует 28591 страниц (или 114 364 МБ) — это много памяти!
Как правило, самый большой процесс и процесс в состоянии frontmost – это один и тот же процесс, а также это тот процесс, который привел к аварийному останову из-за нехватки памяти. Но вы можете увидеть некоторые случаи, когда крупнейшие процессы и процессы в состоянии frontmost – это не то же самое. Например, если вы видите, что больше всего памяти потребляет процесс SpringBoard, можете игнорировать его, потому что SpringBoard — это главный процесс, отвечающий за главный экран в Apple iOS. С него запускаются и загружаются все установленные приложения. Он всегда активен.
При нехватке памяти iOS посылает предупреждение о низком уровне памяти активному приложению и завершает фоновые процессы. Если активное приложение продолжает увеличивать использование памяти, iOS завершает его.
Чтобы найти причину проблем с нехваткой памяти, необходимо профилировать приложение, используя утилиту Instruments. Если вы не знаете, как это делать, есть учебник. Вместо этого, мы решим проблему «в лоб», просто обработаем в нашей программе событие о нехватке памяти.
Перейдите в Xcode в RMLollipopLicker.m. Это там реализован контроллер представления лизания леденца. Взгляните на исходный код:
Когда пользователь нажимает кнопку запуска, приложение запускает в фоновом режиме процедуру lickLollipop несколько раз, а затем обновляет на экране количество лизаний. lickLollipop читает большую строку NSString из PLIST-файла и добавляет её в массив. Эти данные не критичны, и могут быть воссозданы, не влияя на работу пользователей.
Заведите хорошую привычку — пользоваться любой ситуацией, когда можно очистить данные, которые можно потом восстановить без ущерба для пользователей. Так вы освобождаете память, что делает вероятность появления предупреждений о нехватке памяти менее вероятной.
Итак, как можно улучшить код в нашем случае? Реализовать didReceiveMemoryWarning и избавиться от данных в массиве lollipops:
И всё будет хорошо!
Что дальше?
Ура, вы прошли через все четыре сценария развития аварийных ситуаций! Ваше приложение работает намного лучше, и вы получили важные навыки отладки по ходу обучения.
Источник