Что значит 8badf00d? - PullRequest
       21

Что значит 8badf00d?

39 голосов
/ 21 апреля 2009

Иногда мое приложение для iPhone вылетает со странным аварийным журналом, который читает код исключения 0x8badf00d. Трассировки стека показывают случайные снимки выполнения приложения, но ничего подозрительного. Это случается очень редко, и я не могу узнать, как это воспроизвести. Кто-нибудь знает больше об этом виде исключения и кода исключения?

Вот выдержка из моих аварийных журналов:

Тип исключения: 00000020
Коды исключений: 0x8badf00d
Выделенная нить: 0

Информация о приложении:
Не удалось деактивировать

Тема 0:
...
<ничего подозрительного здесь>
...

Неизвестный поток с неизвестным ароматом: 5, state_count: 1

Ответы [ 7 ]

85 голосов
/ 23 апреля 2009

0x8badf00d - это код ошибки, который генерирует сторожевой таймер, когда приложение запускается или завершается слишком долго. См. Apple Отчет о сбоях для приложений iPhone OS документ

9 голосов
/ 15 апреля 2016

Если вы получаете Exception Type: 00000020 и Exception Codes: 0x8badf00d, то это отчеты о сбое сторожевого таймаута Код исключения 0x8badf00d называется "ate bad food".

Наиболее распространенный reason for this crash is synchronous activity on main thread. Исправление - switch to asynchronous activity в главном потоке.

Screenshot for Apple document

См. Этот документ Apple для получения более подробной информации.

8 голосов
/ 21 апреля 2009

Это HexSpeak, см. Здесь: http://en.wikipedia.org/wiki/Hexspeak

1 голос
/ 24 апреля 2018

0x8badf00d exception поднят яблочным сторожевым таймером. Наиболее распространенной причиной сбоев сторожевого таймера в сетевом приложении является синхронная работа в сети в главном потоке. Здесь есть четыре фактора:

синхронная сеть - здесь вы делаете сетевой запрос и блокируете ожидание ответа.

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

длительные тайм-ауты - если сеть просто исчезает (например, пользователь едет в поезде, который идет в туннель), любой ожидающий сетевой запрос не будет выполнен, пока не истечет некоторое время ожидания. Большинство тайм-аутов сети измеряются в минутах, это означает, что заблокированный синхронный сетевой запрос в основном потоке может удерживать пользовательский интерфейс без ответа в течение нескольких минут за один раз.

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

watchdog - чтобы удержать пользователя отзывчивый интерфейс, iOS включает в себя сторожевой механизм. Если ваше приложение не отвечает на определенные события пользовательского интерфейса (запуск, приостановка, возобновление, завершение) вовремя, сторожевой таймер убьет ваше приложение и сгенерирует отчет о сбое тайм-аута сторожевого таймера. Количество времени, которое дает вам сторожевой таймер, официально не задокументировано, но оно всегда меньше, чем время ожидания сети.

Существует два распространенных решения:

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

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

Для получения дополнительной информации см. Apple docs .

1 голос
/ 21 апреля 2009

Это какая-то программистская идея шутки. Вы должны выбрать номер для своего кода, но номер не обязательно сам по себе ничего не значит. 8badf00d - это просто еще один способ записать число 2,343,432,205, и оно было выбрано потому, что выглядит «забавно», когда представлено в шестнадцатеричном виде для журнала исключений.

1 голос
/ 21 апреля 2009

Это код ошибки, добавленный разработчиком с хорошим чувством юмора. Поскольку в шестнадцатеричном формате используются как буквы, так и цифры, можно использовать шестнадцатеричные числа, которые выглядят примерно как английские слова, такие как «0xdeadbeef» и т. Д. Я уверен, что исключение имеет конкретное значение, но если нет серьезных симптомов связанные с этим, вы, вероятно, можете игнорировать это без особого беспокойства.

0 голосов
/ 18 августа 2013

из википедии 0xBAADF00D («плохая еда») используется Microsoft LocalAlloc (LMEM_FIXED) для указания неинициализированной выделенной памяти кучи при использовании кучи отладки. [7]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...