Println 调试的正确姿势
最简单的工具往往最好用,调试就是最好的例子。先进的调试技术有很多,也各有各的适用场景,但 println 调试依然是大家的首选——不管是手动调试,还是靠编码智能体(coding agent)帮忙。新手程序员最早学会的事情之一,就是在程序里插入一条 println 语句来查看程序状态,那时他们可能还没听过“调试”这个词。多年以后,这种简单的调试日志仍然是排查真实代码库中各种问题最有效的工具之一。现在,它也正是编码智能体最爱用的调试手段。
更好的基础 + 现代工作流
这项技术可以改进,却不失其原有的简洁性。其实,IntelliJ IDEA 的日志点(logpoints)早就是 println 调试的超集,功能更强大:在完成同样的任务之外,它还能设置条件、打印堆栈、使用命中计数和调用方过滤器、分组、保存备用,等等。你想象得到的最刁钻的调试场景,很可能 IntelliJ IDEA 的日志点都已经有对应的功能了(比如,你知道吗,它还能发出哔哔声)。在 2026.2 版本中,我们进一步改进了日志点,但重点不是放在某个特定功能上,而是把基础打得更牢:
- 用插桩替代调试器侧求值:IntelliJ IDEA 现在会直接对代码插桩(instrument)来实现条件断点和日志断点,消除了其他 Java 调试器在这方面的瓶颈。
- 智能体兼容:我们改进了日志点,让 AI 智能体也能可靠地使用它们。配合一个新的内置技能(skill),智能体就能获得控制调试会话、调用 IDE 全部日志点功能所需的指南和操作入口。
- 新界面与导航:新界面让日志点的设置更简单。另外,控制台现在会记录每条日志输出是由哪个 println 或日志点产生的,你可以直接跳转过去。
以上特性在本地和远程 JVM 调试会话中都可用。下面我们逐项细看。
简短演示
为了演示,我搭了一个迷你 gRPC 服务器/客户端场景,目标是调试服务器端。如果你还不熟悉日志断点(Logpoint),本系列下一篇文章会基于这个项目给出详细教程,这里先看新功能。
这个场景里,用普通断点挂起应用是没用的:一旦暂停,超时马上触发,执行转入取消流程,你想看的状态早就没了。所以与其用断点,不如把状态打点记下来——最好让编码智能体代劳:
智能体不仅会设置日志断点,还会自己跑运行配置、汇总产生的日志、定位 bug,并在事后清理干净。由于 IntelliJ IDEA 会记录哪些日志断点属于智能体,它不会不小心改动你的断点。但它对自己的日志断点有完全控制权,包括开关和修改属性,和你自己操作权限一样。如果重现 bug 确实需要修改状态,IntelliJ IDEA 也允许智能体这么做,不过这套技能会引导智能体尽量避开副作用,能打日志就不动状态。
下面是短视频演示:
从终端运行
上面的例子是通过 AI 聊天窗口运行智能体,但同样的能力在 IDE 内置终端或 IDE 外部也能用。技能装好后,你可以选任意智能体来使用:
这次换成 Claude Code,流程完全一致:
手动设置日志断点
现在手动设置日志断点只需一次点击:选中要记录的表达式,然后点击任意两行可执行代码之间的行槽。如果编辑器里没有现成的表达式,也可以随后手动输入自定义内容:
想知道控制台里某一行输出来自哪段代码,点一下那行,再选择 Open:IntelliJ IDEA 会出现 Open 按钮,带你跳到编辑器中对应的代码位置。
此外,如果日志断点经过了代码插桩(instrumentation),IDE 还会显示执行流如何到达这里的完整堆栈跟踪——信息量和「记录堆栈跟踪」选项相同,但控制台不会再被刷屏。
日志断点到底快了多少?它的大部分优点在各家调试器中是共通的:不用改源代码、开关方便、可以查看那些本不方便修改位置的代码。IntelliJ IDEA 的实现不止于这些基础能力,但这次版本中最亮眼的还是性能。
如果你曾经在热路径(hot path,即被高频执行的代码路径)上放过条件断点或日志断点,应该体会过它的代价。在传统的 JPDA/JDWP 断点模型下,每次命中断点,应用都要先暂停,计算条件或日志表达式,然后才恢复执行。偶尔命中几次没什么影响,但放在热路径上,这套标准模型就成了瓶颈。
传统 Java 日志断点的开销不只是让人心烦。这种延迟可能掩盖对延迟敏感的故障,让竞态条件(race condition)消失,或者压低应用负载,从而掩盖真正的问题。你很有可能正在调试调试器自己引入的「行为」。
不久前,我写过一些绕过这些开销的办法。幸运的是,IntelliJ IDEA 2026.2 通过为条件断点和日志断点插桩被调试代码,让这些 hack 都成了过去式。下面是我们内部基准测试的结果:
在我们的测试集中,性能提升了约 30 倍,日志断点重新在对时间敏感的代码中变得可用。日志断点的操作流程没有变化,调试代理也不需要任何调整,但性能已经和普通 print 语句相当。
最棒的是,享受这种提速不需要任何配置。IntelliJ IDEA 会自动识别哪些日志断点可以被插桩,并在同一个调试会话中默默完成,无需重启。
总结
日志断点依然延续着让 println 调试如此好用的那个简单理念:获取最关键的信息,放到最容易看到的地方。