android - 如何恢复协程的真实调用轨迹?

标签 android kotlin kotlin-coroutines

对于使用异步 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/

相关文章:

android - 错误 :Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'

spring - 如何在 SpEL 中按类型引用 bean?

gradle - 无法使用 Gradle 和 Kotlin 编译项目

multithreading - 为什么使用协程阻塞线程时会执行代码?

multithreading - Coroutine Scope、Suspend 和 withContext 查询

android - 在哪里可以找到 FragmentTabHost 库

android - Chrome 自定义选项卡链接不会启动应用程序,但移动 Chrome 浏览器会启动应用程序

android - 在官方 Android 模拟器上安装 ARM Translation (libhoudini)

kotlin - Gradle的初学者问题

android - 协程没有启动?