Mejores prácticas para el registro de errores y / o informes para iPhone


Cuando hago desarrollo web, uso un registrador personalizado que detecta errores fatales y agrega un seguimiento a un archivo y muestra un mensaje al usuario. De vez en cuando puedo echar un vistazo para ver si el archivo cambió, lo que significa que algún usuario encontró un error y puedo profundizar para ver lo que encontraron.

Me gustaría algo similar en el iphone, con algunas advertencias:

  • Durante el desarrollo, debería ser trivial restablecer la lista de errores o desactivar notificación.
  • Durante el desarrollo, los mensajes de error también deben aparecer en algún lugar obvio, como en la pantalla en la consola
  • Una vez implementados, los errores deben enviarse cortésmente a la nave nodriza para su análisis (para una corrección de errores en la próxima actualización)
  • Active el registro de seguimiento/Información cuando intente rastrear un problema durante el desarrollo
  • Desactive el registro de consola para 'Release' para acelerar las cosas para el usuario
  • Debe limpiar después de sí mismo para ser un buen ciudadano en el teléfono

Algunos Enlaces relacionados

Parece que habría un kit de herramientas común para hacer esto - ¿cómo lo manejas?

[Actualización Oct 2011] Alli han sido algunos desarrollos, de diversa madurez...

  • PLCrashReporter .
  • Quincy se sienta encima del PLC.
  • Bugsense reportero de accidente comercial.
  • Crittercism crash and error reporting (algunos paquetes gratuitos, algunos de pago).
  • Test flight ahora tiene un SDK que detecta bloqueos (pero aún no para las aplicaciones de la tienda de aplicaciones, solo aplicaciones de desarrollo).
  • Al igual que el Vuelo de prueba, Hockey tiene como objetivo combinar ad hoc distribución con informes de fallos.
Author: Community, 2009-11-03

4 answers

Esto es lo que hacemos:

  • Deje que el iPhone maneje sus propios volcados de bloqueo a través de los mecanismos existentes de la Tienda de aplicaciones. Actualización: habiendo encontrado que iTunes Connect no es confiable para proporcionar informes de fallas, recomiendo usar Fabric/Crashlytics, o un competidor como Crittercismo Rollbar.
  • Nuestro producto lanzado no tiene rastro, esto parece ser consistente con lo que la mayoría de las otras aplicaciones de iPhone hacen.
  • Si un error es reportado luego lo reproducimos usando una compilación trazada.

Con más detalle:

  • Definimos macros para NSLog trace en numerosos niveles diferentes de granularidad.
  • Use la configuración de compilación de Xcode para cambiar el nivel de seguimiento, que controla la cantidad de seguimiento que se compila en el producto, por ejemplo, hay configuraciones de compilación de liberación y Depuración.
  • Si no se define ningún nivel de seguimiento, entonces mostramos el seguimiento completo en el Simulador, y no hay seguimiento cuando se ejecuta en un dispositivo real.

He incluido un código de ejemplo a continuación que muestra cómo hemos escrito esto y cómo se ve la salida.

Definimos múltiples niveles de seguimiento diferentes para que los desarrolladores puedan identificar qué líneas de seguimiento son importantes y puedan filtrar los detalles de nivel inferior si así lo desean.

Código de ejemplo:

- (void)myMethod:(NSObject *)xiObj
{
  TRC_ENTRY;
  TRC_DBG(@"Boring low level stuff");
  TRC_NRM(@"Higher level trace for more important info");
  TRC_ALT(@"Really important trace, something bad is happening");
  TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
  TRC_EXIT;
}

Ejemplo de salida de traza:

2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]

Nuestras definiciones de traza:

#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif

/*****************************************************************************/
/* Entry/exit trace macros                                                   */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY    NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT     NSLog(@"EXIT:  %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif

/*****************************************************************************/
/* Debug trace macros                                                        */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif

#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif

#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif

#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif

Configuración de Xcode:

En Xcode configuración de compilación, elija "Agregar configuración definida por el usuario" (haciendo clic en el pequeño engranaje en la parte inferior izquierda de la pantalla de configuración de compilación), luego defina una nueva configuración llamada GCC_PREPROCESSOR_DEFINITIONS y dale el valor TRC_LEVEL=0.

La única sutileza es que Xcode no sabe hacer una compilación limpia si cambia esta configuración, así que recuerde hacer una limpieza manualmente si la cambia.

 37
Author: Dan J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-13 01:02:44

Apple recopila automáticamente los registros de bloqueo de los usuarios para usted, y puede descargarlos desde iTunes connect.

Si eso no es suficiente para ti, no estoy al tanto de un kit de herramientas, pero no me gustaría rodar algo por mi cuenta, personalmente. Parece que demasiado esfuerzo para desarrollar algo robusto, podría plantear problemas de privacidad, y al final, con 100,000 K aplicaciones en la app store, ¿cuántos usuarios volverían a usar su aplicación después de descubrir que tenía errores?

 4
Author: bpapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-03 15:40:04

¿sabes que CrashReporter para iPhone existe?

Hay un repositorio en github que muestra ese código.

Tiene algunas características interesantes como mapear el seguimiento de la pila a su código y administra algunas cosas específicas de git como hashes de versión.

 4
Author: Jens Kohl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-11 23:48:33

Recomiendo encarecidamente el CacoaLumberJack de Robbie Hanson: https://github.com/robbiehanson/CocoaLumberjack

Es muy flexible y potente tal vez incluso un poco excesivo si se abusa. Soporta diferentes niveles de registro. El registro de archivos se puede activar con un par de líneas de código e incluso se puede enviar a través de la red.

 2
Author: dagnytaggart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-23 16:21:25