Parfois, mon application iPhone se bloque avec un étrange Crashlog, qui lit le code d'exception est 0x8Badf00d. Les écoles montrent des instantanés aléatoires de l'exécution de l'application, mais rien de méfiant. Cela se produit très rarement et je ne suis pas capable de savoir comment le reproduire. Est-ce que quelqu'un en savoir plus sur ce type d'exception et de code d'exception?
Voici un extrait de mon crashlogs:
Type d'exception: 00000020
Codes d'exception: 0x8BADF00D
fil en surbrillance: 0Informations spécifiques à l'application:
[.____] Échec de la désactivationFil 0:
...
<rien de méfiant ici>
...Fil inconnu s'est écrasé avec une saveur inconnue: 5, State_Count: 1
0x8badf00d
est le code d'erreur que le chien de garde augmente lorsqu'une application prend trop de temps pour se lancer ou se terminer. Voir Apple Crash Reporting pour Applications iPhone OS Document
Si vous obtenez Exception Type: 00000020
et Exception Codes: 0x8badf00d
Ensuite, c'est Reports d'arrêt du temps de surveillance . Le code d'exception 0x8badf00d
est appelé "ate bad food"
.
Le plus courant reason for this crash is synchronous activity on main thread.
Le correctif est à switch to asynchronous activity
sur le fil principal.
C'est hexspeak, voyez ici: http://fr.wikipedia.org/wiki/hexspeak
C'est une idée d'une blague de programmeur. Vous devez choisir un numéro pour votre code, mais le nombre ne signifie pas nécessairement quoi que ce soit en soi. 8badf00d
est juste un autre moyen d'écrire le numéro 2 343 432,205 et a été choisi car il a l'air "drôle" quand représenté en hexagone pour un journal d'exception.
C'est un code d'échec ajouté par un développement avec un bon sens de l'humour. Parce que Hexadecimal utilise des lettres ainsi que des chiffres, il est possible de proposer des numéros hexagonaux qui ressemblent à des mots anglais, tels que "0xdeadbeef", etc. Je suis sûr que l'exception a une signification spécifique, mais s'il n'y a pas de symptômes majeurs Associé à cela, vous pouvez probablement l'ignorer sans trop de préoccupation.
0x8badf00d exception
est soulevé par Apple fourni Watchdog. La cause la plus courante pour les accidents du temps de surveillance dans une application réseau est une mise en réseau synchrone sur le fil principal. Il y a quatre facteurs contributifs ici:
networking synchrone - C'est là que vous faites une demande de réseau et une sélection d'attente de la réponse.
fil principal - La mise en réseau synchrone est inférieure à celle idéale en général, mais il provoque des problèmes spécifiques si vous le faites sur le fil principal. N'oubliez pas que le thread principal est responsable de l'exécution de l'interface utilisateur. Si vous bloquer le thread principal pour une quantité importante de temps, l'interface utilisateur devient inacceptable ne répond pas.
long timeouts - Si le réseau disparaît simplement (par exemple, l'utilisateur se trouve dans un train qui passe dans un tunnel), toute demande de réseau en attente n'échoudera pas avant l'expiration du délai d'attente. La plupart des délais de réseaux sont mesurés en minutes, ce qui signifie qu'une demande de réseau synchrone bloquée sur le thread principal peut conserver l'interface utilisateur qui ne répond pas pendant quelques minutes à la fois.
Essayer d'éviter ce problème en réduisant le délai d'attente du réseau n'est pas une bonne idée. Dans certaines situations, cela peut prendre plusieurs secondes pour une demande de réseau de réussir et si vous avez toujours du temps tôt, vous ne ferez jamais de progrès.
watchDog - Afin de conserver l'interface utilisateur réactive, IOS comprend un mécanisme de surveillance. Si votre demande ne répond pas à certains événements d'interface utilisateur (lancement, suspension, reprise, résiliation) à temps, le chien de garde tuera votre candidature et générera un rapport d'accident du temps de surveillance. La quantité de temps que le chien de garde vous donne n'est pas formellement documenté, mais c'est toujours moins qu'un délai d'attente de réseau.
Il y a deux solutions communes:
réseautage asynchrone - La meilleure solution à ce problème consiste à exécuter votre code de réseau de manière asynchrone. Le code de réseautage asynchrone présente un certain nombre d'avantages, notamment de savoir qu'il vous permet d'accéder au réseau en toute sécurité sans avoir à vous soucier des threads.
réseau synchrone sur un fil secondaire - S'il est excessivement difficile à exécuter votre code de réseau de manière asynchrone (peut-être vous travaillez avec une base de code portable qui suppose la mise en réseau synchrone), vous pouvez éviter le chien de garde en exécutant votre code synchrone sur un fil secondaire.
Reportez-vous Apple Docs Pour plus d'informations.