Eclipse - 由于缺少行号属性,无法安装断点

时间:2009-06-05 19:53:06

标签: eclipse debugging breakpoints

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

Unable to insert breakpoint Absent Line Number Information

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

40 个答案:

答案 0 :(得分:215)

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

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

我使用

切换到ant build
<javac srcdir="./src/java" destdir="./bin" debug="true">

仍然,同样的消息。

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

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

答案 1 :(得分:87)

  1. 在eclipse菜单中,转到Window-&gt; Preferences-&gt; Java-&gt; Compiler
  2. 取消标记复选框“添加行号属性...”
  3. 点击应用 - &gt;是
  4. 标记复选框“添加行号属性...”
  5. 再次申请。
  6. 快乐调试

答案 2 :(得分:25)

这解决了我的问题:

  1. 窗口 - &gt;偏好 - &gt;服务器 - &gt;运行时环境
  2. Apache Tomcat - &gt;修改
  3. 选择JDK而不是JRE

答案 3 :(得分:16)

对于 Spring 相关问题,请考虑在某些情况下它会生成类&#34;没有行号&#34 ;;例如,没有接口的@Service带注释的类,添加接口,您可以调试。请参阅here以获取完整示例。

@Service("SkillService")
public class TestServiceWithoutInterface {
   public void doSomething() {
      System.out.println("Hello TestServiceWithoutInterface");
   }
}

上面的服务将有一个由spring生成的界面,导致&#34;缺少行号&#34;。添加真实的界面可以解决生成问题:

public interface TestService {
    void doSomething();
}

@Service("SkillService")
public class TestServiceImpl implements TestService {
   public void doSomething() {
      System.out.println("Hello TestServiceImpl");
   }
}

答案 4 :(得分:13)

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

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

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

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

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

答案 5 :(得分:8)

这对我有用:

  1. Window --> Preferences --> Java --> Compiler --> Classfile Generation下,所有选项都必须为True
  2. 在build.xml debug="true"任务中创建<javac>
  3. 由ant
  4. 生成的战争在tomcat中部署应用程序
  5. Debug模式重新启动Tomcat

答案 6 :(得分:7)

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

如果编译了调试标志关闭的类文件,则会显示该消息。

在日食中,你可以通过前面提到的选项打开它,

窗口 - &gt;偏好 - &gt; Java - &gt;编译器 - &gt;类文件生成:“将行号属性添加到生成的类文件”

但是如果你有一个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"   >

快乐调试..

REF: http://doc.sumy.ua/prog/Java/javanut/ch16_04.htm

答案 7 :(得分:4)

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

所以我所做的就是

  1. 在eclipse菜单中,转到Window-&gt; Preferences-&gt; Java-&gt; Compiler
  2. 根据JDK合规性,我将编译器合规性级别从1.7更改为1.6
  3. 现在Eclipse并没有抱怨&#34;无法插入断点缺席行号信息&#34;再调试断点实际上工作!!!

答案 8 :(得分:4)

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

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

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

答案 9 :(得分:4)

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

在Java方面,我认为您的“勾选编译器选项中的复选框”是指this

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

  • (1)添加变量属性,
  • (2)附加行号,
  • (3)添加源文件名
  • (4)保留未使用的局部变量。

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

你确定打开了课程(试图设置一个断点):

  • 是您的来源之一(而非来自第三方图书馆)
  • .java,而不是.class

尝试清理所有内容并重建所有内容,检查潜在的jar conflicts

答案 10 :(得分:3)

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

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

答案 11 :(得分:3)

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

答案 12 :(得分:2)

我的情况很相似:

  • 我正在调试JUnit测试
  • 我使用Mockito创建间谍,如spyTask = spy(new Task())
  • 我将断点放在我正在监视的类(Task.java

每次运行Debug As... > JUnit Test

时,此断点都会生成相关错误

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

我仍然遇到同样的错误,但点击“确定”后,断点工作正常。

希望有人帮助,

-gmale

答案 13 :(得分:2)

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

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

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

  1. Open Run - &gt;调试配置
  2. 在Main选项卡的底部,在#34; Apply&#34;旁边。和&#34;还原&#34;按钮,有一个文字说明你正在使用哪个启动器,旁边有一个超链接说&#34;选择其他&#34;。这是一个奇怪的UI元素,乍一看似乎没有可操作性。
  3. 使用&#34;选择其他&#34;链接并选择&#34; Scala应用程序(新调试器)启动器&#34;。另一个似乎不适用于Scala。
  4. 现在调试应该有效。请注意,我已经安装了Scala IDE插件,如果您没有这个插件,则此选项可能无法使用。

答案 16 :(得分:1)

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

答案 17 :(得分:1)

这里有详细解释:

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 - &gt; Debug)并禁用&#34;由于缺少行号属性而无法安装断点时发出警告&#34;。

