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

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

Unable to insert breakpoint Absent Line Number Information

我勾选了编译器选项的复选框,但运气不好。

415640 次浏览

如果您确实指出了您正在使用的eclipse版本和技术(例如,Java JDT,或面向Java的AJDT,或c++ CDT),这将有所帮助。

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

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

  • (1)添加可变属性,
  • (2) addline number,
  • (3)添加源文件名,
  • (4)保存未使用的局部变量。

您的项目是否只在全局级别(windows Preferences)或在项目特定级别检查这些?

你确定打开的类(你试图在上面设置断点):

  • 是您的源代码之一(并且不是来自第三方库)
  • .java,而不是.class?

尝试清理所有内容并重新构建所有内容,检查潜在的jar的冲突

  1. 在eclipse菜单中,进入“窗口->首选项->Java->编译器”
  2. 取消标记复选框“添加行号属性…”
  3. 单击“应用”->是
  4. 标记复选框“添加行号属性…”
  5. 再次申请。
  6. 愉快调试

我在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也显示了行号)。所以请忽略它:)

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

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

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

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

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

在编译/构建jar时,我做了上面列出的所有事情-仍然有同样的问题。

最终,在启动服务器时,下面列出的jvmarg更改最终为我工作:

  1. 删除/注释了一堆与javaagent和bootclasspath相关的jvm参数。

<!-- jvmarg value="${agentfile}" /-->

<!-- jvmarg value="-javaagent:./lib/foobar /-->

<!-- jvmarg value="-Xbootclasspath/a:/foo /-->

  1. 打开/取消注释以下行:

<jvmarg value="-Xdebug" />

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

这解决了我的问题:

  1. 窗口->首选项->服务器->运行时环境
  2. Apache Tomcat ->编辑
  3. 选择JDK而不是JRE

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

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

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

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

编辑:除此之外,我还注意到有时我可以忽略Eclipse给出的警告,它仍然会停在需要的地方……越来越奇怪……我将此归入我们作为开发人员所需要处理的事情中。

我的情况与此类似:

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

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

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

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

希望这对大家有所帮助,

-gmale

不知道这是否仍然相关,也许另一个水手会发现这有用。

当已编译的类文件关闭调试标志时,将出现该消息。

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

快乐的调试. .

< p >参考: http://doc.sumy.ua/prog/Java/javanut/ch16_04.htm < / p >

检查/做以下事情:

1)在“窗口—>首选项—> Java—>编译器—>类文件生成”下,所有选项必须为True:

(1) Add variable attributes...
(2) Add line number attributes...
(3) Add source file name...
(4) Preserve unused (never read) local variables
在你的项目的。settings文件夹中,找到一个名为org.eclipse.jdt.core.prefs的文件。 验证或设置org.eclipse.jdt.core.compiler.debug.lineNumber=generate

3)如果仍然出现错误窗口,单击复选框不显示错误信息。

4)清洁和建造项目。开始调试。

正常情况下,错误窗口不再显示,调试信息显示正确。

这招对我很管用:

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

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

我什么都做了,还是没工作。解决方案是删除已编译的.class文件和生成的war文件的目标,现在它的工作:)

尝试改变你使用的jre。将jre设置在JDK文件夹中。

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

我有同样的错误与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>

我也遇到过这个问题。我正在使用一个蚂蚁构建脚本。我正在开发一个遗留应用程序,所以我使用的是jdk版本1.4.2。这个方法曾经有用,所以我开始四处寻找。我注意到在JRE选项卡上的Debug配置下,Java的版本被设置为1.7。一旦我把它改回1.4,它就工作了。

我希望这能有所帮助。

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

  1. 打开运行->调试配置
  2. 在主选项卡的底部,在“应用”和“恢复”按钮旁边,有一个文本说明你正在使用哪个启动器,旁边有一个超链接说“选择其他”。这是一个奇怪的UI元素,乍一看并不可行。
  3. 使用“选择其他”链接并选择“Scala应用程序(新调试器)启动器”。另一个似乎不能与Scala一起工作。

现在调试应该可以工作了。注意,我已经安装了Scala IDE插件,如果您没有这个选项,那么这个选项可能是不可用的。

我试图调试日志管理器,需要将jre更改为jdk,然后在“主”选项卡中选择这个jdk,调试配置的“Java运行时环境”|“运行时jre”,然后一切正常。

当我用@ManagedBean (javax.annotation.ManagedBean)注释类时,我发现了这个问题。在JBoss EAP 6.2.0上运行新编译的应用程序时出现警告消息。忽略它并继续运行并没有帮助——断点从未到达。

我在JSF页面中使用EL调用该bean。现在…@ManagedBean可能不适合(我是CDI的新手)。当我将注释更改为@Model时,bean执行了,但断点警告也消失了,我像预期的那样击中了断点。

总之,看起来@ManagedBean注释弄乱了行号,不管它是否使用了错误的注释。

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

对于春天相关的问题,考虑在某些情况下它生成的类“没有行号”;例如,没有接口的@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");
}
}

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

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

@PrepareForTest({XXXXX.class})

不确定是不是同一个案子。

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

所以我所做的就是

  1. 在eclipse菜单中,进入“窗口->首选项->Java->编译器”
  2. 在JDK遵从性下,我将编译器遵从性级别从1.7更改为1.6

现在Eclipse不再抱怨“无法插入缺少行号信息的断点”,并且调试断点实际上工作了!!

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

