这个问题长期困扰着我。在调试代码时,断点真的很棒,但它们究竟是如何工作的?
我了解不推荐使用suspend
,stop
和resume
。当我们点击的简历时,断点会在其位置添加无限而循环以停止该过程并使用其他thread
来更改条件 IDE 即可。
如果他们使用弃用的方法,他们有多安全?
这让我想到下一个问题,即在使用断点时,它们是否可能搞乱了线程,并且程序的行为与没有断点的行为不同。
答案 0 :(得分:4)
魔术发生了。
具体来说,调试代理使用普通代码无法访问的特殊低级挂钩与JVM通信。这些允许程序员停止线程,除了普通的Java程序不能做的更多。
但即使调试器确实使用了弃用的方法,这仍然可以。调试器在程序员的要求下进行调用,他们了解暂停线程可能会产生后果。例如,程序员理解(或应该这样做)在一个线程中设置断点可能导致它在超时内不notify
一个对象,并导致另一个线程获得异常。等等。
不推荐使用这些方法的事实并不意味着它们不起作用。这意味着您不应在您的 Java代码中使用它们。
JDWP是其中的一部分,但它是用户调试器与调试代理进行通信的协议。真正的魔力发生在调试代理和JVM的其余部分之间。如果您真的想/需要了解,请查看OpenJDK源代码。
这让我想到下一个问题,即在使用断点时,它们是否可能搞乱了线程,并且程序的行为与没有断点的行为不同。
绝对!此外,诸如已停止的线程(参见上文)之类的问题,当您在调试代理程序处于活动状态时运行时,它会改变JVM JIT编译器编译事物的方式。这可以改变代码的行为。实际上,如果您正在寻找由于竞争条件或内存模型异常而导致的错误,调试器很可能会改变行为。