答案 18 :(得分:1)

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

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

@PrepareForTest({XXXXX.class})

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

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

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

答案 21 :(得分:0)

我在Eclipse IDE中有相同的错误。 但这似乎是一个可忽略的错误。 我在错误对话框上按了确定,然后继续。 达到了我的断点,而且我能够进一步调试。

答案 22 :(得分:0)

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

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

总而言之,无论是否使用错误的注释,@ ManagedBean注释看起来似乎都弄乱了行号。

答案 23 :(得分:0)

如果有人试图调试Java的源代码,那么这是唯一对我有用的解决方案。上面的大多数答案都是关于设置Compiler选项以生成行号的。但是,如果要调试Java的源代码(例如java.util.HashMap),那么上述选项可能对您不起作用。这是因为,您打算从中调试源代码的项目将LOOP指向Java Build Path --> Library --> JRE System Library jar而不是jre jar。 jdk jar中捆绑的类已经预编译了特定的选项,该选项不支持编译器选项设置。解决方案是重新配置项目,使jre指向JRE System Library jar。 jdk jar中的类将遵循Compiler选项设置。因此,一旦您更新了项目的jdk使其指向JRE System Library jar,就可以开始对Java源代码进行调试。

答案 24 :(得分:0)

上面的事情对我不起作用。 下面的解决方案终于奏效了。 调试配置->类路径->用户条目->(添加要调试的项目的src文件夹。)

答案 25 :(得分:0)

How to fix breakpoint error when debugging in Eclipse? 仅用此行替换现有内容。

    eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8

答案 26 :(得分:0)

我们已经有非常有用的信息来解决此问题,但是在我的特定情况下,问题是当我从存储库对项目进行更新时,会使用最新代码中的编译源生成新类。问题是我忘了更改POM文件中项目的版本,并且由于在新代码上设置了断点,并且POM文件仍指向先前编译的JAR文件中可用的旧版本,因此,选择了JAR文件中的类,而不选择了新代码中的类。

在简历中,要解决此问题,我只需要更新主项目的POM文件上的版本,清理并重新编译源代码,最后刷新环境。我希望这对其他人有用。

答案 27 :(得分:0)

我在Eclipse IDE中遇到了同样的问题。我阅读了该问题的所有答案,并尝试了几乎所有提到的设置,但没有运气。

因此,我尝试更改项目的运行时库,以前是JRE-Java SE 1.8 Default runtime

我尝试将JRE更改为JDK,并且对我有用:

JDK selected

以下是从JRE切换到JDK的步骤:

  • 右键单击项目
  • 单击属性-> Java构建路径
  • 选择标签-“库”
  • 单击“添加库”按钮。 “添加库”窗口将打开
  • 选择“ JRE系统库”->单击“下一步”按钮
  • 选择“备用JRE”
  • 单击“已安装的JRE”按钮
  • 在新窗口中,单击“添加”。这将打开另一个窗口“添加JRE”。
  • 选择“标准VM”。单击下一步。
  • 单击目录按钮。
  • 选择“ JDK”安装目录的路径,然后单击“确定”。然后单击完成。
  • 现在检查新添加的“ JDK” Select on JDK

  • 从列表中删除所有其他已安装的JRE(可选)

  • 应用->确定
  • 从备用JRE下拉列表中选择“ JDK”,然后单击“完成” Alternate JRE
  • 现在从下面描述的列表中删除JRE实例 Remove unwanted JRE
  • 单击“应用”->“确定”

您完成了!!

答案 28 :(得分:0)

对于带有Tomcat服务器的Web项目,我使用以下步骤对其进行了解决。

  1. 打开窗口->显示视图->其他->服务器。
  2. 双击正在运行的tomcat服务器。 (将打开tomcat服务器的概述)
  3. 现在单击“启动配置”链接。
  4. 单击“源”选项卡。
  5. 单击添加。
  6. 选择Java项目
  7. 将显示所有项目。
  8. 选择要调试的on。
  9. 保存配置,然后重新启动或重新构建应用程序。

