首页 > 解决方案 > 如何使用 IntelliJ 调试器在 Kotlin 中设置断点?

问题描述

Kotlin 标准库有一个简洁的函数require,类似于运行时assert

@kotlin.internal.InlineOnly
public inline fun require(value: Boolean, lazyMessage: () -> Any): Unit {
    contract {
        returns() implies value
    }
    if (!value) {
        val message = lazyMessage()
        throw IllegalArgumentException(message.toString())
    }
}

当我调试时,我希望能够在这个函数中设置一个断点,就在抛出异常之前。像这样,一旦需求被破坏,我就会在调试器中看到整个堆栈跟踪和局部变量。但是,这似乎不起作用:

在此处输入图像描述

起初我以为这是因为require是一个inline函数。我用我的一个函数做了一个实验,inline调试器按预期停止了。

作为一种解决方法,我尝试将调试器设置为中断异常,但是我正在使用的框架 (Spring) 在每次应用程序启动时都会引发大量异常,这使得忽略不相关的异常变得非常乏味。

我想知道如何使它工作,但我也对“它不起作用”的原因感兴趣。

标签: intellij-ideakotlin

解决方案


目前无法在 Kotlin 中为标有InlineOnly注释的函数设置断点,并且require是此类函数之一。标有此注释的内联函数不提供额外的调试信息,以便在堆栈跟踪中保存调用站点中未触及的行,但它也会破坏在内部设置断点(https://youtrack.jetbrains.com/issue/KT -24306 )。

您发现了一种解决方法 - 使用异常断点 ( https://www.jetbrains.com/help/idea/creating-exception-breakpoints.html )。IllegalArgumentException在这种情况下将是最好的课程。

如果您的代码中有调用不起作用,它们可能会被替换为自定义函数作为另一种解决方法。

(答案已更新。之前的版本错误地声称断点require可能适用于某些调用。)


推荐阅读