Quiero probar el informe de fallos de mi aplicación en el campo haciendo que se bloquee deliberadamente cuando el usuario realiza una acción particular que es poco probable que un usuario real realice accidentalmente.
Pero, ¿cuál es una buena forma confiable de hacer que la aplicación se bloquee que no cree una advertencia en el momento de la compilación?
Editar: Tenga en cuenta que muchas respuestas aparentemente obvias a esta pregunta dan como resultado excepciones que quedan atrapadas por Cocoa y, por lo tanto, no provocan el bloqueo de la aplicación.
iphone
objective-c
ios
Néstor
fuente
fuente
WebKit discarded an uncaught exception
todas estas ideas hasta ahora! ¿Quién sabía que era tan difícil hacer que una aplicación se bloquee en estos días?(void)0/0;
,(void)*(char*)0;
Respuestas:
en Objective-C use C directamente para causar un mal acceso
Nota: si bien esto funciona en cualquier sistema que conozco, en una versión futura del tiempo de ejecución de C O en el compilador, esto podría no provocar un bloqueo más. ver ¿Es el comportamiento indefinido de desreferencia de puntero nulo en Objective-C? )
(en rápido tendrías que hacer un puente a objC para hacer esto)
fuente
WebKit discarded an uncaught exception
también soluciona el problema.Mi favorito actual:
Un clásico:
Y algunas pr0n:
Todos ellos generan bloqueos capturados por mi herramienta de informe de bloqueo.
fuente
assert()
es una función de depuración, no tiene mucho sentido dejar tal ruft en las versiones de lanzamiento. Hay pruebas unitarias para eso.assert
no es una función de depuración. Una afirmación fallida es un error que creías imposible. Es mejor abortar, incluso una versión de lanzamiento, que seguir ejecutando un programa con consecuencias impredecibles.Como todos usamos Clang para iOS, esto es bastante confiable:
Esto tiene el beneficio de que está diseñado exactamente para este propósito, por lo que no debería generar advertencias o errores del compilador.
fuente
abort();
provoca una terminación anormal ... Eso es un accidente.fuente
¿Qué tal un buen desbordamiento de pila viejo :)
fuente
El más popular: bloqueo de selector no reconocido:
Asegúrese de no tener el método -asdf implementado en esa clase jaja
O indice más allá de la excepción encuadernada:
Y por supuesto
kill( getpid(), SIGABRT );
fuente
Creo que en Swift podrías lanzar fácilmente un error fatal:
En realidad, incluso está destinado a usar esta función en caso de que algo salga mal para que la aplicación se bloquee.
Para evitar una declaración if en un caso especial, también puede usarla
precondition
. Es similar aassert
, deja así clara la intención (si se desea) y no se elimina en la versión final comoassert
. Se usa comoprecondition(myBoolean, "This is a helpful error message for debugging.")
.fuente
Enviar un mensaje a un objeto desasignado
fuente
(debe ... escribir ... 30 caracteres)
fuente
También puede plantear una excepción:
fuente
Agregue un reconocedor de gestos a una vista que reconozca un toque de 10 dedos (5 dedos para iPhone, ya que 10 pueden llenarse un poco). El GR tiene un método adjunto que ejecuta cualquiera de las formas seguras antes mencionadas de hacer que su aplicación se bloquee. La mayoría de los usuarios no van a poner 10 dedos sobre tu aplicación, por lo que estás a salvo del usuario general que accidentalmente causa el bloqueo.
Sin embargo, debería poder usar algo como Testflight o simplemente implementarlo en dispositivos personales y realizar pruebas en la naturaleza antes de enviarlo a Apple. Tener un bloqueo forzado podría hacer que Apple rechace tu aplicación.
fuente
podría intentar algo como
debería bloquearse en un EXC_BAD_ACCESS (podría necesitar liberarlo por segunda vez, pero normalmente ya debería bloquearse así)
fuente
Yo iré con:
int raise(int sig);
Para obtener más información.
>man raise
fuente
Simplemente mataría el proceso normalmente:
Entonces, si instala un controlador con señal, también puede manejar el bloqueo, terminando de escribir los archivos abiertos y estas cosas.
fuente
yo suelo
fuente
Cuando trabajo con RubyMotion, uso esto:
fuente
Prueba esto:
fuente
una
NSLog
declaración incorrecta lo haráfuente