答案 29 :(得分:0)

我尝试了大多数以前的解决方案,但仍然遇到了问题。 这就是我接下来要做的事情:

  • 从Eclipse
  • 中删除了该应用程序
  • 停止服务器
  • 从webapps
  • 删除应用程序文件夹
  • 从服务器中的临时文件夹中删除内容
  • 从服务器中的工作文件夹中删除内容
  • 在Eclipse上重新打开应用程序
  • 启动服务器

可能有些步骤不需要,但“以防万一”。

因此,如果以前的解决方案仍然不适合您。试试这个。 我希望它有所帮助; - )

答案 30 :(得分:0)

我在Spring MVC + Maven项目上有类似的问题;花了2个小时试图弄清楚为什么目标文件夹没有使用包含行信息的类进行更新。

我建议您清理所有内容,并确保在继续任何构建之前从文件夹中删除所有类。

  1. 确保在项目的属性&gt; Java Compiler具有“为生成的类fiels添加行号属性(由调试器使用)”。
  2. 清理所有项目。。 (菜单&gt;项目&gt;清除...)确保目标文件夹为空。
  3. 构建项目(菜单&gt;项目&gt;构建项目)
  4. 确保在目标目录中生成新类。
  5. 运行调试;如果在WebServer上运行 - 请确保以“调试”模式运行Web服务器。
  6. 如果有疑问 - 编译的.class文件是否包含行号 - 在Eclipse中打开.class文件。 Eclipse将对文件进行反编译,并告诉您是否存在行号。

    enter image description here

答案 31 :(得分:0)

我的问题是我有2个JAR,我试图根据Eclipse中Java Build Path => Order & Export选项卡中的顺序覆盖另一个,因为一个用于调试而另一个用于调试(调试JAR是首先在顺序中)。当我这样做的时候,我不得不手动附上一个来源。

我尝试删除非调试JAR并将调试JAR放在我的\ WEB-INF \ lib \目录中,清理,构建等等,并且它有效。这次(删除了附加的源代码),它会自动让我浏览调试代码,而无需手动附加任何源代码。断点和调试也有效。

如果有人仍然遇到麻烦,我也尝试了其他答案中提到的所有这些特殊解决方案:

  • 取消选中,应用并重新检查Add line number attributes...
  • 如另一个答案中提到的那样手动编辑org.eclipse.jdt.core.prefshttps://stackoverflow.com/a/31588700/1599699
  • 确保在启用调试的情况下生成JAR。
  • 将JDK合规性级别从1.6更改为1.7(从而匹配我正在使用的JDK)。

我也经常关闭服务器(并确保java.exe实际上已关闭...),删除两个项目中的\ build \目录,使用-clean参数重新启动Eclipse,重新创建调试JAR ,使用调试JAR创建项目,刷新,清理和构建项目,以调试模式启动服务器,发布/清理和断点。

答案 32 :(得分:0)

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

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

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

     

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

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

答案 33 :(得分:0)

如果上面的解决方案不起作用并且您在执行spring bean注入后开始出现问题,那么问题可能是您没有使用接口来注入类。尝试使用实现接口的类进行注入可以解决问题。有关示例,请点击链接: Unable to install breakpoint problem for bean creation

答案 34 :(得分:0)

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

答案 35 :(得分:0)

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

答案 36 :(得分:0)

检查/执行以下操作:

1)在“Window - &gt; Preferences - &gt; Java - &gt; Compiler - &gt; Classfile Generation”下,所有选项都必须为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)清理并构建项目。开始调试。

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

答案 37 :(得分:0)

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

我希望这会有所帮助。

答案 38 :(得分:0)

我正在尝试调试日志记录管理器并需要将jre更改为jdk,然后在&#34; main&#34;中选择此jdk。选项卡,&#34; Java运行时环境&#34; | &#34;运行时JRE&#34;调试配置然后一切都很顺利。

答案 39 :(得分:-1)

使用Spring Tool Suite(STS)启动Java EE项目时,我们也有此消息,但我们处于有利位置,只是忽略此消息,因为一切正常。