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也显示行号).所以只是忽略它:)
小智 97
小智 27
这解决了我的问题:
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)
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
这对我有用:
Window --> Preferences --> Java --> Compiler --> Classfile Generation,所有选项必须是True.debug="true"在build.xml <javac>任务.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
这在此处详细解释:
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 -> 调试)并禁用“由于缺少行号属性而无法安装断点时发出警告”。
如果确实要指出使用的Eclipse版本和技术(例如Java JDT或Aspect Java的AJDT或C ++ CDT),这将有所帮助。
在Java方面,我想你的“打勾从编译器选项勾选”是指这
在“ Window --> Preferences --> Java --> Compiler --> Classfile Generation”下,所有的Class file生成选项都设置为True:
您的项目是否仅在全局级别(Windows首选项)或项目特定级别进行了检查?
并且您确定该类已打开(尝试在其上设置断点):
.java,不是一个.class?尝试清理所有内容并重建所有内容,检查是否存在潜在的jar冲突。
我在这里尝试了几乎所有解决方案,但没有运气。 您是否尝试单击“不再告诉我”? 这样做之后,我重新启动了程序,一切都很好。Eclipse击中了我的断点,好像没有什么错。
对我来说,根本原因是Eclipse试图为自动生成的Spring CGLIB代理对象设置调试。除非需要在该级别进行调试,否则应忽略该问题。