web-dev-qa-db-fra.com

crash iOS sans erreur ou trace de pile

Avoir du mal à localiser un crash dans une application iPad. La difficulté tient en réalité au fait qu’il n’ya pas d’erreur ou de trace de pile lorsque l’application échoue. Il s'en va tout simplement comme Keizer Soze, "Et comme ça, pouf. Il est parti.". 

J'ai répliqué le crash à la fois sur le simulateur et sur l'appareil. Il n'y a aucun journal de périphérique, rien dans la console, etc.

Je sais que lors du crash, certaines opérations CoreGraphics ont lieu dans un thread en arrière-plan. En règle générale, environ trois opérations NSO exécutent certains mélanges d’images.

Le mélange est constitué d'appels CGContext * (DrawImage, SetBlendMode, SetAlpha, etc.). NSOperation rappelle à un délégué du thread principal de gérer l'image et de la définir sur UIImage. Par conséquent, il ne devrait pas s'agir d'un conflit de thread principal de l'interface utilisateur, mais je ne néglige rien pour l'instant.

Y a-t-il des astuces Xcode qui me manquent pour savoir exactement ce qui se passe? Ou au moins avoir une meilleure idée de l'endroit où se situe le problème?

EDITJ'ai lancé l'application dans Instruments en suivant l'utilisation de la mémoire et constatant qu'elle est assez stable autour de 2 Mo. Alors, ne pensez pas que c'est un problème de mémoire. Mais après examen, ces 2MB stables semblent anormalement bas. Existe-t-il une possibilité que Instruments ne récupère pas les allocations CoreGraphics?

32
MarkPowell

En l'absence d'une meilleure solution, et si cela n'est pas évident, poivrez votre application avec NSLogs pour entourer l'endroit où cela se produit, puis explorez plus profondément à partir de celui-ci via des points d'arrêt et/ou des journaux supplémentaires.

9
fzwo

Essayez de lire les registres.

Chaque fois que mon application se bloque sans erreur, dans la plupart des cas, j'ai trouvé l'exception dans les registres.

Tout d’abord, allez sur l’onglet Exceptions puis sur «Ajouter un point d’exception» à l’aide du signe + en bas à gauche.enter image description here

Puis, lorsque l'application se bloque, cliquez sur "0 objc_exception_throw" sous le fil 1 enter image description here

Enfin dans la console entrez:

  • register read (vous devriez obtenir une liste des registres)
  • po $ rax (normalement l'exception est dans 'rax')

    (vous devriez voir la sortie d'exception sur la console)

J'espère que cela t'aides.

23
shrishaster

Réponse très tardive, mais j'ai constaté que l'utilisation de try/catch permet de donner des informations lorsque je ne parviens pas à obtenir une trace de pile et que mon application extrait un fichier Keizer Soze.

@try
{
  // suspected code causing crash/errors
}
@catch (NSException *exception)
{
  NSLog(@"Exception: %@", exception);
}
2
dragonflyesque

Dans mon cas, c’était parce que «Zombie Objects» était activé dans le schéma pour aider à trouver le problème, ce qui l’avait finalement provoqué par un manque de mémoire et un crash.

1
Paul Slocum

Dans mon cas, c'était à cause d'une mauvaise connexion de sortie dans le storyboard. Cochez la case Utiliser point de rupture si la méthode viewDidLoad de UIViewController à charger est appelée. Sinon, vérifiez vos connexions de sortie dans le storyboard. 

Une connexion incorrecte bloque l'application sans erreur ni trace de pile.

Je me demande ce qui est arrivé à l'erreur this class is not key value coding-compliant for the key qui était utilisée dans les anciennes versions de XCode.

1
Rashmikant Makwana

Dans mon cas, cela était dû à la libération d'un objet. Normalement, le message serait envoyé à une instance désallouée ou quelque chose du genre, mais ce n’était pas le cas. J'ai consulté les journaux de l'iPhone et trouvé ceci: KERN_INVALID_ADDRESS, que j'ai googlé et trouvé ceci: KERN_INVALID_ADDRESS

Activé les objets zombie et constaté que j'ai essayé d'utiliser une instance désallouée. Il m'a également dit quel objet il était dans les journaux après. 

J'espère que cela aidera les futurs visiteurs.

0
chrs