2026年Rust调试指南:从打印到AI辅助调试
Rust 之所以是一门优秀的语言,原因有很多:安全性、性能和工具链。不过,调试或许仍是它最薄弱的环节之一。有趣的是,Rust 调试调查 2026 结果显示,大多数(53.2%)Rust 用户完全不使用调试器。许多 Rust 开发者(81.3%)表示,打印语句就是更简单、更快。配置也是另一个问题:许多用户觉得配置调试器很困难,而且这并不是一个对初学者友好的功能。尤其是当涉及 async(28.1%)和宏(23.0%)时,单步调试功能大多数时候都会失效。
不过,情况仍好于 2021 年首次开展这项调查时。使用调试器的用户比例已从 36% 增加到 46.8%!
这让我不禁思考:如今 Rust 的调试体验究竟如何?
那么,让我们深入看看现有的技术和工具,以及它们在实践中是如何使用的。
场景
我们将以格雷厄姆扫描算法为例。该算法计算平面上一组点的凸包:即包围所有点的最小凸形。基本上,你可以把它想象成在一堆钉子周围绷紧一根橡皮筋。
🐀:在这里,我用 Ratatui 构建了一个 TUI 来可视化该算法和这个 bug: [LOADING...]
你可以看到它未能包围 P2:计算出的围栏是红色,而期望的围栏是绿色。现在,让我们逐一了解可用的调试技术来修复它吧!
1. println!、dbg! 或 tracing
已经有一个失败的单元测试,因此我们可以把它当作调试循环来使用。只需在代码中添加 println! 或 dbg! 语句,然后反复运行测试,直到找到 bug。
这里,我们打印中间排序结果,重新运行失败的测试,发现极角相同的点按距离从远到近排序。将距离比较的方向反过来就能修正排序,下一次测试运行便通过了。
这是 Rust 中最常见的调试方式,对于小程序来说效果很好。不过,你也能看到问题所在:这是一个迭代且繁琐的过程。每次都需要重新编译并运行程序,很耗时。对于大型项目也不理想。但它确实管用!
🐀:还有别的方法吗?
2. 终端中的 rust-gdb 或 rust-lldb
我们可以通过 rust-lldb 或 rust-gdb 在不修改源代码的情况下检查同一个失败的测试: [LOADING...]
在这里,我们设置断点,只运行失败的测试,并检查当前栈帧: [LOADING...] [LOADING...]
在断点处,a 距枢轴点 36 个平方单位,而 b 只有 4 个。比较器使用的是 b.cmp(a),因此极角相同的点会按距离的逆序排序。
这就是 bug:更远的点先被处理,随后又从凸包中被移除。
那么我们来应用修复: [LOADING...]
我们还可以用 TUI 来可视化它: [LOADING...] 🐀:耶,橡皮筋现在把所有点都围起来了。
与打印调试不同,这种方式让我们无需在每次产生疑问后都编辑并重新编译程序,就能检查更多状态。代价是手动工作流:需要设置有用的断点,并知道要运行哪些调试器命令。
🐀:好吧,但有没有更友好的方式来调试这个?
3. RustRover 的调试器
RustRover 是 JetBrains 专为 Rust 打造的跨平台 IDE。它把 Cargo 项目、测试、代码分析和调试集成在一处(而且对非商业用途免费!)。
推荐的安装方式是通过 JetBrains Toolbox App,它还能处理更新,并让你在稳定版和抢先体验预览版之间切换。
RustRover 为 GDB 和 LLDB 提供了图形界面,这意味着我们可以沿用之前的工作流,但界面更加友好。点击行号旁的空白处设置断点,然后点击失败测试旁边的调试图标。
RustRover 调试器文档更详细地介绍了自定义配置、单步执行、监视和表达式求值!
🐀:有意思……我以为这类调试器只适用于 Python 或 Java 这类更成熟的语言。它在底层是如何工作的?
好问题!调试器背后其实有一些有趣的、Rust 特有的机制。在我与 Matthias Endler 的 Rust in Production 节目中,我解释了 RustRover 如何将源代码转换为它自己的 PSI,然后转换为带类型的高层表示,最后转换为 MIR。当我们在调试会话中求值一个 Rust 表达式或调用一个函数时,RustRover 会把它降级为 MIR,并发送给调试器,让其在暂停的进程上执行。
🐀:所以调试器实际上理解了我们要求它求值的 Rust 表达式!太棒了。
附加内容:AI 辅助调试
最近,我们开始在很多地方看到“AI 辅助”这个前缀……编程、写作、点外卖等等。于是我想,为什么不也试试用它来调试呢?
🐀:所以基本上就是让智能体替我们修复 bug?
不完全是。智能体并不能取代调试器,但它可以帮助我们理解问题并给出修复建议。我们将让智能体去调试这个问题,并用 RustRover 的调试器观察它的操作!
从 RustRover 2026.3 开始,该 IDE 集成的 MCP 服务器(模型上下文协议)可以将调试器暴露给 Codex、Claude Code 等智能体。这意味着,智能体不必再靠手动点击,而是可以为我们启动调试会话、设置断点、单步执行程序、读取变量并求值表达式。完整版本亮点请参阅 RustRover 2026.3 新特性!
只需打开设置 → 工具 → MCP 服务器,启用服务器,然后点击智能体旁边的自动配置。之后重启智能体就可以了! [LOADING...]
更多细节请参阅智能体调试文档。
MCP 连接成功后,我们可以给智能体这样一个目标:
“使用 RustRover MCP 调试并修复这个问题”
结果如下:
🐀:哦酷,你在 RustRover 里用新的 Air 插件运行 Codex,我们可以看着它运行失败的测试、设置断点、检查运行时值并修复 bug!
结论
Rust 调试并不是单一的工作流。你可以使用 println!、rust-lldb、RustRover,甚至 AI 辅助调试器。每种方式都有自己的取舍,适用于不同场景。
🐀:选择适合你的工具就好!
如果你想观看实际操作,请查看本文的视频版,录制于 Rust Berlin Meetup:
干杯!🧀