Esta página proporciona ayuda para la resolución de problemas y respuestas a preguntas frecuentes sobre el uso de Crashlytics. Si no encuentra lo que busca o necesita ayuda adicional, comuníquese con el soporte de Firebase .
Solución de problemas generales/Preguntas frecuentes
Es posible que observes dos formatos diferentes para los problemas enumerados en la tabla de Problemas de Firebase console. Y es posible que también notes una característica llamada "variantes" dentro de algunos de tus problemas. ¡Este es el por qué!
A principios de 2023, implementamos un motor de análisis mejorado para agrupar eventos, así como un diseño actualizado y algunas funciones avanzadas para nuevos problemas (¡como variantes!). Consulte nuestra publicación de blog reciente para conocer todos los detalles, pero puede leer a continuación los aspectos más destacados.
Crashlytics analiza todos los eventos de su aplicación (como fallas, no fatales y ANR) y crea grupos de eventos llamados problemas : todos los eventos de un problema tienen un punto de falla común.
Para agrupar eventos en estos problemas, el motor de análisis mejorado ahora analiza muchos aspectos del evento, incluidos los marcos en el seguimiento de la pila, el mensaje de excepción, el código de error y otras características de plataforma o tipo de error.
Sin embargo, dentro de este grupo de eventos, los seguimientos de la pila que conducen al error pueden ser diferentes. Un seguimiento de pila diferente podría significar una causa raíz diferente. Para representar esta posible diferencia dentro de un problema, ahora creamos variantes dentro de los problemas: cada variante es un subgrupo de eventos en un problema que tiene el mismo punto de falla y un seguimiento de pila similar. Con variantes, puede depurar los seguimientos de pila más comunes dentro de un problema y determinar si diferentes causas raíz están provocando el error.
Esto es lo que experimentará con estas mejoras:
Metadatos renovados que se muestran dentro de la fila del problema
Ahora es más fácil comprender y clasificar los problemas en su aplicación.Menos problemas duplicados
Un cambio de número de línea no genera un nuevo problema.Depuración más sencilla de problemas complejos con diversas causas fundamentales
Utilice variantes para depurar los seguimientos de pila más comunes dentro de un problema.Alertas y señales más significativas
Un nuevo problema en realidad representa un nuevo error.Búsqueda más poderosa
Cada problema contiene más metadatos de búsqueda, como el tipo de excepción y el nombre del paquete.
Así es como se están implementando estas mejoras:
Cuando recibamos nuevos eventos de su aplicación, verificaremos si coinciden con un problema existente.
Si no hay ninguna coincidencia, aplicaremos automáticamente nuestro algoritmo de agrupación de eventos más inteligente al evento y crearemos una nueva incidencia con el diseño de metadatos renovado.
Esta es la primera gran actualización que estamos realizando en nuestra agrupación de eventos. Si tiene comentarios o encuentra algún problema, háganoslo saber presentando un informe.
Si no ve métricas sin fallas (como usuarios y sesiones sin fallas) y/o alertas de velocidad, asegúrese de estar usando el SDK de CrashlyticsCrashlytics SDK 11.7.0+.
Si no ve registros de ruta de navegación , le recomendamos verificar la configuración de su aplicación para Google Analytics. Asegúrate de cumplir con los siguientes requisitos:
Ha habilitado Google Analytics en su proyecto de Firebase.
Ha habilitado el uso compartido de datos para Google Analytics. Obtenga más información sobre esta configuración en Administrar la configuración para compartir datos de Analytics.
Ustedagregó el SDK de Firebase para Google Analyticsa su aplicación. Este SDK debe agregarse además del SDK de Crashlytics.
Estás utilizando las últimas versiones del SDK de Firebase l10nlas últimas versiones del SDK de Firebasepara todos los productos que usas en tu aplicación.
Si estás usando Unity IL2CPP y ves seguimientos de pila sin símbolos, intenta lo siguiente:
Asegúrate de estar utilizando la versión 8.6.1 o superior del SDK de Crashlytics Unity.
Asegúrese de estar configurado y ejecutando el comando
crashlytics:symbols:upload
Firebase CLI para generar y cargar su archivo de símbolos.Debe ejecutar este comando CLI cada vez que cree una compilación de lanzamiento o cualquier compilación para la que desee ver seguimientos de pila simbolizados en Firebase console. Obtenga más información en la página Obtenga informes de fallos legibles .
Sí, Crashlytics puede mostrar seguimientos de pila simbolizados para sus aplicaciones que usan IL2CPP. Esta capacidad está disponible para aplicaciones lanzadas en plataformas Android o Apple. Esto es lo que debes hacer:
Asegúrate de estar utilizando la versión 8.6.0 o superior del SDK de Crashlytics Unity.
Complete las tareas necesarias para su plataforma:
Para aplicaciones de la plataforma Apple : no se necesitan acciones especiales. Para las aplicaciones de la plataforma Apple, el complemento Firebase Unity Editor configura automáticamente su proyecto Xcode para cargar símbolos.
Para aplicaciones de Android : asegúrese de estar configurado y ejecutando el comando
crashlytics:symbols:upload
Firebase CLI para generar y cargar su archivo de símbolos.Debe ejecutar este comando CLI cada vez que cree una compilación de lanzamiento o cualquier compilación para la que desee ver seguimientos de pila simbolizados en Firebase console. Obtenga más información en la página Obtenga informes de fallos legibles .
El valor sin fallas representa el porcentaje de usuarios que interactuaron con su aplicación pero no tuvieron una falla durante un período de tiempo específico.
Aquí está la fórmula para calcular el porcentaje de usuarios sin fallas. Sus valores de entrada son proporcionados por Google Analytics.
CRASH_FREE_USERS_PERCENTAGE = 1 - ( CRASHED_USERS / ALL_USERS ) x 100
Cuando ocurre una falla, Google Analytics envía un tipo de evento
app_exception
y CRASHED_USERS representa la cantidad de usuarios asociados con ese tipo de evento.ALL_USERS representa la cantidad total de usuarios que interactuaron con su aplicación durante el período de tiempo que seleccionó en el menú desplegable en la parte superior derecha del panel de Crashlytics.
El porcentaje de usuarios sin fallos es una agregación a lo largo del tiempo , no un promedio.
Por ejemplo, imagina que tu aplicación tiene tres usuarios; los llamaremos Usuario A, Usuario B y Usuario C. La siguiente tabla muestra qué usuarios interactuaron con su aplicación cada día y cuáles de esos usuarios tuvieron una falla ese día:
Lunes | Martes | Miércoles | |
---|---|---|---|
Usuarios que interactuaron con su aplicación | A B C | A B C | A, B |
Usuario que tuvo un accidente | C | B | A |
El miércoles, su porcentaje de usuarios sin fallas es del 50% (1 de cada 2 usuarios no tuvo fallas).
Dos de sus usuarios interactuaron con su aplicación el miércoles, pero solo uno de ellos (Usuario B) no tuvo fallas.Durante los últimos 2 días, su porcentaje de usuarios sin fallas es del 33,3 % (1 de cada 3 usuarios no tuvo fallas).
Tres de sus usuarios interactuaron con su aplicación durante los últimos dos días, pero solo uno de ellos (Usuario C) no tuvo fallas.Durante los últimos 3 días, su porcentaje de usuarios sin fallas es del 0 % (0 de cada 3 usuarios no tuvieron fallas).
Tres de sus usuarios interactuaron con su aplicación durante los últimos tres días, pero ninguno de ellos tuvo fallas.
El valor de los usuarios sin fallos no debe compararse en diferentes períodos de tiempo. La probabilidad de que un solo usuario experimente una falla aumenta cuantas más veces usa su aplicación, por lo que es probable que el valor de los usuarios libres de fallas sea menor durante períodos de tiempo más largos.
Las notas permiten a los miembros del proyecto comentar sobre temas específicos con preguntas, actualizaciones de estado, etc.
Cuando un miembro del proyecto publica una nota, se etiqueta con el correo electrónico de su cuenta de Google. Esta dirección de correo electrónico es visible, junto con la nota, para todos los miembros del proyecto con acceso para ver la nota.
A continuación se describe el acceso necesario para ver, escribir y eliminar notas:
Los miembros del proyecto con cualquiera de los siguientes roles pueden ver y eliminar notas existentes y escribir nuevas notas sobre un tema.
Los miembros del proyecto con cualquiera de los siguientes roles pueden ver las notas publicadas sobre un problema, pero no pueden eliminar ni escribir una nota.
- Visor de proyectos, Visor de Firebase , Visor de calidad o Visor de Crashlytics
Consulte Comprender las métricas sin fallos .
Las notas permiten a los miembros del proyecto comentar sobre temas específicos con preguntas, actualizaciones de estado, etc.
Cuando un miembro del proyecto publica una nota, se etiqueta con el correo electrónico de su cuenta de Google. Esta dirección de correo electrónico es visible, junto con la nota, para todos los miembros del proyecto con acceso para ver la nota.
A continuación se describe el acceso necesario para ver, escribir y eliminar notas:
Los miembros del proyecto con cualquiera de los siguientes roles pueden ver y eliminar notas existentes y escribir nuevas notas sobre un tema.
Los miembros del proyecto con cualquiera de los siguientes roles pueden ver las notas publicadas sobre un problema, pero no pueden eliminar ni escribir una nota.
- Visor de proyectos, Visor de Firebase , Visor de calidad o Visor de Crashlytics
Integraciones
Si su proyecto utiliza Crashlytics junto con el SDK de anuncios de Google para móviles, es probable que los informadores de fallos estén interfiriendo al registrar controladores de excepciones. Para solucionar el problema, desactive los informes de fallos en el SDK de anuncios móviles llamando disableSDKCrashReporting
.
Después de vincular Crashlytics a BigQuery, los nuevos conjuntos de datos que cree se ubican automáticamente en los Estados Unidos, independientemente de la ubicación de su proyecto de Firebase.
Problemas regresivos
Un problema ha tenido una regresión cuando lo cerró anteriormente, pero Crashlytics recibe un nuevo informe que indica que el problema ha vuelto a ocurrir. Crashlytics vuelve a abrir automáticamente estos problemas regresivos para que puedas abordarlos según corresponda para tu aplicación.
A continuación se muestra un escenario de ejemplo que explica cómo Crashlytics clasifica un problema como una regresión:
- Por primera vez, Crashlytics recibe un informe de fallo sobre el fallo "A". Crashlytics abre un problema correspondiente a ese bloqueo (Problema "A").
- Corrige este error rápidamente, cierra el problema "A" y luego publica una nueva versión de su aplicación.
- Crashlytics recibe otro informe sobre el problema "A" después de haber cerrado el problema.
- Si el informe proviene de una versión de la aplicación que Crashlytics conocía cuando cerró el problema (lo que significa que la versión había enviado un informe de falla por cualquier falla), entonces Crashlytics no considerará que el problema ha retrocedido. La cuestión permanecerá cerrada.
- Si el informe proviene de una versión de la aplicación que Crashlytics no conocía cuando cerró el problema (lo que significa que la versión nunca había enviado ningún informe de falla), entonces Crashlytics considera que el problema ha retrocedido y lo volverá a abrir. .
Cuando un problema regresa, enviamos una alerta de detección de regresión y agregamos una señal de regresión al problema para informarle que Crashlytics ha vuelto a abrir el problema. Si no desea que un problema se vuelva a abrir debido a nuestro algoritmo de regresión, "silencia" el problema en lugar de cerrarlo.
Si un informe proviene de una versión anterior de la aplicación que nunca había enviado ningún informe de fallas cuando cerró el problema, Crashlytics considera que el problema ha retrocedido y lo volverá a abrir.
Esta situación puede ocurrir en la siguiente situación: corrigió un error y lanzó una nueva versión de su aplicación, pero aún tiene usuarios en versiones anteriores sin la corrección del error. Si, por casualidad, una de esas versiones anteriores nunca había enviado ningún informe de fallos cuando usted cerró el problema, y esos usuarios comienzan a encontrar el error, entonces esos informes de fallos desencadenarían un problema en regresión.
Si no desea que un problema se vuelva a abrir debido a nuestro algoritmo de regresión, "silencia" el problema en lugar de cerrarlo.
Informar excepciones no detectadas como fatales
Crashlytics puede informar excepciones no detectadas como fatales (a partir de la versión 10.4.0 del SDK de Unity). Las siguientes preguntas frecuentes ayudan a explicar los fundamentos y las mejores prácticas para utilizar esta función.
Al informar las excepciones no detectadas como fatales, obtienes una indicación más realista de qué excepciones pueden provocar que el juego no se pueda reproducir, incluso si la aplicación continúa ejecutándose.
Tenga en cuenta que si comienza a informar casos fatales, su porcentaje de usuarios sin fallas (CFU) probablemente disminuirá, pero la métrica CFU será más representativa de las experiencias de los usuarios finales con su aplicación.
Para que Crashlytics informe una excepción no detectada como fatal, se deben cumplir las dos condiciones siguientes:
Durante la inicialización de su aplicación, la propiedad
ReportUncaughtExceptionsAsFatal
debe establecerse entrue
.Su aplicación (o una biblioteca incluida) genera una excepción que no se detecta. Una excepción que se crea, pero no se lanza , no se considera no detectada.
Cuando empiece a recibir informes de excepciones no detectadas como fatales, aquí hay algunas opciones para manejar estas excepciones no detectadas:
- Considere cómo puede empezar a detectar y gestionar estas excepciones no detectadas.
- Considere diferentes opciones para registrar excepciones en la consola de depuración de Unity y en Crashlytics.
Captar y manejar excepciones lanzadas
Las excepciones se crean y lanzan para reflejar estados inesperados o excepcionales . Resolver los problemas reflejados por una excepción lanzada implica devolver el programa a un estado conocido (un proceso conocido como manejo de excepciones ).
Es una buena práctica detectar y manejar todas las excepciones previstas, a menos que el programa no pueda regresar a un estado conocido.
Para controlar qué tipos de excepciones son capturadas y manejadas por qué código, incluya el código que podría generar una excepción en un bloque try-catch
. Asegúrese de que las condiciones en las declaraciones catch
sean lo más limitadas posible para manejar las excepciones específicas de manera adecuada.
Registrar excepciones en Unity o Crashlytics
Hay varias formas de registrar excepciones en Unity o Crashlytics para ayudar a depurar el problema.
Al utilizar Crashlytics, estas son las dos opciones más comunes y recomendadas:
Opción 1: imprimir en la consola de Unity, pero no informar a Crashlytics durante el desarrollo o la resolución de problemas
- Imprima en la consola de Unity usando
Debug.Log(exception)
,Debug.LogWarning(exception)
yDebug.LogError(exception)
, que imprimen el contenido de la excepción en la consola de Unity y no vuelven a generar la excepción.
- Imprima en la consola de Unity usando
Opción 2: cargar en Crashlytics para obtener informes consolidados en el panel de Crashlytics para las siguientes situaciones:
- Si vale la pena registrar una excepción para depurar un posible evento Crashlytics posterior, utilice
Crashlytics.Log(exception.ToString())
. - Si aún se debe informar una excepción a Crashlytics a pesar de haber sido detectada y manejada, utilice
Crashlytics.LogException(exception)
para registrarla como un evento no fatal.
- Si vale la pena registrar una excepción para depurar un posible evento Crashlytics posterior, utilice
Sin embargo, si desea informar manualmente un evento fatal a Unity Cloud Diagnostics, puede usar Debug.LogException
. Esta opción imprime la excepción en la consola de Unity como la Opción 1, pero también genera la excepción (ya sea que se haya lanzado o detectado todavía). Lanza el error de forma no local. Esto significa que incluso una Debug.LogException(exception)
circundante con bloques try-catch
todavía resulta en una excepción no detectada.
Por lo tanto, llame Debug.LogException
si y sólo si desea realizar todo lo siguiente:
- Para imprimir la excepción en la consola de Unity.
- Subir la excepción a Crashlytics como un evento fatal.
- Para generar la excepción, haga que se trate como una excepción no detectada y que se informe a Unity Cloud Diagnostics.
Tenga en cuenta que si desea imprimir una excepción detectada en la consola de Unity y cargarla en Crashlytics como un evento no fatal, haga lo siguiente:
try
{
methodThatThrowsMyCustomExceptionType();
}
catch(MyCustomExceptionType exception)
{
// Print the exception to the Unity console at the error level.
Debug.LogError(exception);
// Upload the exception to Crashlytics as a non-fatal event.
Crashlytics.LogException(exception); // not Debug.LogException
//
// Code that handles the exception
//
}