Quelle est la signification du code d'exception “EXC_I386_GPFLT”?
Quelle est la signification du code d'exception EXC_I386_GPFLT
?
Ne prend son sens varie en fonction de la situation?
Dans ce cas, je fais allusion à l'exception de type EXC_BAD_ACCESS
avec code d'exception EXC_I386_GPFLT
Le programme est développé dans Xcode 5.0.1, traiter avec cblas_zgemm()
de la bibliothèque BLAS.(Eh bien, je suppose que cela n'a pas d'importance...)
Merci beaucoup!
Vous devez vous connecter pour publier un commentaire.
EXC_I386_GPFLT est sûrement référence à "General Protection fault", qui est le x86 pour vous dire que "vous avez fait quelque chose que vous n'êtes pas autorisé à le faire". Généralement, il NE signifie PAS que vous avez accès à de la mémoire de limites, mais il se peut que votre code est en train de sortir des limites du terrain et causer de mauvais code ou de données pour être utilisés d'une manière qui constitue une violation de protection de la sorte.
Malheureusement, il peut être difficile de comprendre exactement ce que le problème est sans plus de contexte, il y a 27 les différentes causes citées dans mon AMD64 Manuel du Programmeur, Vol 2, à partir de 2005 - par tous les comptes, il est probable que 8 ans plus tard, aurait ajouté un peu plus.
Si c'est un système 64 bits, un scénario plausible, c'est que votre code à l'aide d'un "non-canonique pointeur" ce qui signifie qu'une adresse 64 bits est formé de telle manière que la partie supérieure de 16 bits de l'adresse ne sont pas toutes les copies de la partie supérieure de la partie inférieure de 48 bits (en d'autres termes, les 16 premiers bits d'une adresse doivent tous être 0 ou 1, basé sur le peu juste en-dessous de 16 bits). Cette règle est en place pour garantir que l'architecture peut "en toute sécurité élargir le nombre de bits dans la plage d'adresses". Cela semble indiquer que le code est soit d'écraser certains pointeur de données avec d'autres trucs, ou de sortir des limites du terrain lors de la lecture de certains la valeur du pointeur.
Un autre causes probables est non alignés de l'accès à l'ESS, inscrivez - en d'autres mots, la lecture d'un de 16 octets de l'ESS s'inscrire à partir d'une adresse qui n'est pas de 16 octets alignés.
Il y a, comme je l'ai dit, beaucoup d'autres raisons possibles, mais la plupart de ceux qui portent sur des choses qui "normal" code ne ferais pas dans un 32 ou 64 bits du système d'exploitation (telles que le chargement des registres de segment non sélecteur d'index ou de l'écriture de MSR est (modèle spécifique registres)).
Vous pouvez souvent obtenir des informations à partir des fichiers d'en-tête. Par exemple:
OK, donc c'est une erreur de protection générale (comme son nom l'indique de toute façon). Googler "i386 erreur de protection générale" apporte beaucoup de coups, mais ce regarde intéressant:
Que
13
correspond à ce que nous avons vu dans les fichiers d'en-tête, de sorte qu'il ressemble à la même chose. Mais à partir de l'application du programmateur de point de vue, cela signifie simplement que nous sommes en faisant référence à la mémoire, nous ne devons pas être, et il n'a pas vraiment d'importance la façon dont il est mis en œuvre sur le matériel.De déboguer et de trouver la source:
Activer Zombies pour l'application (Produit\Scheme) et le Lancement d'Instruments, Sélectionnez Zombies.
Exécutez votre application dans Xcode
Ensuite, allez à des Instruments de commencer l'enregistrement.
Revenir à votre Application et essayez de générer l'erreur.
Les Instruments doivent détecter les mauvais appel (zombie) si il y en a un.
Espère que cela aide!
Je me demandais pourquoi cela est apparu lors de mes tests unitaires.
J'ai ajouté une déclaration de méthode à un protocole qui inclus
throws
; mais potentiellement jeter méthode n'a même pas été utilisé dans le test particulier. L'activation des Zombies dans l'essai qui sonnait comme trop de difficultés.S'avère un ⌘K nettoyer a fait le tour. Je suis toujours flabberghasted lorsqu'qui permet de résoudre des problèmes réels.
J'ai eu une exception similaire à Swift 4.2. J'ai passé environ une demi-heure à essayer de trouver un bug dans mon code, mais le problème a disparu après la fermeture de Xcode et la suppression de données dérivées du dossier. Voici le raccourci:
Dans mon cas, l'erreur a été jeté dans Xcode lors de l'exécution d'une application sur le simulateur iOS. Bien que je ne peut pas répondre à la question "ce que l'erreur de moyens", je peux dire que ce qui m'a aidé, peut-être qu'il aide aussi les autres.
La solution pour moi a été de
Erase All Content and Settings
dans le simulateur et àClean Build Folder...
dans Xcode.Ce qui m'est arrivé parce que Xcode ne semblait pas du tout comme moi, en utilisant le même nom de variable dans deux classes différentes (qui sont conformes au protocole de même, si ce qui compte, bien que le nom de la variable n'a rien en rapport l'un quelconque des protocoles). J'ai simplement renommé ma nouvelle variable.
J'ai eu à faire un pas dans la setters où il a été s'écraser dans le but de le voir, pendant le débogage. Cette réponse s'applique à iOS
Si l'erreur est générée à l'intérieur d'une fermeture qui définit
self
commeunowned
, vous pouvez être limité dans ce que vous pouvez accéder et obtenir ce code d'erreur dans certaines situations. Surtout pendant le débogage. Si c'est le cas pour vous, essayez de changer de[unowned self]
à[weak self]
J'ai eu cette erreur en faisant cela:
Il s'en alla quand je revenue à: