断点是否在调试时使用挂起和恢复等方法



这个问题困扰了我很长时间。断点在调试代码时确实很棒,但它们究竟是如何工作的呢?

我知道suspendstopresume已被弃用。断点是否在其位置添加无限while循环以停止进程,并在从IDE中单击恢复时使用其他thread更改条件

如果他们使用已弃用的方法,它们的安全性如何?

这让我想到了下一个问题,即在使用断点时,它们是否有可能弄乱了线程,并且程序的行为与没有断点的行为不同。

魔术发生了。

具体来说,调试代理使用普通代码无法访问的特殊低级钩子与 JVM 通信。 这些允许程序员停止线程,除此之外,还有更多普通Java程序无法做到的事情。

但即使调试器确实使用了已弃用的方法,这仍然可以。 调试器在程序员的要求下进行调用,程序员了解挂起线程可能会产生后果。 例如,程序员理解(或应该这样做)在一个线程中设置断点可能会导致它在超时内不notify对象,并导致另一个线程出现异常。 等等。

这些方法被弃用的事实并不意味着它们不起作用。 这意味着不应该Java 代码中使用它们。


JDWP 是其中的一部分,但它是用户的调试器与调试代理通信的协议。 真正的魔术发生在调试代理和 JVM 的其余部分之间。 如果你真的想/需要理解,看看OpenJDK源代码。


这让我想到了下一个问题,即在使用断点时,它们是否有可能弄乱了线程,并且程序的行为与没有断点的行为不同。

绝对! 除了线程停止等问题(见上文),当您在调试代理处于活动状态的情况下运行时,它会改变 JVM JIT 编译器编译内容的方式。 这可以改变代码的行为。 实际上,如果您正在寻找由于争用条件或内存模型异常而导致的错误,则调试器很可能会更改行为。

最新更新