我在尝试设置断点时在Eclipse中遇到了这个奇怪的错误。
Unable to insert breakpoint Absent Line Number Information
我在“编译器”选项中打了勾,但没有运气。
我在尝试设置断点时在Eclipse中遇到了这个奇怪的错误。
Unable to insert breakpoint Absent Line Number Information
我在“编译器”选项中打了勾,但没有运气。
Answers:
我在Eclipse 3.4.1中有相同的错误消息,SUN JVM1.6.0_07已连接到Tomcat 6.0(在另一台计算机Sun JVM1.6.0_16上以调试模式运行,调试连接确实可以正常工作)。
窗口->首选项-> Java->编译器->类文件生成:已检查“将行号属性添加到生成的类文件”。我做了干净的重新编译。我没有取消选中它,重新编译,选中它,重新编译。我确保项目确实使用了全局设置。还是一样的消息。
我切换到ant build,使用
<javac srcdir="./src/java" destdir="./bin" debug="true">
还是一样。
我没有发现是什么导致了此消息,以及为什么它不会消失。尽管这似乎与正在运行的Tomcat调试会话有关:断开连接后,重新编译可以解决此问题。但是在将调试器连接到Tomcat或在连接的调试会话期间设置新的断点时,它再次出现。
但是,事实证明消息是错误的:在调试之前和调试期间,我确实能够调试和设置断点(javap -l也显示了行号)。所以就忽略它:)
debug="true"
到构建脚本的javac
任务已成功ant
。
这解决了我的问题:
Installed JREs
默认情况下JDK
应使用JRE
对于与Spring相关的问题,请考虑在某些情况下会生成“无行号”的类。例如@Service
带接口的带注释的类,添加接口即可进行调试。请参阅此处以获取完整示例。
@Service("SkillService")
public class TestServiceWithoutInterface {
public void doSomething() {
System.out.println("Hello TestServiceWithoutInterface");
}
}
上面的服务将有一个由spring生成的接口,导致“缺少行号”。添加一个真实的接口可以解决生成问题:
public interface TestService {
void doSomething();
}
@Service("SkillService")
public class TestServiceImpl implements TestService {
public void doSomething() {
System.out.println("Hello TestServiceImpl");
}
}
从BlackBerry SDK方面,我可以解决此问题:出于某种原因,无论我更改了编译器中的选项多少次,实际的基础设置文件都没有更改。
在项目的.settings文件夹中查看一个名为org.eclipse.jdt.core.prefs的文件。
您可以在其中手动修改设置:
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
编辑:除此之外,我注意到有时我可以忽略Eclipse发出的警报,它仍然会停在所需的位置...好奇的人和好奇的人...我将其放入了我们学习处理的内容中当开发人员。
这为我工作:
Window --> Preferences --> Java --> Compiler --> Classfile Generation
,所有选项都必须是True
。debug="true"
在build.xml <javac>
任务。Debug
模式下重新启动Tomcat不知道这是否仍然有意义,也许另一个水手会发现这很有用。
当一个类文件已编译,调试标志关闭时,显示该消息。
在eclipse中,您可以通过上述选项将其打开,
窗口->首选项-> Java->编译器->类文件生成:“将行号属性添加到生成的类文件中”
但是,如果您有一个jar文件,那么您将获得编译后的输出。没有简单的方法可以解决此问题。
如果您有权访问源并使用ant来获取jar文件,则可以如下修改ant任务。
<javac destdir="${build.destDir}" srcdir="${build.srcDir}" source="1.6" fork="true" target="${javac.target}" debug="on" debuglevel="lines,vars,source" deprecation="on" memoryInitialSize="512m" memoryMaximumSize="1024m" optimize="true" >
调试愉快。
如果确实要指出所使用的Eclipse版本和技术(例如Java JDT或Aspect Java的AJDT或C ++ CDT),这将有所帮助。
在Java方面,我想你的“打勾从编译器选项勾选”是指这
在“ Window --> Preferences --> Java --> Compiler --> Classfile Generation
”下,所有的Class file
生成选项都设置为True:
您的项目是否仅在全局级别(Windows首选项)或项目特定级别进行了检查?
并且您确定该类已打开(尝试在其上设置断点):
.java
,不是一个.class
?尝试清理所有内容并重建所有内容,检查是否存在潜在的jar冲突。
由于我安装了6个不同的Java版本,因此必须更改默认的JDK兼容性以匹配我要使用的Java版本。使用Java 1.6构建/编译所有内容时,默认情况下,Eclipse的编译器遵从性级别设置为Java 1.7。
所以我所做的就是
现在Eclipse不再抱怨“无法插入断点缺少行号信息”,调试断点实际上可以正常工作!!!
此处详细说明:
https://github.com/spring-projects/spring-ide/issues/78
仅供以后参考,这是答案的相关部分(忽略指向Spring Boot应用程序的事实,在很多其他情况下,行为是相同的):
每当您在Eclipse / STS中设置断点时,如果启动应用程序,IDE都会尝试在VM中设置断点。这就是您在调试模式下运行启动应用程序时发生的情况。
对于每个装入JVM的类,IDE都会检查是否需要设置断点。如果它决定设置断点,则尝试进行设置(使用IDE中断点定义的信息,包括其行号,因为通常在给定行上在源文件上设置行断点)。
该决定(是否在给定的已加载类上设置断点)将检查设置断点所基于的类型,封闭的类型以及内部类。这样可以确保将内部类(甚至是匿名内部类)的断点设置为JVM(并且不会被忽略)。
Spring Boot在运行时为您的控制器生成一个内部类(这是CGLIB生成的内部类,出现在错误消息中)。JVM加载该类时,它将尝试设置封闭类型的行号断点(对于此内部类)。由于生成的内部类没有任何行号信息(它不需要行号信息),因此对于此内部类,设置断点将失败,并带有所提到的错误消息。
当IDE加载封闭类型(您的控制器类本身)时,它还会尝试设置行断点并以此成功。这可以通过断点标记上的检查标记来可视化。
因此,您可以放心地忽略显示的错误消息。为避免显示此错误消息,您可以转到首选项(Java->调试)并禁用“由于缺少行号属性而无法安装断点时发出警告”。
我的情况类似:
spyTask = spy(new Task())
Task.java
)每次我运行时,此断点都会产生有问题的错误 Debug As... > JUnit Test
为了解决该问题,我将“断点”移到了实际测试中(在TaskTest.java内部)。一旦执行停止,我将断点添加回原来的位置(在Task.java内部)。
我仍然遇到相同的错误,但是单击“确定”后,断点工作正常。
希望能对某人有所帮助,
-男
我在JBoss 7.1中遇到了相同的错误。只是忽略了错误,我能够正常放置断点。就我而言,我正在构建思想蚂蚁生成器,这是我的javac任务:
<javac
srcdir="${src.dir}"
destdir="${build.classes.dir}"
includeantruntime="false"
debug="${debug}"
verbose="false"
debuglevel="lines,vars,source"
source="1.6"
target="1.6">
<!-- Sppressing warning for setting an older source without bootclasspath
(see: https://blogs.oracle.com/darcy/entry/bootclasspath_older_source) -->
<compilerarg value="-Xlint:-options"/>
<classpath>
<fileset dir="${lib.dir}" includes="*.jar" />
<fileset dir="${jboss.lib.dir}" includes="**/*.jar" />
</classpath>
</javac>
我的问题是我有2个JAR,并且我尝试根据其顺序在另一个中覆盖另一个 Java Build Path => Order & Export
在Eclipse选项卡中的,因为一个用于调试,而另一个则不是(调试JAR在顺序中排在第一位)。当我这样做时,我不得不手动附加一个源。
我尝试删除非调试JAR,然后将调试JAR放在我的\ WEB-INF \ lib \目录中,进行清理,构建等操作,并且可以正常工作。这次(删除了附加的源代码),它将自动让我浏览调试代码,而无需手动附加任何源代码。断点和调试也起作用。
万一仍然有人遇到麻烦,我还尝试了其他答案中提到的所有这些特定解决方案:
Add line number attributes...
org.eclipse.jdt.core.prefs
如另一个答案中所述手动编辑:https : //stackoverflow.com/a/31588700/1599699我还进行了通常的服务器关闭操作(并确保java.exe实际上已关闭...),删除了两个项目中的\ build \目录,使用-clean参数重启Eclipse,重新创建调试JAR,刷新,清理,并使用其中的调试JAR构建项目,以调试模式启动服务器,发布/清理和断点。
检查/执行以下操作:
1)在“窗口->首选项-> Java->编译器->类文件生成”下,所有选项都必须为True:
(1) Add variable attributes...
(2) Add line number attributes...
(3) Add source file name...
(4) Preserve unused (never read) local variables
2)在项目的.settings文件夹中,找到一个名为org.eclipse.jdt.core.prefs的文件。验证或设置org.eclipse.jdt.core.compiler.debug.lineNumber = generate
3)如果仍然出现错误窗口,请单击复选框以不显示错误消息。
4)清理并构建项目。开始调试。
通常,错误窗口不会再显示,并且调试信息也会正确显示。
确保运行时主类所在的项目与您具有断点的类所在的项目相同。如果不是,请确保两个项目都在运行配置的类路径中,并且出现在所有jar和类文件夹之前。