intellij-idea - 如何使用 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) 在每次应用程序启动时都会引发大量异常,这使得忽略不相关的异常变得非常乏味。
我想知道如何使它工作,但我也对“它不起作用”的原因感兴趣。
解决方案
目前无法在 Kotlin 中为标有InlineOnly注释的函数设置断点,并且require
是此类函数之一。标有此注释的内联函数不提供额外的调试信息,以便在堆栈跟踪中保存调用站点中未触及的行,但它也会破坏在内部设置断点(https://youtrack.jetbrains.com/issue/KT -24306 )。
您发现了一种解决方法 - 使用异常断点 ( https://www.jetbrains.com/help/idea/creating-exception-breakpoints.html )。IllegalArgumentException
在这种情况下将是最好的课程。
如果您的代码中有调用不起作用,它们可能会被替换为自定义函数作为另一种解决方法。
(答案已更新。之前的版本错误地声称断点require
可能适用于某些调用。)
推荐阅读
- google-cloud-data-fusion - 关于google数据融合的一些问题
- postgresql - 在 PostgreSQL/PostGIS 中的多边形交叉点内查找点
- reactjs - 如何使用保存在本地存储中的先前创建的表单填充表单并在 React 中对其进行编辑
- java - 如何在对象中搜索数据并转换为列表
- python-3.x - 如何修复在 CMD get 的 DLL 错误中启动的 Python 脚本,但在 Pycharm 和 Anaconda Comand Promt 中运行
- php - Smarty 的审计日志模块
- r - 操纵绘图网格中某些绘图之间的边距
- javascript - 关闭窗口时清除所有设计更改
- javascript - 嵌套 fetch-es 完成后如何执行操作?
- angular - 触摸其他字段时如何显示表单字段的错误?