Je souhaite tester le rapport de plantage de mon application sur le terrain en le faisant délibérément planter lorsque l'utilisateur effectue une action particulière qu'un utilisateur réel est peu susceptible de faire accidentellement.
Mais quel est un bon moyen fiable de faire planter l'application sans créer d'avertissement au moment de la compilation?
Edit: Notez que de nombreuses réponses apparemment évidentes à cette question entraînent des exceptions qui sont interceptées par Cocoa et n'entraînent donc pas le plantage de l'application.
iphone
objective-c
ios
Nestor
la source
la source
WebKit discarded an uncaught exception
toutes ces idées jusqu'à présent! Qui savait qu'il était si difficile de faire planter une application ces jours-ci?(void)0/0;
,(void)*(char*)0;
Réponses:
en Objective-C, utilisez C directement pour provoquer un mauvais accès
Remarque: bien que cela fonctionne sur n'importe quel système que je connais - dans une future version du runtime C OU du compilateur, cela pourrait ne plus conduire à un crash. voir Le comportement de déréférence de pointeur nul est-il indéfini dans Objective-C? )
(en un rien de temps, vous devrez passer à objC pour ce faire)
la source
WebKit discarded an uncaught exception
problème aussi.Mon coup de coeur actuel:
Un classique:
Et certains pr0n:
Tous génèrent des plantages capturés par mon outil de rapport de crash.
la source
assert()
est une fonctionnalité de débogage, cela n'a pas de sens de laisser une telle cruauté dans les versions de version. Il existe des tests unitaires pour cela.assert
n'est pas une fonctionnalité de débogage. Une affirmation ratée est un bug que vous pensiez impossible. Il vaut mieux abandonner, même une version de version, que de continuer à exécuter un programme avec des conséquences imprévisibles.Puisque nous utilisons tous Clang pour iOS, c'est assez fiable:
Cela présente l'avantage d'être conçu exactement dans ce but, il ne devrait donc pas générer d'avertissements ou d'erreurs du compilateur.
la source
abort();
provoque une résiliation anormale… C'est un crash.la source
Que diriez-vous d'un bon vieux débordement de pile :)
la source
Le plus populaire - plantage du sélecteur non reconnu:
Assurez-vous que la méthode -asdf n'est pas implémentée dans cette classe haha
Ou index au-delà de l'exception liée:
Et bien sûr
kill( getpid(), SIGABRT );
la source
Je pense que dans Swift, vous pouvez facilement lancer une erreur fatale:
Il est même prévu d'utiliser cette fonctionnalité en cas de problème pour faire planter l'application.
Pour éviter une instruction if dans un cas particulier, vous pouvez également utiliser
precondition
. Il est similaire àassert
, rend donc l'intention (si vous le souhaitez) assez claire et n'est pas supprimé dans la version finale en tant queassert
. Il est utilisé commeprecondition(myBoolean, "This is a helpful error message for debugging.")
.la source
Envoyer un message à un objet désalloué
la source
(doit ... taper ... 30 caractères)
la source
Vous pouvez également lever une exception:
la source
Ajoutez un outil de reconnaissance de gestes à une vue qui reconnaît une pression de 10 doigts (5 doigts pour iPhone comme 10 peuvent être un peu encombrés). Le GR a une méthode qui lui est attachée qui exécute n'importe lequel des moyens infaillibles mentionnés précédemment pour faire planter votre application. La plupart des utilisateurs ne vont pas poser 10 doigts sur votre application, vous êtes donc à l'abri de l'utilisateur général qui provoque accidentellement le crash.
Cependant, vous devriez pouvoir utiliser quelque chose comme Testflight ou simplement le déployer sur des appareils personnels et le tester dans la nature avant de le soumettre à Apple. Un crash forcé pourrait entraîner le rejet de votre application par Apple.
la source
pourrait essayer quelque chose comme
devrait planter sur un EXC_BAD_ACCESS (il pourrait être nécessaire de le relâcher une deuxième fois mais normalement il devrait déjà planter comme ça)
la source
J'irai avec:
int raise(int sig);
Pour en savoir plus
>man raise
la source
Je tuerais simplement le processus normalement:
Donc, si vous installez un gestionnaire avec signal, vous pouvez également gérer le plantage, en finissant d'écrire les fichiers ouverts et ces choses.
la source
j'utilise
la source
Lorsque je travaille avec RubyMotion, j'utilise ceci:
la source
Essaye ça:
la source
une fausse
NSLog
déclaration le ferala source