Thi*_*ilo 16 java debugging jvm breakpoints
如何在Java中设置断点?它只是基于源文件名和行号吗?类或方法名称是否也包括在内?
如果我的调试器中有旧版本的源并设置了断点,则当我单步执行时光标将关闭.它能走多远?它可以进入错误的方法(如果该文件中有多个类,甚至是错误的类)?
当JVM中有多个同名的类时会发生什么情况(如果你有多个类加载器,可能会发生这种情况)?他们都得到了断点吗?
在Web应用程序容器中,我可以为一个Web应用程序(而不是其他Web应用程序)设置断点吗?
这有多少是特定于IDE的,以及JVM提供的调试接口决定了多少?例如:在Eclipse中,我可以根据变量的值设置条件断点.这只是Eclipse在JVM中的无条件断点上完成的过滤吗?
Wou*_*rts 14
有不同类型的断点.有些断点是基于行的,有些则不是.这对您的实际调试有何影响取决于您的IDE实际执行的操作.例如,在Eclipse中,如果在方法中间添加断点,那么这将是基于行的断点.如果在包含方法签名的行上添加断点,那么它将是方法入口断点.
如果您正在查看的源代码不是正在运行的类的确切来源,则行断点将不会映射到正确的行.所以java可能不会停在您想要的那一行,而您的IDE确实可能会向您显示错误的方法甚至是错误的类.但是方法入口断点仍然可以工作(在正确的时刻停止),即使定义了方法的行已经改变了; 但是IDE可能会在调试器中显示错误的行.(还有其他类型的事件/断点,比如类加载,...... 如果你想了解更多关于内部的信息,你可以看一下EventRequest的子接口).
要回答您的其他问题:断点适用于JVM中的所有类加载器.
JVM支持用于调试的标准API(请参阅Java平台调试器体系结构),并且所有IDE都使用JPDA来完成设置断点,计算表达式等所有繁重工作.IDE"只是"将它包装在漂亮的用户界面中.
设置断点时,IDE会与JVM的工具接口(JDPA的一部分)进行通信,并为其提供断点的源文件和行号.JVM具有将断点的物理位置映射到类的已编译代码中的Java语句的实际位置所需的信息.当JVM到达断点时,它会停止执行该线程并告诉IDE断点的源文件和行号.然后,IDE会向您显示位置.
当我调试时,我有时添加或删除行来解决问题,然后继续下一个问题.事情变得很奇怪,因为断点现在似乎比我预期的更早或更晚,如果我设置了新的断点,他们实际上并不是我设置的源线.发生这种情况时,我重新启动程序,然后IDE和JVM再次保持一致.