如何使用IntelliJ调试器在Kotlin中设置断点?

时间:2018-04-26 13:17:10

标签: intellij-idea 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())
    }
}

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

enter image description here

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

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

我想知道如何让它发挥作用,但我也对为什么"它没有工作&#34感兴趣;

1 个答案:

答案 0 :(得分:2)

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

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

如果您的代码中的某些电话无法正常工作,则可能会将其替换为自定义功能,作为另一种解决方法。

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