Este es un problema dolorosamente familiar para cualquiera que trabaje con API asíncronas: cuando su llamada encuentra una falla, el subproceso privado de la biblioteca asíncrona lo detecta, crea un objeto de excepción y lo pasa a su devolución de llamada. La única información que vale un centavo en esa excepción es su mensaje y posiblemente su tipo. El seguimiento de la pila no tiene valor.
Cruce eso con la forma en que Google Play informa los bloqueos de la aplicación: el mensaje se elimina y todo lo que obtiene es el seguimiento de la pila. Ahora no tienes con qué ir. Solo sabe que su aplicación tiene un error que no detectó en sus propias pruebas.
Las corrutinas de Kotlin al menos nos dan alguna esperanza de que esto podría mejorarse. El seguimiento de la pila coroutine está conceptualmente allí, solo que es difícil de extraer. Sin embargo, actualmente los rastros de pila que obtenemos son los mismos inútiles que describí anteriormente.
Estoy familiarizado con el módulo kotlinx-coroutines-debug y veo que hay algunas disposiciones en el lado de la implementación para recrear el seguimiento de la pila coroutine, pero ¿cómo puedo hacer uso de estas instalaciones en una aplicación de producción instalada en el teléfono inteligente de mi usuario?
Me enfrenté al mismo problema. La biblioteca de depuración de rutinas de Kotlin no me ayudó de ninguna manera. Por lo tanto, después de estudiar la implementación de las rutinas, escribí mi propia solución basada en la generación de código de bytes y la API MethodHandle. Es compatible con JVM 1.8 y Android API 26 o superior. Lo llamé Stacktrace-decoroutinator .
La razón por la que se pierde stacktrace es que cuando la corrutina se activa, solo se llama al último método de su pila de llamadas.
Mi biblioteca reemplaza la implementación del despertar coroutine. Genera clases en tiempo de ejecución con nombres que coinciden con toda la pila de llamadas de rutina. Estas clases no hacen nada excepto llamarse entre sí en la secuencia de la pila de llamadas coroutine.
Por lo tanto, si la corrutina lanza una excepción, imitan la pila de llamadas real de la corrutina durante la creación del seguimiento de la pila de excepciones.
El complemento de Kotlin para IntelliJ IDEA brinda esta posibilidad desde la versión 1.4 (para las versiones 1.3.8 o posteriores de kotlinx-coroutines-core ).