提问



我在尝试设置断点时在Eclipse中遇到这个奇怪的错误。


Unable to insert breakpoint Absent Line Number Information


我勾选了编译器选项中的复选框,但没有运气。

最佳参考


我在Eclipse 3.4.1中有相同的错误消息,SUN JVM1.6.0_07连接到Tomcat 6.0(在另一台机器上以调试模式运行,Sun JVM1.6.0_16,调试连接确实正常工作)。


窗口 - >首选项 - > Java - >编译器 - >类文件生成:检查生成的类文件添加行号属性。我做了一个干净,重新编译。我取消了它,重新编译,检查它,重新编译。我确保该项目确实使用了全局设置。还是一样的消息。


我转而使用蚂蚁构建


<javac srcdir="./src/java" destdir="./bin" debug="true">


还是,同样的消息。


我没有发现导致这条消息的原因以及为什么它不会消失。虽然它似乎与正在运行的Tomcat调试会话有关:当断开连接时,重新编译解决了这个问题。但是在将调试器连接到Tomcat或在连接的调试会话期间设置新的断点时,它再次出现。


然而,事实证明消息错误:我确实能够在调试之前和调试期间调试和设置断点( javap -l <​​/em>也显示行号) 。所以只是忽略它:)

其它参考1



  1. 在eclipse菜单中,转到Window-> Preferences-> Java-> Compiler

  2. 取消标记复选框添加行号属性...

  3. 单击应用 - >是

  4. 标记复选框添加行号属性...

  5. 再次申请。

  6. 快乐的debuging



落后

其它参考2


这解决了我的问题:



  1. 窗口 - >首选项 - >服务器 - >运行时环境

  2. Apache Tomcat - >编辑

  3. 选择JDK而不是JRE


其它参考3


对于 Spring 相关问题,请考虑在某些情况下它会生成没有行号的类;例如,没有接口的@Service带注释的类,添加接口,您可以调试。看这里有一个完整的例子。[28]


@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");
   }
}

其它参考4


我从BlackBerry SDK方面得到了这个问题的答案:出于某种原因,无论我在编译器中更改了多少次选项,实际的底层设置文件都没有改变。


在项目的.settings文件夹中查看名为 org.eclipse.jdt.core.prefs 的文件。


在那里,您可以手动修改设置:


org.eclipse.jdt.core.compiler.debug.lineNumber=generate


编辑:除此之外,我注意到有时候我可以忽略Eclipse提供的警报,它仍然会停在所需的地方......好奇者和好奇者...我把它放到我们学会处理的东西中当开发工作时。

其它参考5


这对我有用:



  1. Window --> Preferences --> Java --> Compiler --> Classfile Generation下,所有选项必须是True

  2. 在build.xml <javac>任务中创建debug="true"

  3. 由ant
  4. 生成的战争在tomcat中部署应用程序
  5. Debug模式重新启动Tomcat


其它参考6


不知道这是否仍然相关,也许另一位水手会觉得这很有用。


当一个类文件被编译后关闭调试标志时,会出现该消息。


在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"   >


快乐的调试..


参考:
http://doc.sumy.ua/prog/Java/javanut/ch16_04.htm [29]

其它参考7


如果您确实指出了您正在使用的eclipse版本和技术(例如Java JDT,或者说是Java Java的AJDT,或者是C ++ CDT),那将会很有帮助。


在Java方面,我认为你的从编译器选项勾选复选框是指[30]


Window --> Preferences --> Java --> Compiler --> Classfile Generation下,所有Class file生成选项都设置为True:



  • (1)添加变量属性,

  • (2)地址编号,

  • (3)添加源文件名

  • (4)保留未使用的局部变量。



您的项目是否仅在全局级别(widows首选项)或项目特定级别进行了检查?


你确定这个类打开了(你尝试设置一个断点):



  • 是您的来源之一(而非来自第三方图书馆)

  • .java,而不是.class?



尝试清理所有内容并重建所有内容,检查潜在的jar冲突。[31]

其它参考8


尝试从Eclipse启动Tomcat调试模式时遇到此问题。我有一个ANT构建文件负责编译和部署。将调试标志设置为true(如其他答案中所述)并重新部署应用程序后,它工作正常:


