49 votes

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) que l'on accède à 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?

100voto

Macmade Points 27414

Je sais que: Type d'Exception: EXC_BAD_ACCESS (SIGSEGV) que l'on accède à un libéré de l'objet.

Pas de.

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.

Note 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 l' signal et sigaction fonctions. Gardez à l'esprit certains signaux, comme SIGABRT ne peut pas être bloqué.

Vous pouvez vérifier le Wikipedia page sur les signaux, si vous souhaitez plus d'informations.

Cela dit, pour reprendre:

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)

Non valide 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.

30voto

Tommy Points 56749

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:

UIView *view; // uninitialised, could point to anything
[view setFrame:someFrame];

Ou même de simplement faire une erreur en C-non-objet des éléments tels que:

int array[100];
array[1000] = 23; // out-of-bounds access

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 un NSException 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.

4voto

ender Points 2946

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, c'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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X