【问题标题】:How to recover the coroutine's true call trace?如何恢复协程的真实调用痕迹?
【发布时间】:2019-01-24 14:52:54
【问题描述】:

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

与 Google Play 报告应用程序崩溃的方式相得益彰:消息被剥离,您得到的只是堆栈跟踪。现在你什么都没有了。您只知道您的应用有一个您在自己的测试中没有发现的错误。

Kotlin 的协程至少给了我们一些希望,希望它可以变得更好。协程堆栈跟踪在概念上就在那里,只是难以提取。但是,目前我们得到的堆栈跟踪和我上面描述的一样,没用。

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

【问题讨论】:

    标签: android kotlin kotlin-coroutines


    【解决方案1】:

    目前所有功能都是broken。如果错误得到修复,我会尝试System.setProperty(DEBUG_PROPERTY_NAME,DEBUG_PROPERTY_VALUE_ON)

    【讨论】:

      【解决方案2】:

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

      stacktrace丢失的原因是协程唤醒时,只调用了其调用栈的最后一个方法。

      我的库替换了协程唤醒实现。它在运行时生成名称与整个协程调用堆栈匹配的类。 这些类除了在协程调用堆栈序列中相互调用外,什么都不做。

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

      【讨论】:

        【解决方案3】:

        用于 IntelliJ IDEA provides this possibilityversion 1.4 的 Kotlin 插件(适用于 kotlinx-coroutines-core 的 1.3.8 或更高版本)。

        【讨论】:

        • 这仅与调试有关,与发生运行时错误时打印到控制台的堆栈跟踪无关。
        【解决方案4】:

        刚刚发现了一个与此相关的github问题:

        Stacktrace 恢复 (https://github.com/Kotlin/kotlinx.coroutines/pull/792) 和相关文档( https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/debugging.md)

        没有调用者站点stacktrace,协程调试确实很痛苦。希望“调试模式”能有所帮助。会试试看的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          • 2021-01-04
          • 2022-10-05
          • 1970-01-01
          • 2018-12-18
          • 1970-01-01
          相关资源
          最近更新 更多