在IntelliJ中调试Java程序时,如何显示正在执行的字节码?

Mar*_*sse 6 java debugging intellij-idea

我正在使用 IntelliJ 来调试 Java 程序。在我目前的情况下,这恰好是 IntelliJ 本身——调试其中的问题——但过去其他代码也出现过类似的问题。

在单步执行时,在单步执行方法的某个时刻,IntelliJ 将不再显示正在执行的代码。当源代码不可用时,我习惯于单步执行反编译的字节代码,但在这种情况下,IntelliJ 不会显示任何内容——没有源代码,没有字节代码,什么也没有。当从RemoteExternalSystemProjectResolverImpl进入时会发生这种情况GradleProjectResolver

非常可疑的是,当从来自UrlClassLoader, 的类步入来自 的类时,问题就发生了PluginClassLoader

我知道,当字节码来自性质未知的类加载器时,调试器在将正在执行的字节码与源代码关联起来时会遇到问题,因为没有明确定义的机制。请注意,我完全可以单步执行反编译代码。(即使单步执行字节码指令也可以,但据我所知 IntelliJ 不支持这一点)。我不确定如何自己提供匹配的源代码,所以我宁愿查看字节码以确保我没有看到虚假信息。

我不明白的是为什么 IntelliJ 不会向我显示该字节码。与源代码不同,字节码可用的,因为毕竟它现在正在执行。

我应该怎么做才能让 IntelliJ 显示正在执行的字节码?

更新:重现步骤

  • 使用 IntelliJ 创建 IntelliJ 插件项目
  • 创建一个新文件夹,其中包含一个空的 build.gradle 文件
  • 在调试模式下运行 IntelliJ 的“来宾”实例
  • 导入空的gradle项目
  • 在“主机”IntelliJ 中,转到 RemoteExternalSystemProjectResolverImpl.resolveProjectInfo 并对 this.myDelegate.resolveProjectInfo 的内部调用设置断点
  • 在“来宾”IntelliJ 中,点击 Gradle 重新导入按钮。它应该到达断点。
  • 单步执行被调用的函数。这将显示堆栈上的帧,但没有代码——甚至没有原始或反编译的字节码。

Ste*_*fan -3

您可能正在调试一个在没有调试信息的情况下编译的库。为此,Java 编译器具有命令行选项“-g”。

我假设您不明白字节码是什么。这是一堆数值,无法以与源代码类似的方式显示。您将无法读取字节码。

你通常看到的是反编译的字节码,这取决于调试信息的存在。

  • 当至少用 javap -c 反汇编字节码时,我完全能够读取字节码,因为我自己编写了一个简单的 JVM。调试信息会有帮助,但没有的话我也没关系。反编译的字节代码不依赖于 IntelliJ 调试器中的调试信息,只是可读性稍差一些(例如没有局部变量名称,只有 var1、var 2 等)。最后,我看到的实际上是什么都没有,甚至不是原始字节值。当我进入 IntelliJ 时,它甚至不会为正在执行的类打开编辑器窗格。 (2认同)