<javac srcdir="./src/java" destdir="./bin" debug="true">


注意:如果您刚刚添加了调试标志并重新编译,则仍然需要将应用程序重新部署到服务器,因为这是Eclipse调试类文件的地方。非常明显但很容易花一个小时左右的时间挠头,想知道为什么它不起作用(相信我)。

其它参考9


尝试更改你使用的jre。改为JDK的文件夹中的jre

其它参考10


由于我安装了6个不同版本的Java,因此我必须更改默认的JDK合规性以匹配我想要使用的Java版本。当使用Java 1.6构建/编译所有内容时,Eclipse默认将编译器合规性级别设置为Java 1.7。


所以我所做的就是



  1. 在eclipse菜单中,转到Window-> Preferences-> Java-> Compiler

  2. 在JDK合规性下,我将编译器合规性级别从1.7更改为1.6



现在Eclipse不再抱怨无法插入断点缺席行号信息,调试断点实际上工作!!!

其它参考11


如果没有其他工作,请打开调试透视图,清除所有现有断点,然后再将它们重新设置。

其它参考12


我的情况类似:



  • 我正在调试JUnit测试

  • 我正在使用Mockito创建一个间谍,如spyTask = spy(new Task())

  • 我将断点放在我正在监视的类中(在Task.java内)



每次运行Debug As... > JUnit Test时,此断点都会生成有问题的错误


为了解决这个问题,我将断点向上移动到实际测试中(在TaskTest.java中)。一旦执行停止,我将断点添加回原来的位置(最初在Task.java中)。


我仍然得到相同的错误,但点击确定后,断点工作得很好。


希望能帮到某人,


-gmale

其它参考13


当我在jetty服务器上制作并由ANT编译新的.war文件时,我遇到了同样的问题。在必须像之前编写的那样设置Java Compiler之后,您应该制作相同版本的jdk/jre编译器和构建路径(例如jdk 1.6v33,jdk 1.7,....)。


我做了一切,仍然没有工作。解决方案是删除已编译的.class文件和生成的war文件的目标,现在它的工作:)

其它参考14


用Spring AOP得到这条消息(似乎是来自CGLIB库)。单击忽略似乎工作正常,我仍然可以调试。

其它参考15


我发现了这个消息的另一个原因。我在编写Scala。解决方案是:



  1. 打开运行 - >调试配置

  2. 在Main选项卡的底部,Apply和Revert按钮旁边,有一个文本说明您正在使用哪个Launcher,旁边有一个超级链接,上面写着Select other。这是一个奇怪的UI元素,乍看之下看起来不可行。

  3. 使用选择其他链接并选择Scala Application(新调试器)启动器。另一个似乎不适用于Scala。



现在调试应该工作。请注意,我已经安装了Scala IDE插件,如果您没有此选项,则此选项可能无法使用。

其它参考16


我在这里尝试了几乎所有解决方案而且没有运您是否尝试点击不要再次告诉我?这样做后我重新启动了我的程序,一切都很顺利.Eclipse击中了我的断点,好像没有错。


我的根本原因是Eclipse试图为自动生成的Spring CGLIB代理对象设置调试。除非您需要在该级别调试某些内容,否则应忽略该问题。

其它参考17


调试部署到Tomcat的WAR(由多个Eclipse项目工件构建)时,我遇到了同样的问题。


我正在使用ANT构建脚本构建所有内容。如果这是你正在做的事情,请确保在你所获得的每个javac ant任务上设置了debug=true标志。这是我唯一的问题 - 我希望它可以帮助你解决问题!

其它参考18


我和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>

其它参考19


我遇到了同样的问题,我花了很多时间寻找解决方案,但这些解决方案都是无用的,所以我自学了所有案例,最后我发现问题是JDK版本之间存在冲突。
以下是解决问题的步骤:
1.删​​除所有JDK和JRE版本,只保留一个版本。
2.设置JAVA_HOME系统和Eclipse中的java编译器是一样的。
在某些情况下,上面的错误不会消失,但我们可以在调试模型下运行。

其它参考20


当我使用junit和Mockito时遇到相同的错误,我忘了为静态类添加@PrepareForTest


