391

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

Unable to insert breakpoint Absent Line Number Information

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

4

41 回答 41

238

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

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

我切换到 ant build,使用

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

不过,同样的信息。

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

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

于 2009-11-03T23:01:58.117 回答
120
  1. In eclipse menu, go to Window->Preferences->Java->Compiler
  2. Unmark checkbox "Add line number attributes..."
  3. Click Apply -> Yes
  4. Mark checkbox "Add line number attribute..."
  5. Apply again.
  6. Go happy debugging
于 2009-08-23T12:48:32.307 回答
30

这解决了我的问题:

  1. 窗口 -> 首选项 -> 服务器 -> 运行时环境
  2. Apache Tomcat -> 编辑
  3. 选择 JDK 而不是 JRE
于 2011-01-21T14:42:05.393 回答
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");
   }
}
于 2015-04-16T09:41:55.100 回答
14

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

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

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

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

编辑:除此之外,我注意到有时我可以忽略 Eclipse 发出的警报,它仍然会停在所需的位置......作为开发人员工作时。

于 2011-04-22T21:59:16.847 回答
12

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

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

于 2017-08-26T17:16:34.480 回答
9

这在这里详细解释:

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

于 2017-09-01T15:38:11.480 回答
8

不知道这是否仍然相关,也许其他水手会发现这很有用。

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

在eclipse中,你可以通过前面提到的选项来开启它,

Window --> Preferences --> Java --> Compiler --> Classfile Generation: "add line number attributes to generated class file"

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

于 2011-07-06T21:14:56.713 回答
8

这对我有用:

  1. Window --> Preferences --> Java --> Compiler --> Classfile Generation,所有选项都必须是True
  2. debug="true"在 build.xml<javac>任务中制作。
  3. 通过ant生成的war在tomcat中部署应用
  4. Debug以模式重新启动Tomcat
于 2012-05-08T05:24:16.000 回答
6

It would help if you did indicate the version of eclipse you are using and the technology (Java JDT, or AJDT for Aspect Java, or C++ CDT for instance), just to be sure.

On the Java side, I suppose your "Ticked the checkbox from Compiler options" refers to this

Under "Window --> Preferences --> Java --> Compiler --> Classfile Generation", all 'Class file' generation options are set to True:

  • (1) add variable attributes,
  • (2) addline numbers,
  • (3) add source file name,
  • (4) preserve unused local variables.

Does your project have those checked only at the global level (windows Preferences) or at project specific level?

And are you sure the class opened (on which you try to set a breakpoint):

  • is one of your sources (and not coming from a third party library)
  • is a .java, not a .class?

Try to clean everything and rebuild all, check for potential jar conflicts.

于 2009-06-05T21:27:44.477 回答
4

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

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

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

于 2009-11-15T00:13:22.320 回答
4

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

于 2013-03-19T12:52:39.543 回答
4

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

于 2017-11-24T12:20:36.300 回答
4

Since I have 6 different versions of Java installed, I had to change my default JDK compliance to match that of the Java version I wanted to use. Eclipse by default had compiler compliance level set to Java 1.7 when everything was built/compiled using Java 1.6.

So all I did was

  1. In eclipse menu, go to Window->Preferences->Java->Compiler
  2. Under JDK Compliance, I changed Compiler compliance level from 1.7 to 1.6

Now Eclipse doesn't complain about the "Unable to insert breakpoint Absent Line Number Information" anymore and the debugging breakpoints actually work!!!

于 2015-09-14T20:47:53.340 回答
2

我的情况类似:

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

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

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

我仍然遇到同样的错误,但是在单击“确定”后,断点工作得很好。

希望对某人有所帮助,

-gmale

于 2011-05-29T00:27:42.130 回答
2

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

于 2013-04-15T17:03:23.300 回答
2

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

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

于 2012-07-04T08:09:46.387 回答
2

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

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

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

于 2014-05-12T18:33:08.480 回答
2

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

于 2019-06-25T20:50:21.120 回答
1

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

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

于 2009-12-17T04:00:44.177 回答
1

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

于 2015-03-21T04:47:52.433 回答
1

我在 JBoss 7.1 上遇到了同样的错误。我和 Zefiro 一样。只是忽略了错误,我能够正常放置断点。就我而言,我正在构建思想蚂蚁构建器,这是我的 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>
于 2013-04-16T20:05:53.297 回答
1

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

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

@PrepareForTest({XXXXX.class})

不确定是不是同样的情况。

于 2015-07-10T05:07:53.273 回答
1

我的问题是我有 2 个 JAR,我试图根据Java Build Path => Order & ExportEclipse 选项卡中的顺序覆盖一个,因为一个用于调试,另一个不是(调试 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 的项目,以调试模式启动服务器,发布/清理和断点。

于 2017-10-03T21:20:03.817 回答
1

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

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

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

已选择 JDK

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

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

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

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

你完成了!

于 2018-11-29T00:19:38.100 回答
0

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

于 2014-05-23T09:40:51.980 回答
0

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

我希望这有帮助。

于 2014-03-03T20:15:58.633 回答
0

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

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

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

于 2015-03-20T15:19:03.540 回答
0

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

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

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

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

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

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

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

<jvmarg value="-Xdebug" />

然后,当我启动服务器时,我就可以打断点了。我怀疑 javaagent 以某种方式干扰了 Eclipse 检测行号的能力。

于 2010-11-16T00:42:46.350 回答
0

检查/执行以下操作:

1) 在“Window --> Preferences --> Java --> Compiler --> 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)清理并构建项目。开始调试。

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

于 2012-01-16T10:37:38.730 回答
0

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

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

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

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

于 2018-05-10T15:20:18.497 回答
0

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

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

于 2019-02-26T10:01:24.070 回答
0

在 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
于 2019-05-21T20:37:48.797 回答
0

确保运行时主类所在的项目与您在. 如果没有,请确保两个项目都在运行配置的类路径中,并出现任何 jar 和类文件夹之前。

于 2016-05-30T10:12:55.183 回答
0

如果上述解决方案不起作用,并且您在进行 spring bean 注入后开始遇到该问题,则问题可能是您没有使用注入类的接口。尝试使用实现接口的类进行注入将解决问题。例如,请点击链接: 无法为 bean 创建安装断点问题

于 2017-04-05T12:58:05.503 回答
0

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

于 2016-06-13T20:54:28.510 回答
0

我在我的 Eclipse IDE 中遇到了同样的错误。但这似乎是一个可以忽略的错误。我在错误对话框上按了确定并继续。我的断点已到达,我能够进一步调试。

于 2020-09-11T05:38:11.233 回答
0

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

  1. 打开窗口 -> 显示视图 -> 其他 -> 服务器。
  2. 双击正在运行的 tomcat 服务器。(将打开tomcat服务器的概述)
  3. 现在单击启动配置链接。
  4. 单击源选项卡。
  5. 单击添加。
  6. 选择java项目
  7. 将显示您的所有项目。
  8. 选择您要调试的。
  9. 保存配置并重新启动或再次构建应用程序。
于 2018-10-12T10:50:04.467 回答
0

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

于 2019-06-28T08:06:46.967 回答
0

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

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

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

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

在此处输入图像描述

于 2018-03-28T15:07:10.037 回答
-1

我们在使用 Spring Tool Suite (STS) 启动 Java EE 项目时也会收到此消息,但我们可以忽略此消息,因为一切正常。

于 2017-05-18T10:21:18.153 回答