对于使用异步 API 的任何人来说,这是一个令人痛苦的熟悉问题:当您的调用遇到故障时,异步库的私有(private)线程会检测到它,创建一个异常对象,并将其传递给您的回调。在该异常中唯一值一毛钱的信息是它的消息,可能还有它的类型。堆栈跟踪毫无值(value)。
与 Google Play 报告应用程序崩溃的方式相结合:消息被剥离,您得到的只是堆栈跟踪。现在你无事可做。您只知道您的应用有一个您在自己的测试中没有检测到的错误。
Kotlin 的协程至少给了我们一些改进的希望。协程堆栈跟踪在概念上是存在的,只是难以提取。然而,目前我们得到的堆栈跟踪是相同的,我上面描述的无用的。
我熟悉 kotlinx-coroutines-debug模块,我看到在实现方面有一些规定可以重新创建协程堆栈跟踪,但是我如何在用户智能手机上安装的生产应用程序中使用这些工具?
最佳答案
我遇到了同样的问题。 Kotlin 协程调试库对我没有任何帮助。因此,在研究了协程的实现之后,我基于字节码生成和MethodHandle API编写了自己的解决方案。它支持 JVM 1.8 和 Android API 26 或更高版本。我叫它Stacktrace-decoroutinator .
stacktrace丢失的原因是协程唤醒时,只调用了其调用栈的最后一个方法。
我的库替换协程唤醒实现。它在运行时生成名称与整个协程调用堆栈匹配的类。 这些类除了在协程调用堆栈序列中相互调用外什么都不做。
因此,如果协程抛出异常,它们会在创建异常堆栈跟踪期间模拟协程的真实调用堆栈。
关于android - 如何恢复协程的真实调用轨迹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349418/