Javaagent 为什么在IDEA中调试不了ClassFileTransformer的transform方法?

Javaagent Why can't I debug the transform method of ClassFileTransformer in IDEA?

提问人:larvae fish 提问时间:11/8/2023 最后编辑:egleaselarvae fish 更新时间:11/8/2023 访问量:25

问:

我在 transform 方法中打印了当前线程信息,输出是这样的:Thread[JDWP Transport Listener: dt_socket,10,system]

换言之,此转换由 JDWP 线程执行。JDWP 不是用于断点的线程吗?

我很困惑。我有两个问题。

  1. 为什么这个线程执行 transform 方法?
  2. 为什么我不能停在变换方法上?

谁能给我一些建议?谢谢!

Java 调试 转换

评论

1赞 Holger 11/9/2023
我们在谈论什么样的转变?例如,加载时间转换将在触发类加载的线程中完成。如果这种情况发生在实现调试功能的线程上,则无法调试调试器也就不足为奇了......
0赞 Community 11/9/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 larvae fish 11/9/2023
@Holger 是的,我在程序运行过程中通过IDEA将类文件编译为Hotswap,所以我认为是加载时转换。从你说的话中,我大概知道原因了。我在调试器中编译了 java 文件,因此类加载是由 JDWP 线程触发的。非常感谢!我想知道的另一件事是,这是我第一次听到“加载时间转换”这个词。还有其他类型的转换吗?
0赞 larvae fish 11/9/2023
@Holger我更改了触发类加载的线程 - 通过使用远程断点而不是本地断点,现在断点被命中了。真的很难得到这样的提示,谢谢你回答我的问题!
1赞 Holger 11/9/2023
“加载时间”是指第一次加载一个类。因此,当您热交换类时,您已经属于第二类,这在文档中称为“重新转换”。但看起来,行为和解决方案是相似的,即重新转换也发生在触发重新定义的线程中。唯一的区别是,重新定义和再转换在它们可以改变的内容方面是有限的。

答: 暂无答案