Kotlin,Android,如何正确调试协程?

39
我正在尝试调试我的协程,但是在挂起函数中放置断点无效。请帮助我理解原因。 使用Android Studio进行工作。 好的,我从viewModelScope启动了一个协程:
    viewModelScope.launch(IO) {
        when(val result = interactor.getAllWords()){...}
    }

getAllWords()中,我写道:

    override suspend fun getAllWords(): WordResult {
        val words = mutableListOf<Word>()

        when (val wordsResult = getAllWordsWithoutFiltersApplying()) {}

        ...

        return getWordsWithSelectedPattern()

我有两个挂起函数:getAllWordsWithoutFiltersApplying()getWordsWithSelectedPattern()。我在这两个函数中都设置了断点,但是在调试模式下它们没有触发。

同时,当我把断点放到代码行val words = mutableListOf<Word>() 上时,它会触发。

如果我在“非跟踪”函数中添加一些日志输出,它们可以正常工作。也就是说,挂起函数是有效的,但是断点不起作用。

我该如何调试它们?

* 我已经添加了截图。请查看左侧的图标行。为什么我的行不可用?

enter image description here


你能发布 getAllWordsWithoutFiltersApplying() 的完整代码吗? - Kushal
4个回答

47
根据您的示例代码,您在MAINIO之间切换协程上下文,因此当您设置断点时,请确保suspend选项为ALL要显示断点选项,请使用鼠标左键设置断点,然后右键单击断点。 如果您正在使用JetBrain IDE,请根据文档,设置断点时确保suspend选项为ALL而不是线程。这对我很有效。

enter image description here

更多详细信息可以查看文档

enter image description here


2
非常有帮助的答案。这应该是被采纳的答案。 - Abdulmalek Dery
29
不适用于流程。使用包括Android依赖项的协程1.4.0。 - Teja Konjeti
为什么这不是默认行为? - mr5
卡在“评估中...” - UdaraWanasinghe

3

对我来说仍然不起作用,因为我先运行应用程序,然后再附加调试器,但当我使用调试时,它就可以工作。


问题出在单元测试中... - Mahdi

1
我曾经忘记在我的build.gradle文件中将minifyEnabled设置为true
  buildTypes {
    release {
      minifyEnabled true
    }
    debug {
      minifyEnabled true <- Should be false for these breakpoints to work
    }
  }

1
我知道我晚了,但是这是为那些和我犯过类似错误的人准备的。最近我也遇到了这个问题,根本原因与依赖项有关。实际上,我添加了协程核心依赖项,但我忘记添加协程 Android 依赖项。请确保在您的 gradle 文件中都存在这两个依赖项,如下所示。
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.4'

9
据我所知,kotlinx-coroutines-android仅包含主调度程序。它如何帮助调试? - MatrixDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接