我在一个特定的项目中遇到了同样的问题,我一直试图重置窗口中的行号属性->首选项…然后我意识到每个项目都有自己的行号属性设置。右键单击项目,进入属性,选择JavaCompiler,并选中“添加行号属性…”

如果上面的解决方案不工作,你开始得到这个问题后,你做了一个spring bean注入,问题可以是你没有使用接口注入类。尝试使用实现接口的类进行注入可以解决这个问题。下面是一个例子: 无法安装用于创建bean的断点问题 < / p >

在使用Spring Tool Suite (STS)启动Java EE项目时,我们也会遇到这个消息,但是我们可以忽略这个消息,因为一切都很好。

我几乎试过了这里所有的解决方案,但都不走运。这样做之后,我重新启动了我的程序,一切都很好。Eclipse碰到我的断点时,好像什么都没有发生。

对我来说,根本原因是Eclipse试图为自动生成的Spring CGLIB代理对象设置调试。除非你需要调试这个级别的东西,否则你应该忽略这个问题。

这里有详细的解释:

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

我的问题是我有2个JAR的,我试图覆盖一个与另一个基于其在Eclipse中的Java Build Path => Order & Export选项卡的顺序,因为一个是调试和另一个不是(调试JAR在顺序中是第一个)。当我这样做时,我必须手动附加一个源。

我尝试删除非调试JAR,并将调试JAR放在我的\WEB-INF\lib\目录中,进行清理、构建等操作,结果成功了。这一次(已经删除了附加的源代码),它将自动让我浏览调试代码,而无需手动附加任何源代码。断点和调试也可以工作。


为了防止有人仍然有问题,我也尝试了其他答案中提到的所有这些特解:

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

我还做了通常的服务器关闭(并确保java.exe实际上是关闭的……),删除两个项目中的\build\目录,使用-clean参数重新启动Eclipse,重新创建调试JAR,刷新,清洗,并在其中构建带有调试JAR的项目,以调试模式启动服务器,发布/清洗,并设置断点。

如果其他方法都不起作用,打开调试透视图,清除所有现有的断点,然后重新设置它们。

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

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

  1. 确保在项目的属性> Java编译器有“添加行号属性生成类字段(由调试器使用)选择。
  2. 清洁所有项目。。(菜单>项目>清洁…)确保目标文件夹为空。
  3. 构建项目(菜单>项目>构建项目)
  4. 确保在目标目录中生成了新类。
  5. 运行调试;如果在WebServer上运行,请确保在“调试”模式下运行web服务器。

如果有疑问——编译后的.class文件是否包含行号——在Eclipse中打开.class文件。Eclipse将反编译文件并告诉您行号是否存在。

enter image description here

我尝试了以前的大部分解决方案,仍然有问题。 这是我接下来所做的:

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

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

所以如果前面的解决方案仍然不适合你。试试这个。 我希望它能帮助你;-)

对于使用Tomcat服务器的Web项目,我通过以下步骤解决了这个问题。

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

我在eclipse IDE中也遇到了同样的问题。我阅读了这个问题的所有答案,并尝试了几乎所有提到的设置,但运气不好。

所以,我试图改变项目的运行时库,以前它是JRE - Java SE 1.8 Default runtime < / p >

我尝试将JRE更改为JDK,它为我工作:

JDK selected

从JRE切换到JDK的步骤如下:

  • 右键单击项目
  • 单击“属性-> Java构建路径”
  • 选择选项卡-“图书馆”
  • 点击“添加库”按钮。将打开“添加库”窗口
  • 选择“JRE System Library”->单击“Next”按钮
  • 选择“备用JRE”
  • 单击“Installed JRE”按钮
  • 在新建窗口点击“添加”。这将打开另一个窗口“添加JRE”。
  • 选择“标准虚拟机”。单击Next。
  • 点击目录按钮。
  • 选择“JDK”安装目录的路径,单击“确定”。单击“完成”。
  • 现在检查新增的“JDK” 李Select on JDK < / p > < / >

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

  • 应用- >好吧
  • 选择"JDK from alternate JRE下拉菜单,点击"Finish" 李Alternate JRE < / >
  • 现在从下面描述的列表中删除JRE实例 李Remove wanted JRE < / >
  • 单击“应用”->确定

你完蛋了!!

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

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

如何修复在Eclipse中调试时的断点错误? 只替换这几行。< / p >

    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

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

. exe

如果有人试图调试Java的源代码,那么,这是唯一适合我的解决方案。上面的大多数回答都谈到了如何设置Compiler选项来生成行号。但是,如果要调试Java的源代码(例如Java .util. hashmap),那么上述选项可能不适合您。这是因为,要调试源代码的项目的Java Build Path --> Library --> JRE System Library指向jre jar,而不是jdk jar。绑定在jre jar中的类已经用特定的选项预编译,该选项不支持Compiler选项设置。解决方案是重新配置你的项目,让JRE System Library指向jdk jar。jdk jar中的类将遵守Compiler选项设置。因此,一旦你更新你的项目的JRE System Library指向jdk jar,调试Java源代码将开始工作。

我在Eclipse IDE中有同样的错误。 但这似乎是一个可以忽略的错误。 我在错误对话框上按了Ok键。继续说。 我的断点到达&

首先,我建议你确定问题是与项目相关还是与单个测试文件相关。试着在调试模式下运行任何其他测试文件。

如果问题只适用于一个文件,这可能与自我嘲笑有关(就像我的情况一样)。否则,编译器/构建设置应该被更改。在之前的评论中已经描述过了。

我只是想强调一下。这已经足够我浪费时间在修复项目设置,而这是完全没有必要的:)