添加以下代码修复了我的问题。


@PrepareForTest({XXXXX.class})


不确定是否是同一个案例。

其它参考21


这在这里详细解释:


https://github.com/spring-projects/spring-ide/issues/78[32]


仅供将来参考,这是答案的相关部分(忽略引用Spring Boot应用程序的事实,对于许多其他情况,行为是相同的):



  每当在Eclipse/STS中设置断点时,如果启动应用程序,IDE都会尝试在VM中设置断点。这就是在调试模式下运行启动应用程序时的情况。

  
  对于加载到JVM中的每个类,IDE会检查是否需要设置断点。如果它决定设置断点,则尝试这样做(使用IDE中断点定义的信息,包括其行号,因为您通常在给定行的源文件上设置行断点)。

  
  此决定(是否在给定的已加载类上设置断点)检查您设置断点的类型,封闭类型和内部类。这可以确保内部类(甚至是匿名内部类)的断点设置为JVM(并且不会被忽略)。

  
  Spring Boot在运行时为您的控制器生成一个内部类(这是出现在错误消息中的CGLIB生成的内部类)。当JVM加载该类时,它会尝试设置封闭类型的行号断点(对于此内部类)。由于生成的内部类没有任何行号信息(它不需要有行号信息),因此使用上述错误消息为此内部类设置断点失败。

  
  当IDE加载封闭类型(您的控制器类本身)时,它还会尝试设置行断点并使用该断点成功。使用断点标记上的检查标记可以看到这一点。

  
  因此,您可以安全地忽略显示的错误消息。要避免显示此错误消息,您可以转到首选项(Java - > Debug)并禁用由于缺少行号属性而无法安装断点时发出警告。


其它参考22


我在编译/构建jar时完成了上面列出的所有内容 - 仍然遇到了同样的问题。


最终,启动服务器时下面列出的jvmarg更改最终对我有用:


1)删除/注释了一堆与javaagent和bootclasspath有关的jvm args。


 
 
 

2)打开/取消注释以下行:
  


然后,当我启动服务器时,我能够达到我的断点。我怀疑javaagent在某种程度上干扰了Eclipse检测行号的能力。

其它参考23


检查/执行以下操作:


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)清理并构建项目。开始调试。


通常不再显示错误窗口,并且正确显示调试信息。

其它参考24


我也遇到了这个问题。我正在使用ant构建脚本。我正在使用遗留应用程序,因此我使用的是jdk 1.4.2版。这曾经工作,所以我开始环顾四周。我注意到在JRE选项卡上的Debug配置下,Java的版本已设置为1.7。一旦我将其改回1.4,就可以了。


我希望这有帮助。

其它参考25


我试图调试日志管理器,需要将jre更改为jdk,然后在main选项卡中选择此jdk,Java Runtime Environment|调试配置的运行时JRE然后一切都很顺利。

其它参考26


当我用@ManagedBean(javax.annotation.ManagedBean)注释一个类时,我看到了这个问题。在JBoss EAP 6.2.0上运行新编译的应用程序时出现警告消息。忽略它并且无论如何都无法运行 - 从未达到过断点。


我在JSF页面中使用EL调用该bean。现在...... @ManagedBean可能对此没有好处(我是CDI新手)。当我将注释更改为@Model时,我的bean被执行但是断点警告也消失了,我按预期点击了断点。


总而言之,无论是否使用错误的注释,它看起来好像@ManagedBean注释搞乱了行号。

其它参考27


确保运行时的主类所在的项目与 中包含断点的类相同的项目。如果没有,请确保两个项目都在运行配置的类路径中,并在之前显示任何jar和类文件夹。

其它参考28


我对一个特定的项目有同样的问题,我一直试图在Window-> Preferences中重置行号属性......然后我意识到每个项目都有自己的行号属性设置。右击项目,进入选择JavaCompiler,然后选中添加行号属性...复选框。

其它参考29


如果上面的解决方案不起作用并且你在弹簧bean注入后开始出现问题,那么问题就是你没有使用接口来注入类。尝试使用实现接口的类进行注入可以解决问题。示例请点击链接:
无法为bean创建安装断点问题[33]