必须将条件断点与日志断点在同一行协同配置:先设断点,再右键配置中同时填写condition(如order.getid()>1000&&order.getstatus().equals("pending"))和log表达式(如"order.id="+order.getid()+", status="+order.getstatus()),缺一则失效;idea仅在条件满足时执行日志且不暂停线程。

要在高频循环中既避免打断执行节奏、又精准捕获特定数据状态,必须把条件断点和日志断点组合起来用——不是分开设置,而是让它们在同一行协同生效。
同一行同时启用条件与日志输出
在目标代码行左侧空白处单击,添加基础断点;右键该断点图标 → 弹出配置窗口 → 勾选 【Log evaluated expression】 并输入日志内容(如"order.id=" + order.getId() + ", status=" + order.getStatus())→ 同时在 Condition 输入框中填写触发条件(如order.getId() > 1000 && order.getStatus().equals("PENDING"))。
这一步必须同时填写 Condition 和 Log 表达式,缺一不可。只填日志会无条件输出,只填条件则变成普通暂停断点。
IDEA 会在满足条件时才执行日志打印,且不暂停线程——相当于给日志加了“开关”。
用日志断点标记锁竞争现场
方法一:在 lock.lock() 前插入日志断点,表达式写为 Thread.currentThread().getName() + " → requesting lock";再在临界区第一行设条件+日志断点,Condition 为 Lock.isHeldByCurrentThread(),Log 表达式为 Thread.currentThread().getName() + " ✅ acquired lock"。
方法二:在 unlock() 后设日志断点,表达式为 Thread.currentThread().getName() + " released lock, held for " + (System.nanoTime() - startTime) / 1_000_000 + "ms",其中 startTime 需提前在 lock 前定义为 final long startTime = System.nanoTime();。
【startTime 必须声明为 final 或 effectively final,否则日志断点无法访问】
批量管理多个组合断点
第一步:按 Ctrl+Shift+F8 打开 Breakpoints 窗口。
第二步:左侧列表中勾选所有需要联动的断点(可 Ctrl+多选),右键 → Move to Group → New Group → 命名为 “LockTrace”。
第三步:在 Group 设置页中,统一开启 Enable Logging、关闭 Suspend,并粘贴相同 Condition 表达式(如thread.getName().contains("pool"))。
这样一组断点就变成一个可开关的整体。点击 Group 名称左侧的开关图标,就能一键启用/禁用全部日志输出逻辑,无需逐个操作。
Group 名称不能含空格或特殊符号,否则部分版本 IDEA 会 silently 失效。











