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

cha*_*eet 350 eclipse debugging breakpoints

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

Unable to insert breakpoint Absent Line Number Information
Run Code Online (Sandbox Code Playgroud)

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

Zef*_*iro 222

我在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">
Run Code Online (Sandbox Code Playgroud)

不过,同样的消息.

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

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

  • 以上对我不起作用.我必须单击Eclipse> Breakpoints视图中的'Remove all Breakpoints'图标,然后重新添加断点.那很有效. (26认同)
  • 将`debug ="true"`添加到`ant`构建脚本的`javac`任务中. (4认同)
  • 我关闭了所有其他项目,删除了所有断点,对文件进行了随机更改,清理了项目,再次引入了断点.这对我有用 (3认同)
  • “事实证明信息是错误的......” - 这应该被过分强调可笑。读完之后,我还是没明白你在说什么。考虑将您的整个答案移到底部和顶部的大粗体框中,说“这条消息很可能没有任何意义 - 尝试单击不要打扰我,看看您是否可以仍在调试”。 (3认同)

小智 97

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


小智 27

这解决了我的问题:

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

  • 这解决了我的问题(在ant配置中指定了错误的jdk版本).它确实修复了问题,但是eclipse*STILL*给了我错误信息.因此,请确保在进行此更改后实际尝试调试代码 - 不要让错误消息让您失望. (3认同)

Pai*_*izo 18

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

@Service("SkillService")
public class TestServiceWithoutInterface {
   public void doSomething() {
      System.out.println("Hello TestServiceWithoutInterface");
   }
}
Run Code Online (Sandbox Code Playgroud)

上面的服务将有一个由spring生成的界面导致"缺少行号".添加真实接口解决了生成问题:

public interface TestService {
    void doSomething();
}

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

  • 我用一些代码片段更新了答案 (2认同)

Ric*_*ier 13

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

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

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

org.eclipse.jdt.core.compiler.debug.lineNumber=generate
Run Code Online (Sandbox Code Playgroud)

编辑:除此之外,我注意到有时候我可以忽略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"   >
Run Code Online (Sandbox Code Playgroud)

快乐的调试..

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


Sam*_*isa 7

这在此处详细解释:

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


Von*_*onC 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冲突


gbs*_*ler 5

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

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


Chr*_*tos 5

如果没有其他方法,请打开调试视角,清除所有现有断点,然后再次将其设置回来。