16

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

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

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

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

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

4

2 回答 2

14

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

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

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

于 2009-05-13T07:04:54.663 回答
7

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

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

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

于 2009-05-14T05:23:59.697 回答