Eclipse – 由于缺less行号属性,无法安装断点
我在尝试设置断点时在Eclipse中遇到了这个奇怪的错误。
Unable to insert breakpoint Absent Line Number Information
我从编译器选项勾选checkbox,但没有运气。
在Eclipse 3.4.1中,SUN JVM1.6.0_07连接到Tomcat 6.0(在另一台计算机上以debugging模式运行,Sun JVM1.6.0_16,debugging连接确实工作正常),我也有同样的错误信息。
窗口 – >首选项 – > Java – >编译器 – >类文件生成:“添加行号属性到生成的类文件”被选中。 我做了一个干净的,重新编译。 我没有选中它,重新编译,检查它,重新编译。 我确定该项目确实使用了全局设置。 还是一样的信息。
我切换到ant构build,使用
<javac srcdir="./src/java" destdir="./bin" debug="true">
不过,同样的消息。
我没有发现是什么引起了这个信息,为什么它不会消失。 虽然它似乎与正在运行的Tomcatdebugging会话有关:在断开连接时,重新编译可以解决问题。 但是,在将debugging器连接到Tomcat或在连接的debugging会话期间设置新的断点时,它再次出现。
然而,事实certificate这个消息是错误的 :我确实能够在debugging之前和debugging期间debugging和设置断点( javap -l也显示行号)。 所以只是忽略它:)
- 在eclipse菜单中,进入Window-> Preferences-> Java-> Compiler
- 取消标记checkbox“添加行号属性…”
- 点击应用 – >是
- 标记checkbox“添加行号属性…”
- 再次申请。
- 去开心debugging
落后
这解决了我的问题:
- 窗口 – >首选项 – >服务器 – >运行时环境
- Apache Tomcat – >编辑
- select一个JDK而不是JRE
对于Spring相关的问题,可以考虑在某些情况下它会生成“没有行号”的类; 例如一个没有接口的@Service
注释类,添加接口,你可以debugging。 这里看一个完整的例子。
@Service("SkillService") public class TestServiceWithoutInterface { public void doSomething() { System.out.println("Hello TestServiceWithoutInterface"); } }
上面的服务将会有一个由spring产生的界面,导致“缺less行号”。 添加一个真实的界面解决了生成问题:
public interface TestService { void doSomething(); } @Service("SkillService") public class TestServiceImpl implements TestService { public void doSomething() { System.out.println("Hello TestServiceImpl"); } }
我已经从BlackBerry SDK的一面回答了这个问题:出于某种原因,无论我多less次更改了编译器中的选项,实际的底层设置文件都没有改变。
在你的项目的.settings文件夹中查找一个名为org.eclipse.jdt.core.prefs的文件。
在那里你可以手动修改设置:
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
编辑:除此之外,我注意到有时我可以忽略Eclipse提供的警报,它仍然停留在所需的地方…古怪的人和古怪的人…我把这个东西放到我们学会处理的事情中当作为开发工作。
不知道这是否仍然有关,也许另一个水手会发现这个有用的。
当有一个类文件编译closuresdebugging标志时出现消息。
在日食中,你可以通过前面提到的选项来打开它,
窗口 – >首选项 – > Java – >编译 – > Classfile生成:“添加行号属性到生成的类文件”
但是,如果你有一个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" >
快乐debugging
ref: http : //doc.sumy.ua/prog/Java/javanut/ch16_04.htm
这对我工作:
- 在
Window --> Preferences --> Java --> Compiler --> Classfile Generation
,所有选项都必须为True
。 - 在build.xml
<javac>
任务中创build了debug="true"
。 - 通过ant生成的战争在tomcat中部署应用程序
- 以
Debug
模式重新启动Tomcat
如果您确实指出了您正在使用的eclipse版本和技术(例如,Java JDT,或者AJDT for Aspect Java,或者C ++ CDT),这将会有所帮助。
在Java方面,我想你的“从编译器选项勾选checkbox”是指这一点
在“ Window --> Preferences --> Java --> Compiler --> Classfile Generation
Class file
Window --> Preferences --> Java --> Compiler --> Classfile Generation
”下,所有“ Class file
”生成选项都设置为True:
- (1)添加可变属性,
- (2)附加号码,
- (3)添加源文件名,
- (4)保留未使用的局部variables。
您的项目是否仅在全局级别(“寡妇首选项”)或项目特定级别进行检查?
你确定这个类打开了(你试图设置一个断点):
- 是你的来源之一(而不是来自第三方图书馆)
- 是
.java
,而不是.class
?
尝试清理一切,重build所有,检查潜在的瓶子冲突 。
尝试从Eclipsedebugging模式下启动Tomcat时遇到此问题。 我有一个ANT构build文件照顾编译和部署。 设置debugging标志为真(如其他答案中所述)并重新部署应用程序,它工作得很好:
<javac srcdir="./src/java" destdir="./bin" debug="true">
注意:如果刚刚添加了debugging标志并重新编译,则仍然需要将应用程序重新部署到服务器,因为这是Eclipsedebugging类文件的地方。 非常明显,但容易花一个小时左右挠挠脑袋,想知道为什么它不工作(相信我)。
尝试更改您使用的jre
。请将JDK
的文件夹设置为jre
。
由于我安装了6个不同版本的Java,因此必须更改我的默认JDK合规性以匹配我想要使用的Java版本。 Eclipse默认情况下编译器的合规性级别设置为Java 1.7,当所有东西都是使用Java 1.6编译/编译的。
所以我所做的只是
- 在eclipse菜单中,进入Window-> Preferences-> Java-> Compiler
- 在JDK合规性下,我将编译器合规性级别从1.7更改为1.6
现在,Eclipse不再抱怨“无法插入断点缺席行号信息”,debugging断点实际上工作!
我的情况是类似的:
- 我正在debugging一个JUnittesting
- 我正在使用Mockito创build一个间谍,如在
spyTask = spy(new Task())
- 我把这个断点放到了我正在侦察的类中(在
Task.java
里面)
这个断点会产生有问题的错误,每次运行Debug As... > JUnit Test
为了解决这个问题,我把Breakpoint'up'移到了实际的testing中(在TaskTest.java里面)。 一旦执行停止,我将断点添加回原来的位置(在Task.java内部)。
我仍然有同样的错误,但点击“确定”后,断点工作得很好。
希望帮助别人,
-gmale
当我在jetty服务器上编译新的.war文件时,我遇到了同样的问题。 在您必须像以前编写的那样设置Java编译器之后,您应该创build相同版本的jdk / jre编译器并构buildpath(例如jdk 1.6v33,jdk 1.7,….)。
我做了一切,仍然没有工作。 该解决scheme是删除编译的.class文件和生成的战争文件的目标,现在它的工作:)
用Spring AOP得到了这个消息(似乎来自CGLIB库)。 点击忽略似乎工作正常,我仍然可以debugging。
我发现这个消息的另一个原因。 我正在编程斯卡拉。 解决scheme是:
- 打开运行 – >debuggingconfiguration
- 在主选项卡的底部,在“应用”和“还原”button旁边,有一个文本说明你正在使用哪个启动器,在它旁边有一个超链接,指出“select其他”。 这是一个奇怪的用户界面元素,乍一看看起来并不可行。
- 使用“select其他”链接并select“Scala应用程序(新debugging器)启动器”。 另一个似乎没有与斯卡拉工作。
现在debugging应该工作。 请注意,我已经安装了Scala IDE插件,如果没有它,这个选项可能不可用。
debugging部署到Tomcat的WAR(由多个Eclipse项目构件构build)时,我遇到了同样的问题。
我正在使用ANT构build脚本构build一切。 如果这是你正在做的事情,请确保在你拥有的每个javac ant任务上都设置了debug = true标志。 这是我唯一的问题 – 我希望它可以帮助你的问题!
我和JBoss 7.1有同样的错误,而且我和Zefiro一样。 只是忽略了错误,我能够正常放置断点。 在我的情况下,我正在build设思想的antbuild设者,这是我的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>
一旦我使用junit和Mockito时遇到同样的错误,我忘了为静态类添加@PrepareForTest
。
添加以下代码修复了我的问题。
@PrepareForTest({XXXXX.class})
不知道这是相同的情况。
编译/构buildjar子时,我完成了上面列出的所有内容 – 仍然有同样的问题。
最终,启动服务器时下面列出的jvmarg更改是最终为我工作的:
1)删除/注释了一堆关于javaagent和bootclasspath的jvm参数。
2)打开/取消注释以下行:
然后当我启动服务器,我能够打破我的断点。 我怀疑javaagent在某种程度上干扰了Eclipse检测行号的能力。
检查/执行以下操作:
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的文件。 validation或设置org.eclipse.jdt.core.compiler.debug.lineNumber = generate
3)如果错误窗口仍然出现,请点击checkbox不显示错误信息。
4)清理和build设项目。 开始debugging。
通常错误窗口不再显示,debugging信息显示正确。
我也遇到了这个问题。 我正在使用一个ant构build脚本。 我正在使用旧版应用程序,所以我正在使用JDK版本1.4.2。 这曾经工作,所以我开始环顾四周。 我注意到,在JRE选项卡上的Debugconfiguration下,Java的版本已经被设置为1.7。 一旦我把它改回1.4就行了。
我希望这有帮助。
我试图debugging日志loggingpipe理器,需要将jre更改为jdk,然后在“主”选项卡“Java运行时环境”中select此jdk。 debuggingconfiguration的“运行时间JRE”然后一切正常。
当我使用@ManagedBean(javax.annotation.ManagedBean)注解一个类时,我看到了这个问题。 在JBoss EAP 6.2.0上运行新编写的应用程序时出现了警告消息。 忽略它并继续运行并没有帮助 – 断点从来没有达到过。
我在JSF页面中使用EL来调用这个bean。 现在…有可能@ManagedBean是不好的(我是CDI的新手)。 当我将注释更改为@Model时,我的bean被执行,但是断点警告也消失了,我按预期击中断点。
总之,它看起来好像@ManagedBean注释混淆了行号,不pipe它是否使用了错误的注释。
我遇到了同样的问题,我花了很多时间去寻找解决scheme,但是这些解决scheme是无用的,所以我自己研究所有的情况,最后我发现问题是JDK版本之间的冲突。 以下是解决问题的步骤:1.删除所有的JDK和JRE版本,只保留一个版本。 2.在Eclipse中设置JAVA_HOME系统和java编译器是一样的。 在某些情况下,上面的错误不会消失,但我们可以在debugging模式下运行。
确保运行时的主要类所在的项目与您有断点的类相同。 如果没有,请确保两个项目都在运行configuration的类path中,并出现在任何jar和class文件夹之前。
我有一个具体的项目相同的问题,我不断尝试重新设置窗口 – >首选项中的行号属性…然后我意识到每个项目都有自己的行号属性设置。 右键单击项目,进入属性,selectJavaCompiler,然后选中“Add line number attributes …”(添加行号属性…)
如果上面的解决scheme不起作用,并且在做完spring bean注入之后就开始出现这个问题,问题可能是你没有使用接口来进行注入类。 尝试使用实现接口的类来实现注入将解决问题。 有关示例,请按照以下链接进行操作: 无法为创buildbean安装断点问题
我尝试了几乎所有的解决scheme,没有运气。 你有没有尝试点击“不要再告诉我”? 这样做后,我重新启动了我的程序,一切都很好。 Eclipse打到我的断点,就好像没有错。
我的根本原因是Eclipse试图设置自动生成的Spring CGLIB代理对象的debugging。 除非你需要在这个级别debugging某些东西,否则你应该忽略这个问题。
这在这里详细解释:
https://github.com/spring-projects/spring-ide/issues/78
仅供将来参考,这是答案的相关部分(忽略引用Spring Boot应用程序的事实,对于其他许多情况,行为是相同的):
无论何时在Eclipse / STS中设置断点,IDE都会尝试在启动应用程序时在VM中设置断点。 当您在debugging模式下运行启动应用程序时,就会发生这种情况。
对于每个加载到JVM中的类,IDE会检查是否需要设置断点。 如果决定设置断点,则尝试这样做(使用来自IDE中断点定义的信息,包括其行号,因为通常在给定行处将源断点设置为断点)。
这个决定(是否在一个给定的加载类上设置断点)检查你设置断点的types,包括types和内部类。 这确保内部类(甚至是匿名内部类)的断点被设置为JVM(并且不被忽略)。
Spring Boot会在运行时为您的控制器生成一个内部类(这是错误消息中出现的CGLIB生成的内部类)。 当JVM加载该类时,它将尝试设置封闭types(对于此内部类)的行号断点。 由于生成的内部类没有任何行号信息(它不需要行号信息),因此使用提到的错误消息设置此内部类的断点失败。
当IDE加载封闭types(您的控制器类本身)时,它也会尝试设置行断点并成功执行此操作。 这是用断点标记上的复选标记来可视化的。
因此,您可以放心地忽略显示的错误消息。 为避免出现此错误消息,您可以转到首选项(Java – > Debug),并禁用“由于缺less行号属性而无法安装断点时发出警告”。
我的问题是我有2个JAR的,我试图在Eclipse的Java Build Path => Order & Export
选项卡中根据其顺序覆盖另一个,因为一个用于debugging,另一个不是(debuggingJAR是先按顺序)。 当我这样做,我不得不手动附加一个来源。
我尝试删除非debuggingJAR,并将debuggingJAR放置在我的\ WEB-INF \ lib \目录下,清理,构build等,然后运行。 这一次(删除了附加的源代码),它会自动让我浏览debugging代码,而不必手动添加任何源代码。 断点和debugging也起作用。
如果有人遇到麻烦,我也尝试了其他答案中提到的所有这些解决scheme:
- 取消选中,应用并重新检查
Add line number attributes...
- 手动编辑
org.eclipse.jdt.core.prefs
在另一个答案中提到: https : //stackoverflow.com/a/31588700/1599699 - 确保在启用debugging的情况下生成JAR。
- 将JDK合规性级别从1.6更改为1.7(从而与我正在使用的JDK匹配)。
我也一直closures服务器(并确保java.exe实际上是closures的…),删除两个项目中的\ build \目录,使用-clean参数重新启动Eclipse,重新创builddebuggingJAR,刷新,清理和使用其中的debuggingJAR来构build项目,以debugging模式启动服务器,发布/清理和突破。