对于任何使用异步API的人来说,这都是一个非常熟悉的问题:当您的调用遇到故障时,异步库的专用线程会检测到它,创建一个异常对象,并将其传递给回调。在这个异常中,唯一有价值的信息是它的消息,可能还有它的类型。堆栈跟踪毫无价值。
将其与Google Play报告应用程序崩溃的方式进行交叉:消息被剥离,你得到的只是堆栈跟踪。现在你什么都没有了。你只知道你的应用程序有一个你在自己的测试中没有检测到的错误。
Kotlin的合作至少给了我们一些希望,希望这能变得更好。协程堆栈跟踪在概念上是存在的,只是很难提取。然而,目前我们得到的堆栈跟踪与我上面描述的相同,毫无用处。
我熟悉kotlinx协程调试模块,我看到在实现方面有一些重新创建协程堆栈跟踪的规定,但我如何在安装在用户智能手机上的生产应用程序中使用这些设施?
我也遇到了同样的问题。Kotlin协同程序调试库对我没有任何帮助。因此,在研究了协程的实现之后,我编写了自己的基于字节码生成和MethodHandle API的解决方案。它支持JVM 1.8和Android API 26或更高版本。我称之为Stacktrace去例程。
stacktrace丢失的原因是,当协程唤醒时,只调用其调用堆栈的最后一个方法。
我的库取代了协同程序唤醒实现。它在运行时生成名称与整个协程调用堆栈匹配的类。这些类除了在协程调用堆栈序列中相互调用之外,什么都不做。
因此,如果协同程序抛出异常,它们会在创建异常堆栈时模拟协同程序的实际调用堆栈。
首先,所有功能目前都已损坏。如果这个错误被修复,我会尝试System.setProperty(DEBUG_PROPERTY_NAME,DEBUG_PROPERTY_VALUE_ON)
。
kotlinx-coroutines-core
的1.3.8或更高版本)起就提供了这种可能性。
刚刚发现一个与此相关的github问题:
Stacktrace恢复(https://github.com/Kotlin/kotlinx.coroutines/pull/792)以及相关文档(https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/debugging.md)
如果没有调用方站点stacktrace,协同调试确实很痛苦。希望";调试模式";可以提供帮助。我会试试看。