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

y4ekin9u  于 2023-10-23  发布在  Kotlin
关注(0)|答案(4)|浏览(125)

这是一个令人痛苦的熟悉的问题,任何人都与api工作:当你的调用遇到失败的时候,这个函数库的私有线程会检测到它,创建一个异常对象,并把它传递给你的回调函数。在这个异常中,唯一有价值的信息是它的消息,可能还有它的类型。堆栈跟踪毫无价值。
将其与Google Play报告应用程序崩溃的方式进行交叉:消息被剥离,您得到的只是堆栈跟踪。现在你什么都没有了。你只知道你的应用程序有一个你在自己的测试中没有检测到的bug。
Kotlin的协程至少给予了我们一些希望,让我们可以做得更好。协程堆栈跟踪在概念上是存在的,只是难以提取。然而,目前我们得到的堆栈跟踪是相同的,我上面描述的无用的。
我对kotlinx-coroutines-debug模块很熟悉,我看到在实现方面有一些条款可以重新创建协程堆栈跟踪,但是我如何在安装在用户智能手机上的生产应用程序中使用这些设施呢?

x8goxv8g

x8goxv8g1#

我也面临着同样的问题。Kotlin协程调试库对我没有任何帮助。因此,在研究了协程的实现之后,我基于字节码生成和MethodHandle API编写了自己的解决方案。它支持JVM 1.8和Android API 26或更高版本。我叫它Stacktrace-decoroutinator
堆栈跟踪丢失的原因是,当协程唤醒时,只有其调用堆栈的最后一个方法被调用。
我的库取代了协程唤醒实现。它在运行时生成类,类的名称与整个协程调用堆栈匹配。这些类除了在协程调用堆栈序列中相互调用外,不做任何事情。
因此,如果协程抛出一个异常,它们将在创建异常堆栈跟踪期间模拟协程的真实的调用堆栈。

mrwjdhj3

mrwjdhj32#

首先,目前所有的功能都是broken。如果这个bug被修复了,我会尝试System.setProperty(DEBUG_PROPERTY_NAME,DEBUG_PROPERTY_VALUE_ON)

r6vfmomb

r6vfmomb3#

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

pinkon5k

pinkon5k4#

我在github上发现了一个与此相关的问题:
Stacktrace恢复(https://github.com/Kotlin/kotlinx.coroutines/pull/792)和相关文档(https://github.com/Kotlin/kotlinx.coroutines/blob/master/docs/debugging.md
没有调用者站点stacktrace,协同程序调试确实很痛苦。希望“调试模式”能有所帮助。会试试看的。

相关问题