在 Java 中设置断点

2022-09-03 06:26:33

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

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

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

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

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


答案 1

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

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

为了回答您的另一个问题:断点适用于 JVM 中的所有类装入器。


答案 2

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

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

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