在调试

时间:2018-03-10 10:52:41

标签: java eclipse thread-safety breakpoints

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

我了解不推荐使用suspendstopresume。当我们点击的简历时,断点会在其位置添加无限循环以停止该过程并使用其他thread来更改条件 IDE 即可。

如果他们使用弃用的方法,他们有多安全?

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

1 个答案:

答案 0 :(得分:4)

魔术发生了。

具体来说,调试代理使用普通代码无法访问的特殊低级挂钩与JVM通信。这些允许程序员停止线程,除了普通的Java程序不能做的更多。

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

不推荐使用这些方法的事实并不意味着它们不起作用。这意味着不应在您的 Java代码中使用它们。

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

  

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

绝对!此外,诸如已停止的线程(参见上文)之类的问题,当您在调试代理程序处于活动状态时运行时,它会改变JVM JIT编译器编译事物的方式。这可以改变代码的行为。实际上,如果您正在寻找由于竞争条件或内存模型异常而导致的错误,调试器很可能会改变行为。