在Java中设置断点

如何在Java中设置断点? 它只是基于源文件名和行号吗? 类或方法名称是否也适用?

如果我的调试器中有旧版本的源并设置了断点,则当我单步执行时光标将关闭。 它能走多远? 它可以进入错误的方法(如果该文件中有多个类,甚至是错误的类)?

当JVM中有多个同名的类时会发生什么情况(如果你有多个类加载器,可能会发生这种情况)? 他们都得到了断点吗?

在Web应用程序容器中,我是否可以仅为一个Web应用程序(而不是其他Web应用程序)设置断点?

这有多少是特定于IDE的,以及JVM提供的调试接口决定了多少? 例如:在Eclipse中,我可以根据变量的值设置条件断点。 这只是Eclipse在JVM中的无条件断点上完成的过滤吗?

有不同类型的断点。 有些断点是基于行的,有些则不是。 这对您的实际调试有何影响取决于您的IDE实际执行的操作。 例如,在Eclipse中,如果在方法的中间添加断点,那么这将是基于行的断点。 如果在包含方法签名的行上添加断点,那么它将是方法入口断点。

如果您正在查看的源代码不是正在运行的类的确切来源,则行断点将不会映射到正确的行。 所以java可能不会停在您想要的那一行,而您的IDE确实可能向您显示错误的方法甚至是错误的类。 但是方法入口断点仍然有效(在正确的时刻停止),即使定义方法的行已经改变; 但是IDE可能会在调试器中显示错误的行。 (还有其他类型的事件/断点,比如类加载,……如果你想了解更多关于内部的信息,你可以看一下EventRequest的子接口)。

回答您的另一个问题:断点适用于JVM中的所有类加载器。

JVM支持用于调试的标准API(请参阅Java平台调试器体系结构 ),并且所有IDE都使用JPDA来完成设置断点,计算表达式等所有繁重工作。 IDE“只是”将它包装在漂亮的用户界面中。

设置断点时,IDE会与JVM的工具接口(JDPA的一部分)进行通信,并为其提供断点的源文件和行号。 JVM具有将断点的物理位置映射到类的已编译代码中的Java语句的实际位置所需的信息。 当JVM到达断点时,它会停止执行该线程并告诉IDE断点的源文件和行号。 然后,IDE会向您显示位置。

当我调试时,我有时添加或删除行来解决问题,然后继续下一个问题。 事情变得很奇怪,因为断点现在似乎比我预期的更早或更晚,如果我设置了新的断点,他们实际上并不在源线上我设置它们。 发生这种情况时,我重新启动程序,然后IDE和JVM再次保持一致。