私のiPhoneアプリケーションが奇妙なクラッシュログでクラッシュすることがあり、例外コードは0x8badf00dです。スタックトレースは、アプリ実行のランダムなスナップショットを示しますが、疑わしいものはありません。これは非常にまれにしか発生せず、再現方法を見つけることができません。誰かがこの種の例外と例外コードについてもっと知っていますか?
これは私のクラッシュログからの抜粋です:
例外タイプ:00000020
例外コード:0x8badf00d
強調表示されたスレッド:0アプリケーション固有の情報:
非アクティブ化に失敗しましたスレッド0:
...
<ここに不審な点はありません>
...不明なスレッドが不明なフレーバーでクラッシュしました:5、state_count:1
0x8badf00d
は、アプリケーションの起動または終了に時間がかかりすぎるときにウォッチドッグが発生させるエラーコードです。 Appleの iPhone OSアプリケーションのクラッシュレポート ドキュメントを参照してください
Exception Type: 00000020
およびException Codes: 0x8badf00d
を取得した場合、それはwatchdog timeout crash reportsです。例外コード0x8badf00d
は"ate bad food"
と呼ばれます。
最も一般的なreason for this crash is synchronous activity on main thread.
修正は、メインスレッドのswitch to asynchronous activity
です。
それはHexSpeakです。ここを参照してください: http://en.wikipedia.org/wiki/Hexspeak
プログラマーのジョークのアイデアです。コードの番号を選択する必要がありますが、番号は必ずしもそれ自体で何かを意味するわけではありません。 8badf00d
は、2,343,432,205という数値を書き込むもう1つの方法であり、例外ログの16進数で表すと「おかしい」ように見えるため選択されました。
ユーモアのセンスのある開発者が追加した失敗コードです。 16進数は数字だけでなく文字も使用するため、「0xdeadbeef」などのように、ほぼ英語の単語のように見える16進数を思い付く可能性があります。例外には特定の意味があると確信していますが、大きな症状がない場合それに関連付けられているので、あまり心配することなく無視できます。
0x8badf00d exception
は、Apple提供のウォッチドッグによって発生します。ネットワークアプリケーションでのウォッチドッグタイムアウトクラッシュの最も一般的な原因は、メインスレッドでの同期ネットワーキングです。ここに4つの要因があります。
同期ネットワーキング—これは、ネットワーク要求を行い、応答を待つことをブロックする場所です。
メインスレッド—同期ネットワークは一般的に理想的とは言えませんが、メインスレッドで実行すると特定の問題が発生します。メインスレッドは、ユーザーインターフェイスの実行を担当することに注意してください。メインスレッドをかなり長い時間ブロックすると、ユーザーインターフェイスが許容できないほど応答しなくなります。
長いタイムアウト—ネットワークがなくなる(たとえば、ユーザーがトンネルに入る電車に乗っている)場合、保留中のネットワーク要求は、タイムアウトになるまで失敗しません。ほとんどのネットワークタイムアウトは分単位で測定されます。つまり、メインスレッドでブロックされた同期ネットワーク要求により、ユーザーインターフェースが一度に数分間応答しなくなることがあります。
ネットワークタイムアウトを減らしてこの問題を回避しようとすることはお勧めできません。状況によっては、ネットワーク要求が成功するまでに数秒かかる場合があり、常に早期にタイムアウトした場合は、まったく進歩しません。
ウォッチドッグ—ユーザーインターフェイスの応答性を維持するために、iOSにはウォッチドッグメカニズムが含まれています。アプリケーションが特定のユーザーインターフェイスイベント(起動、一時停止、再開、終了)に間に合わない場合、ウォッチドッグはアプリケーションを強制終了し、ウォッチドッグタイムアウトクラッシュレポートを生成します。ウォッチドッグが提供する時間の長さは正式には文書化されていませんが、常にネットワークタイムアウトよりも短くなっています。
2つの一般的な解決策があります。
非同期ネットワーク—この問題の最良の解決策は、ネットワークコードを非同期で実行することです。非同期ネットワークコードには多くの利点があります。特に、スレッドを気にすることなくネットワークに安全にアクセスできるという利点があります。
セカンダリスレッドでの同期ネットワーキング—ネットワーキングコードを非同期で実行するのが非常に難しい場合(おそらく、同期ネットワーキングを想定した大規模なポータブルコードベースで作業している場合)、セカンダリスレッドで同期コードを実行することでウォッチドッグを回避できます。
詳細については、Apple docs を参照してください。