一、使用条件断点定位问题
1、条件断点可以帮助我们定位一些奇怪的报错或程序行为。
2、在IDEA调试窗口中选中需要条件断点的代码行,右键-Add breakpoint-Condition
// 举例代码段 public class Test { public static void main(String[] args) { int sum = 0; for(int i = 1; i <= 100; i++) { sum += i; } System.out.println(sum); } }
3、条件输入框中添加布尔型的条件表达式
// 举例代码段的条件断点示例 public class Test { public static void main(String[] args) { int sum = 0; for(int i = 1; i <= 100; i++) { sum += i; if(i == 50) { System.out.println(sum); } } System.out.println(sum); } }
二、日志断点记录流程信息
1、日志断点可以记录程序的流程信息,例如调用了哪些方法或者程序执行时间等。
2、在IDEA调试窗口中选中需要日志断点的代码行,右键-Add breakpoint-Log message
// 举例代码段的日志断点示例 public class Test { public static void main(String[] args) { int sum = 0; for(int i = 1; i <= 100; i++) { sum += i; System.out.println("i = " + i + ", sum = " + sum); //断点 } System.out.println(sum); } }
3、在“Log Expression”输入框中输入需要记录的信息,在“More”选项中可以设置输出日志等级。
三、动态调试操作
1、调试过程中可以动态地调整程序的行为。
2、在IDEA调试窗口中右键选中需要动态调整的代码行,选择Evaluate expression或者Watch选项卡。
// 举例代码段的动态调试示例 public class Test { public static void main(String[] args) { int sum = 0; for(int i = 1; i <= 100; i++) { if(i % 2 == 0) { sum += i; } System.out.println(sum); // 断点 } } }
3、在“Evaluate expression”输入框中输入想要修改的变量值,例如:sum=10,点击"Enter"或选择"Evaluate"。
四、多线程调试
1、多线程并发调试需要注意多线程间的同步。
2、在IDEA调试窗口中,选择“View breakpoint”,选定“Java Exception Breakpoints”,选中“Synchronized”项。
// 举例代码段的多线程并发调试示例 public class TestThread extends Thread { public static void main(String[] args) { TestThread thread1 = new TestThread(); TestThread thread2 = new TestThread(); thread1.start(); thread2.start(); } public synchronized void run() { for(int i=0;i<5;i++) { try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "-" + i); } } }
3、使用并发测试工具来验证多线程并发的结果是否正确。
五、利用IDEA的快捷键加速调试
1、提高调试效率,掌握IDEA的快捷键是必须的。
2、常见快捷键如下:
Ctrl+F8 : 跳过断点
Ctrl+Shift+F9 : 运行程序至光标所在代码行
Ctrl+Alt+Shift+R : 运行程序至光标所在代码行并打开Debug窗口
F8 : 单步运行
Shift+F8 : 跳过当前行,进入下一行
F7 : 进入当前行调用的方法
Shift+F7 : 跳过当前方法
Alt+F9 : 运行至光标所在行方法结束
Alt+F8 : 在Debug模式中计算表达式
3、快捷键可以根据个人喜好自定义。