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


370

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

Unable to insert breakpoint Absent Line Number Information

我在“编译器”选项中打了勾,但没有运气。


您可以在类文件上执行javap -verbose并将信息粘贴到此处吗?查看它是否实际上具有行号。
z-

3
嗨,yx,我在该类上做了一个javap。它生成行号
chandrajeet

奇怪的是,我刚遇到BlackBerry插件Eclipse 3.5的问题,与Tomcat无关。而且我也确实会在断点处停止,除了其中一个断点...如果找到答案,我会发布。
理查德·勒·马苏里尔

6
对我来说,这是一个错误的模拟,我不小心嘲笑了我正在测试的课程。也许有人觉得这很重要。
hipokito

1
@hipokito您能解释模拟一个类的含义以及如何撤消它吗?其他解决方案对我不起作用。
琥珀色

Answers:


227

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


31
以上对我不起作用。我必须在Eclipse> Breakpoints视图中单击“ Remove all Breakpoints”图标,然后重新添加这些断点。那行得通。
维克·大卫

3
我关闭了所有其他项目,删除了所有断点,在文件中进行了随机更改,清理了项目,再次引入了断点。这为我工作
阿里

4
添加debug="true"到构建脚本的javac任务已成功ant
贾斯汀·斯基尔斯

这个答案仍然是有效的运行在Windows 8 64位与Java 7的Eclipse我开普勒的安装
Magnilex

1
“事实证明消息是错误的……”-这应该被过分强调。即使阅读了这篇文章,我仍然不明白你在说什么。考虑将整个答案移到底部,并在大胆的方框顶部说类似“此消息很可能没有任何意义-尝试单击“不要与我有关”,看看是否可以仍在调试”。
Bane 2014年

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

1
这招对我的情况不起作用
优素福·易卜拉欣

28

这解决了我的问题:

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

3
这解决了我的问题(在ant config中指定了错误的jdk版本)。它确实解决了问题,但是Eclipse STILL给了我错误消息。因此,请确保在进行此更改后实际进行调试,并尝试调试代码-不要让错误消息使您失望。
保罗

即使您的应用程序不在Web上,解决方案也可以,Installed JREs默认情况下JDK应使用JRE
ahmednabil88 18-10-25

我知道规则,但是这里有很多答案。这个在2019年11月为我工作,但是我也改变了主要的Runtime环境,可以100%解决问题。
Alvargon

19

对于与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");
   }
}

1
“添加接口”是什么意思?将其导入文件?
CamHart 2015年


14

从BlackBerry SDK方面,我可以解决此问题:出于某种原因,无论我更改了编译器中的选项多少次,实际的基础设置文件都没有更改。

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

您可以在其中手动修改设置:

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

编辑:除此之外,我注意到有时我可以忽略Eclipse发出的警报,它仍然会停在所需的位置...好奇的人和好奇的人...我将其放入了我们学习处理的内容中当开发人员。


8

这为我工作:

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

7

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

当一个类文件已编译,调试标志关闭时,显示该消息。

在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


6

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

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


5

如果确实要指出所使用的Eclipse版本和技术(例如Java JDT或Aspect Java的AJDT或C ++ CDT),这将有所帮助。

在Java方面,我想你的“打勾从编译器选项勾选”是指

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

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

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

并且您确定该类已打开(尝试在其上设置断点):

  • 是您的资源之一(并非来自第三方库)
  • 是一个.java,不是一个.class

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


嗨,VonC,我在Java 1.6上的Eclpise Ganymede上,是的,我具有全局设置。我试图将其设置为我自己编写的Java代码,所以是的,我确实具有.java和.class文件。我在该类上做了一个javap。它生成行号
chandrajeet

@chandrajeet如果您全局设置了这些设置,我认为您检查过您的项目是否没有使用项目特定的设置覆盖它们?如果没有,我现在看到的唯一的事情是把断点上的.class代替的.java ...
VonC

4

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

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

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



4

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

所以我所做的就是

  1. 在eclipse菜单中,转到Window-> Preferences-> Java-> Compiler
  2. 在“ JDK合规性”下,我将“编译器合规性”级别从1.7更改为1.6

现在Eclipse不再抱怨“无法插入断点缺少行号信息”,调试断点实际上可以正常工作!!!


4

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


3

此处详细说明:

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


2

我的情况类似:

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

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

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

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

希望能对某人有所帮助,

-男


感谢分享,我遇到了同样的问题。该解决方案虽然对我不起作用。虽然我是Mockito的新手,但我可能还有其他一些问题,无法阻止我的模拟对象被实际调用。但是,我仍然感谢您发布了此@gmale!
Michael Osofsky 2014年

2

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

我做了一切,仍然无法正常工作。解决的办法是删除已编译的.class文件和生成的war文件的目标,以及现在的工作方式:)


2

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


2

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

  1. 打开运行->调试配置
  2. 在“主”选项卡的底部,“应用”和“还原”按钮旁边,有一个文本,说明您正在使用哪个启动器,旁边有一个超链接,显示“选择其他”。这是一个奇怪的UI元素,乍看之下似乎不可行。
  3. 使用“选择其他”链接,然后选择“ Scala应用程序(新调试器)启动器”。另一个似乎与Scala不兼容。

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


2

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


1

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

我正在使用ANT构建脚本构建所有内容。如果这是您要执行的操作,请确保在您拥有的每个javac ant任务上都设置了debug = true标志。这是我唯一的问题-希望对您有所帮助!


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>

1

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


1

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

添加以下代码解决了我的问题。

@PrepareForTest({XXXXX.class})

不确定情况是否相同。


1

我的问题是我有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
  • 确保在启用调试的情况下生成JAR。
  • 将JDK遵从级别从1.6更改为1.7(从而与我使用的JDK相匹配)。

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


0

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

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

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

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

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


0

检查/执行以下操作:

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

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


0

我也遇到了这个问题。我正在使用一个蚂蚁构建脚本。我正在使用旧版应用程序,因此我正在使用jdk版本1.4.2。这曾经奏效,所以我开始四处张望。我注意到在JRE选项卡上的Debug配置下,Java的版本已设置为1.7。一旦我将其更改回1.4,它就会起作用。

我希望这有帮助。


0

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


0

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

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

总之,无论@ManagedBean批注是否使用了错误的批注,它看起来好像都弄乱了行号。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.