eclipse里面断点不被触发的问题

本文探讨了在使用Eclipse进行Java开发时遇到断点不触发的问题,发现原因在于使用了存在bug的JDK版本(1.6update14)。文中提供了解决方案,即通过使用ParallelScavenge或ParallelCompacting垃圾收集器,或升级到更新的JDK版本来解决此问题。

今天发现一个奇怪的问题,就是在eclipse里面设置的断点无论如何就是不被触发。


现象如下:我启动了好几个服务(不同的jvm进程),有一个服务的代码中设置的断点始终不能被触发,其它几个服务都好好的。通过日志可以确定程序肯定被正确执行,而且设置断点的行也被执行了。检查“Skip All Breakpoints”也没有选中,重启现象依旧。


后来网上搜了一下发现,这原来是jdk的一个bug,我用的是jdk1.6 update 14,正好是有问题的这个版本。

详细说明见:http://www.oracle.com/technetwork/java/javase/6u15-142514.html


解决方案,很简单,就是得使用Parallel Scavenge garbage collector ( -XX:+UseParallelGC) or the Parallel Compacting garbage collector (-XX:+UseParallelOldGC)这两种垃圾收集器的其中一种。加上-XX:+UseParallelGC选项,果然问题解决。或者升级jdk版本。stackoverflow上有对这个问题的详细说明。

http://stackoverflow.com/questions/1370868/eclipse-debugger-doesnt-stop-at-breakpoint





<think>我们正在处理一个关于在Eclipse中为static代码块设置断点问题。用户提到“无法打断点”,我们需要提供解决方案。根据Eclipse的调试功能,static代码块是可以设置断点的。如果用户遇到无法设置断点的情况,可能是由于以下原因:1.代码没有被正确编译,或者编译后的类文件没有调试信息。2.断点设置的位置正确(例如,在声明静态变量的行上而是在static块内的可执行代码行上)。3.Eclipse断点设置被过滤(filter)了,比如设置了“跳过所有断点”或者有断点过滤条件。4.项目配置问题,比如构建路径或编译器设置问题。解决方案:1.确保代码已经成功编译,并且编译器选项包含了调试信息(默认情况下,Eclipse在调试模式下会包含调试信息)。2.检查static代码块内的具体语句,在可执行语句的行号处设置断点,而是在static块的大括号上。3.检查Eclipse断点视图(BreakpointsView),确认没有跳过所有断点(有一个双箭头图标,如果被按下则表示跳过所有断点,再按一下取消)。4.清除项目并重新构建:Project->Clean...,然后选择清理当前项目或所有项目。5.检查Eclipse断点过滤设置:在断点视图(BreakpointsView)中,点击右上角的“查看菜单”(一个小三角形),选择“断点过滤设置”(BreakpointFilters...),确保没有将static代码块相关的断点过滤掉。6.重启Eclipse,有时候IDE的状态可能会出现问题,重启可以解决一些临时性问题。7.如果以上都行,尝试删除工作空间中的元数据(.metadata)并重新导入项目(注意备份设置)。另外,根据引用[3]:缺陷(Bugs)总在代码中存在,这是一个争的事实。因此,调试工具的使用非常重要。现在,我们将按照用户要求生成相关问题。</think>### Eclipse中为static代码块设置断点的解决方案 在Eclipse中为static代码块设置断点失败,通常由以下原因导致,请按步骤排查: #### 1. **确认断点设置位置** - static代码块必须设置在**可执行语句行**(如赋值、方法调用等),而非声明行 - ✅ 有效位置示例: ```java static { System.out.println("断点设在此行"); // 断点生效位置 value = 10; // 断点生效位置 } ``` - ❌ 无效位置示例: ```java static { // 此处设置断点无效(大括号行) int x; // 声明语句无效 } ``` #### 2. **检查编译器设置** 1. 项目右键 > Properties > Java Compiler 2. 确认勾选 `Add line number attributes to generated class files` 3. 检查 `Classfile Generation` 中的 `Debug` 选项为 `All` 或 `Line numbers` #### 3. **验证调试信息生成** - 打开`.class`文件验证(需反编译工具): ``` static {}; descriptor: ()V flags: (0x0008) ACC_STATIC LineNumberTable: line 15: 0 // 此行号应与源码对应 ``` - 缺失行号信息时需执行`Project > Clean` #### 4. **处理断点过滤** 1. 打开 `Window > Show View > Breakpoints` 2. 检查是否启用 `Skip All Breakpoints`(工具栏 ⏩ 图标) 3. 右键断点 > Filtering 查看是否被排除 #### 5. **类加载机制问题** - 若static块在类初始化时执行过早: - 在`Class.forName()`调用前设置断点 - 使用`-verbose:class`参数观察类加载时机 #### 6. **其他解决方案** - **临时调试法**:在static块内插入临时代码触发断点 ```java static { Object trigger = null; trigger.toString(); // 此处设断点(需捕获异常) } ``` - **字节码断点**: 1. `Run > Add Java Exception Breakpoint` 2. 输入`java.lang.ExceptionInInitializerError` > **注意**:当代码存在隐蔽逻辑时,断点可能被意外跳过[^2]。建议在排查后重启Eclipse并执行`Project > Clean`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值