如何恢复协程的真实通话记录?

Mar*_*nik 7 android kotlin kotlin-coroutines

对于使用异步API的任何人来说,这都是一个痛苦的熟悉问题:当您的调用遇到故障时,异步库的私有线程会检测到它,创建一个异常对象,并将其传递给您的回调。值得一毛钱的唯一信息就是该消息及其类型。堆栈跟踪毫无价值。

与Google Play报告应用程序崩溃的方式混杂在一起:消息被剥离,而您得到的只是堆栈跟踪。现在,您已一无所有。您只知道您的应用程序存在您在自己的测试中未检测到的错误。

Kotlin的协程至少给我们一些希望,可以将其做得更好。协程堆栈跟踪在概念上在那里,只是很难提取。但是,当前我们获得的堆栈跟踪与我上面描述的相同,没有用。

我熟悉kotlinx-coroutines-debug模块,并且在实现方面有一些规定可以重新创建协程堆栈跟踪,但是如何在用户智能手机上安装的生产应用程序中利用这些功能?

小智 6

我遇到了同样的问题。Kotlin 协程调试库对我没有任何帮助。因此,在研究了协程的实现之后,我基于字节码生成和MethodHandle API编写了自己的解决方案。它支持 JVM 1.8 和 Android API 26 或更高版本。我将其称为Stacktrace-decoroutinator

堆栈跟踪丢失的原因是当协程唤醒时,仅调用其调用堆栈的最后一个方法。

我的库替换了协程唤醒实现。它在运行时生成名称与整个协程调用堆栈匹配的类。这些类除了在协程调用堆栈序列中相互调用之外不执行任何操作。

因此,如果协程抛出异常,它们会在创建异常堆栈跟踪期间模仿协程的真实调用堆栈。


nie*_*els 5

首先,所有功能目前都已损坏。如果错误被修复我会尝试System.setProperty(DEBUG_PROPERTY_NAME,DEBUG_PROPERTY_VALUE_ON)