【问题标题】:Is there a equivalent of C#'s DebuggerStepThrough in Kotlin?Kotlin 中是否有相当于 C# 的 DebuggerStepThrough 的功能?
【发布时间】:2021-03-13 08:42:55
【问题描述】:

我在 Kotlin 中创建了一个事件系统,可以在其中监听和广播事件,类似于 C# 中事件的工作方式。

要广播事件,我有这行:

playerConnected.broadcast(player)

这里playerConnected 是事件,player 是上下文对象。

在 IntellIJ 中调试时,当“步入”广播函数以查看事件侦听器执行的操作时,它改为步入 broadcast() 函数,这是有道理的,它看起来像这样:

fun broadcast(args: T) {
    for (listener in listeners) {
        try {
            listener.accept(args)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

我有兴趣跳过进入broadcast() 而是直接进入每个accept() 函数,其中listenerConsumer<T>

在 C# 中,我可以通过将 DebuggerStepThroughAttribute 添加到 broadcast() 函数来解决此问题。

在 Kotlin 中是否有任何等效属性或在 IntellIJ 中实现相同的其他方式?

【问题讨论】:

  • 查看 Kotlin/IntelliJ 文档,它看起来像 you can only direct the debugger to ignore Kotlin's runtime library types and not your own(但对于 Java,你可以,很奇怪)。我建议您向 Jetbrains 提交功能请求。
  • 您确定要吞下broadcast 中的异常而不是向上传递吗?
  • 你的目标是 JVM 吗?如果是这样,您可以将 IntelliJ 设置为忽略 broadcast 所在的 Kotlin 类的 Java 对应项。
  • @Dai 这个事件系统是为了运行潜在的用户代码(用于模组),如果我没有捕捉到异常,其余的监听器将不会被执行。然而,我将改进我进行日志记录的方式,以便为事件 l 侦听器开发人员提供更多上下文。我相信这类似于 C# 的事件系统的工作方式。
  • @VapidLinus 啊,你正在执行不受信任的代码 - 玩得开心;)

标签: c# kotlin debugging intellij-idea


【解决方案1】:

如果您的目标是 JVM,并且broadcast 是一个类的方法,您可以将调试器设置为忽略整个类。

进入 IntelliJ IDEA 的设置,构建、执行、部署 > 调试器 > 步进。

在“Java”部分,您可以添加一个您希望它忽略的类:

点击“+”按钮后,可以搜索broadcast所在的班级,添加班级后,整个班级将被忽略。


如果您不希望它忽略整个班级,这里有一个可能有效的“技巧”。将broadcast 重写为扩展函数在单独的文件中。假设您的文件名为Foo.kt。这实际上将转换为一个名为FooKt 的Java 类,当您在“要忽略的类列表”对话框中搜索它时,它就会显示出来。当然,并不是所有的方法都可以重写为扩展函数,而且将它们重写为扩展函数并不总是有意义的,所以这并不总是有效:(

【讨论】:

  • 这解决了我的用例,非常感谢!我看到的唯一问题是这是一个计算机本地解决方案。签出此项目的其他人将必须经历相同的过程,除非有办法在项目中同步此设置。在 C# 中,这是使用属性解决的,因为它将应用于签出代码的每个人,而不仅仅是设置它的单个用户。
猜你喜欢
  • 2014-04-02
  • 2012-06-18
  • 2023-03-31
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多