Java基础问题定位之调试
Java程序调试的详细方法:
一、使用IDE调试(以IntelliJ IDEA为例)
-
设置断点
- 在代码行号旁点击左键,出现红色圆点表示断点已设置。
- 右键断点可设置条件(如
i > 5
),满足条件时暂停。
-
启动调试模式
- 点击绿色虫子图标或使用快捷键
Shift + F9
。 - 确保项目以调试模式编译(IDE默认处理)。
- 点击绿色虫子图标或使用快捷键
-
调试控制
public class Demo {public static void main(String[] args) {int sum = 0;for (int i = 0; i < 5; i++) { // 在此行设置断点sum += i;System.out.println(sum);}} }
- F8(Step Over):逐行执行,不进方法内部
- F7(Step Into):进入自定义方法(跳过JDK源码)
- Shift + F8(Step Out):跳出当前方法
- F9(Resume):继续执行到下一个断点
-
查看数据
- Variables窗口:实时显示当前作用域的变量值
- Watches窗口:自定义监控复杂表达式(如
sum * 2
) - 鼠标悬停变量:快速查看当前值
二、高级调试技巧
-
异常断点
- 点击
Run -> View Breakpoints -> +
添加Java Exception Breakpoints - 输入
NullPointerException
,程序抛出该异常时自动暂停
- 点击
-
多线程调试
- 在Debug窗口点击
Settings
图标 - 勾选
Suspend -> Thread
(默认暂停所有线程,可改为仅暂停当前线程)
- 在Debug窗口点击
-
热更新调试
- 修改代码后无需重启:使用
Ctrl + F10
(IntelliJ)进行HotSwap - 注意:仅支持方法体修改,不能修改类结构
- 修改代码后无需重启:使用
三、替代调试方案
-
日志调试
import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class PaymentService {private static final Logger logger = LoggerFactory.getLogger(PaymentService.class);public void process() {logger.debug("开始处理支付"); // 配合logback.xml设置DEBUG级别// 业务逻辑logger.info("支付完成,金额:{}", amount); // 使用占位符避免字符串拼接} }
-
命令行调试
# 启动JVM调试模式 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 MyApp# 使用jdb连接 jdb -attach 5005 > stop at Demo:22 # 设置断点 > run
-
远程调试(生产环境)
- 在启动参数中添加:
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
- 在IDE中创建Remote JVM Debug配置,指定主机和端口
- 在启动参数中添加:
四、常见问题排查
-
断点未生效
- 检查是否使用Debug模式运行
- 确认代码版本与运行版本一致
- 清理并重新编译项目
-
变量值显示
null
- 检查对象初始化时机
- 使用
Objects.requireNonNull()
提前验证
-
逻辑错误定位
- 在关键分支处设置多个断点
- 使用
Evaluate Expression
(Alt + F8)实时测试表达式
五、性能调试建议
-
内存分析
- 使用
jvisualvm
或YourKit
分析堆内存 - 捕获内存快照查找内存泄漏
- 使用
-
CPU profiling
- 用JProfiler进行CPU采样
- 定位热点方法优化算法
提示:复杂分布式系统建议结合APM工具(如SkyWalking)进行全链路调试。调试时建议使用最小化用例复现问题,可提高效率。