在Java中设置断点

时间:2009-05-13 06:31:43

标签: java debugging jvm breakpoints

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

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

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:6)

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

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

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