在Java中设置断点


问题内容

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

如果调试器中有旧版本的源代码并设置了断点,则逐步执行时光标会关闭。距离有多远?它会进入错误的方法中吗(如果该文件中有多个类,甚至是错误的类)?

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

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

其中有多少是特定于IDE的,有多少是由JVM提供的调试接口确定的?例如:在Eclipse中,我可以基于变量的值设置条件断点。这仅仅是由Eclipse在JVM中的无条件断点处完成的过滤吗?


问题答案:

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

如果您正在查看的源代码不是正在运行的类的确切源,则行断点当然不会映射到正确的行。因此,java可能不会停止在您期望的行上,并且IDE的确可能向您显示了错误的方法甚至错误的类。但是,即使定义方法的行已更改,方法输入断点仍将起作用(在正确的时间停止)。但是同样,IDE可能会在调试器中显示错误的行。(还有其他类型的事件/断点,例如类加载,…
如果您想了解更多有关内部的信息,可以看看EventRequest的子接口)。

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