Les Types d'Exception dans iOS crash logs
J'ai vu un peu les différents types de journaux de pannes depuis que j'ai commencer à apprendre le développement d'iOS.
Je sais que:
Type d'Exception: EXC_BAD_ACCESS (SIGSEGV) veux dire que nous sommes accéder à un libéré de l'objet.
mais vous ne savez pas à propos de:
Type d'Exception: EXC_BAD_ACCESS (SIGBUS)
Type d'Exception: EXC_CRASH (SIGABRT)
Type d'Exception: EXC_BREAKPOINT (SIGTRAP)
Savez-vous combien de Types d'exceptions dans iOS crash logs et que signifient-ils?
Vous devez vous connecter pour publier un commentaire.
Pas.
Un SIGSEGV est une erreur de segmentation, ce qui signifie que vous essayez d'accéder à une adresse mémoire non valide.
Ces exceptions (en fait, ils sont des signaux) ne sont pas liées à l'Objectif-C, mais C
De sorte que vous pouvez obtenir une telle exception sans Objectif-C objets.
Noter qu'un signal n'est pas une exception, ce qui signifie que vous ne pouvez pas les attraper avec
@try
et@catch
blocs.Vous pouvez configurer un gestionnaire de signal avec la
signal
etsigaction
fonctions. Gardez à l'esprit certains signaux, comme SIGABRT ne peut pas être bloqué.Vous pouvez vérifier l' Wikipédia page sur les signaux, si vous souhaitez plus d'informations.
Cela dit, pour reprendre l':
SIGSEGV (Erreur de Segmentation)
L'accès à une adresse mémoire non valide. L'adresse existe, mais votre programme n'ont pas accès à elle.
SIGBUS (Erreur de Bus)
L'accès à une adresse mémoire non valide. L'adresse n'existe pas, ou l'alignement n'est pas valide.
SIGFPE (Floating point exception)
Invalide opération arithmétique. Peuvent être liées à des opérations sur entiers, malgré le nom.
SIGPIPE
Broken pipe.
SIGILL
Illégale d'instruction du processeur.
SIGTRAP
Débogueur liées
SIGABRT
Plantage du programme, qui n'est liée à l'une des précédentes signal.
SIGSEGV littéralement signifie que vous avez accès à une adresse qui ne vous appartient pas. Il n'est donc pas nécessairement que vous avez accès à un libéré de l'objet; vous pouvez accéder à un objet qui n'a jamais existé, comme dans:
Ou même de simplement faire une erreur en C-non-objet des éléments tels que:
SIGBUS est très similaire à SIGSEGV, la différence étant au niveau du matériel (généralement la différence entre essayer d'accéder à une adresse qui n'existe pas mais qui ne vous appartient pas et d'essayer d'accéder à une adresse qui n'a rien derrière elle, mais ce n'est pas une définition stricte), mais est généralement associée avec le même genre d'erreurs, si un SIGBUS est beaucoup plus susceptibles de le faire avec une variable non initialisée qu'une SIGSEGV.
Si vous essayez de carte pour les erreurs que vous avez probablement fait en Objective-C, vous avez probablement juste de vouloir lire SIGSEGV et SIGBUS ensemble en ce sens "un accès à la mémoire, je n'avais pas le droit de faire".
SIGABRT est un programme qui tente d'avorter elle-même, de sorte qu'il signifie généralement que c'est une sorte de contrôle de cohérence interne a échoué. Par exemple, SIGABRT est déclenchée si vous essayez de libérer de la mémoire même deux fois, ou — au niveau de Cacao — si vous
raise
unNSException
qui n'est pas pris. Si vous obtenez un SIGABRT, vous avez fait quelque chose de mal qui est détecté par le logiciel système (contrairement à SEGV et de BUS, qui surviennent dans le matériel).SIGTRAP est un appel à partir du programme d'un débogueur. Pour l'anecdote, Apple semblent utiliser ces lorsque vous faites quelque chose de mal qui peut être détectée dans le logiciel, mais a trait à l'environnement plutôt que de votre code. Ainsi, par exemple, vous appelez une fonction C qui existe dans le SDK que vous avez construit avec mais pas sur l'appareil vous sont en cours d'exécution (par exemple, lorsque vous créez contre le dernier SDK avec une baisse de la cible de déploiement), ou de faire quelque chose de similaire avec un objet.
view
est implicitement initialisé ànil
et de messages qui sont toujours en sécurité. Essayez de programmer une adresse aléatoire. Je suis sur un iPad dès maintenant; éditerai quand je suis à un vrai clavier.Ces messages sont de gdb, et ils ne sont pas exclusifs pour objective-C.
Obtenez plus d'informations sur les signaux de tout ce que vous avez à faire est d'entrer
info signals
à la console du débogueur, ceci est un exemple de sortie. Désolé de pas poster ici, mais le format de la sortie de la console est terrible.Source et plus d'infos sur les signaux
J'ai récemment étudié ce sujet et voici mon résumé:
EXC_BAD_ACCESS (SIGSEGV)
ouEXC_BAD_ACCESS (SIGBUS)
Notre programme la plus probable tenté d'accéder à un mauvais emplacement de la mémoire ou de l'adresse était bonne, mais nous n'avons pas eu le privilège d'y accéder. La mémoire peut avoir été libéré en raison de la pression de la mémoire.
EXC_BREAKPOINT (SIGTRAP)
Cela est dû à un
NSException
étant élevé (peut-être par une bibliothèque en notre nom) ou_NSLockError
ouobjc_exception_throw
d'être appelé. Par exemple, cela peut être de l'environnement Swift la détection d'une anomalie comme la force d'ôter un nul en option.EXC_BAD_INSTRUCTION (SIGILL)
C'est quand le code du programme en lui-même est défectueux, pas la mémoire qu'il peut accéder. Ce devrait être rare sur les appareils iOS; peut-être un compilateur ou d'un optimiseur de bug, ou de la mauvaise écrit à la main le code d'assemblée. Sur Simulateur, c'est une autre histoire que d'utiliser un indéfini opcode est une technique utilisée par la Swift de l'exécution pour s'arrêter sur l'accès à zombie objets (libéré des objets).
EXC_GUARD
C'est lorsque le programme fermé un descripteur de fichier qui a été gardé. Un exemple est la base de données SQLite utilisé par le système.