使用 rust-lldb 调试 Rust 程序

更新于 2026-01-17

Bob Matcuk 2020-01-20

这是一份快速而实用的指南,介绍如何使用 rust-lldb 调试 Rust 应用程序。

启动调试器

假设你使用 Cargo 构建可执行文件,首先会遇到的问题是:你不能直接调试 target/debug/BIN;相反,你需要调试 target/debug/deps/BIN-HASH,其中 BIN 是你的程序名称,HASH 是一个随机哈希值……在 deps 目录中可能会有很多构建产物;只需使用最新的那个(例如,运行类似 ls -lt target/debug/deps/BIN-* 的命令应该能帮你找到最新版本)。

如果你要调试的是一个示例程序(example),它们位于 target/debug/examples/BIN 下——这里没有哈希值这种麻烦事。

好了,现在你可以启动调试器了:

rust-lldb target/debug/deps/BIN-HASH -- arg1 arg2 ...

其中 arg1 arg2 ... 是你应用程序的命令行参数。如果你的应用程序不需要任何参数,可以直接省略它们。

断点(Breakpoints)

你现在已进入 lldb 调试器。在程序开始运行前,你可能希望先设置一些断点:使用 breakpoint set 命令(简写为 b)。设置断点的方式有很多种(指定具体文件和行号、函数名等)。输入 help breakpoint set 可查看相关文档。简写命令 b 实际上接受一种更简单的语法,它会自动猜测你想做什么。例如:

breakpoint set --name func
b func

这两个命令效果相同。以下命令也是如此:

breakpoint set -f src/path/to/file.rs -l linenr
b src/path/to/file.rs:linenr

运行 help b 可以查看简化语法的说明。

你可以使用 breakpoint list 查看当前所有断点列表。关于断点还有更多操作可用:参见 help breakpoint

运行程序

设置好断点后,可以使用 run(快捷键 r)启动程序。程序将一直运行,直到命中断点或程序结束(无论是正常退出还是崩溃)。

检查程序状态

好了,你的程序正在运行,并且命中了一个断点。接下来怎么办?你可能希望检查程序当前的状态,以了解发生了什么。以下是一些入门命令:

  • frame variable 会显示当前“栈帧”中的所有变量,即当前作用域内的变量。
  • expression <expr>(快捷键 expr 或直接用 p)会执行 <expr> 并显示结果。这可用于检查某个变量的值,或执行一段代码以观察其结果。
  • 你可能已经注意到,当程序首次暂停时,会显示当前代码片段,并高亮指出程序暂停所在的行。你可以通过 list(快捷键 l)重新显示这段代码。
  • n 会“单步跳过”当前行,即执行当前行后再次暂停。
  • s 会“单步进入”当前行,即进入最内层被调用的函数,并在该函数开头暂停。
  • c 会继续执行程序,直到再次命中断点或程序退出。
  • 最后,如果你正在调试与其它语言交互的程序(例如 FFI),可能需要检查特定内存地址的内容。这可以通过 x <addr> 完成,它会以十六进制转储形式显示该地址处的内存内容。

其它有用的小技巧

如果你通常通过管道向程序的标准输入传递数据(例如 cat file.txt | my-program),那么在 rust-lldb 中无法直接这样做。此时,应先用 rust-lldb my-program 启动调试器,然后运行以下命令:

settings set target.input-path <path-to-file>

结语

以上内容只是调试功能的冰山一角。lldb 功能非常强大;强烈建议你善用 help 命令来探索更多功能。但希望这份简明指南能助你顺利起步!