跳到主要内容
  1. Skills/
  2. 后端编程/

Rust With Debugger | 在 sublime text 中调试 rust 程序

··字数 2300·5 分钟
rust howto

vscode 中开发 rust 程序时,一般会安装 rust-analyzer 插件辅助开发,它自带了 调试功能

sublime text 也可以当作 rust 的代码编辑器,也有 rust-analyzer 插件,通过 package control 安装。

通过package control安装插件
通过package control安装插件

Sublime Text 的 lsp-rust-analyzer 插件注重于 lsp 支持,并不带有 debug 功能。Sublime Text 的插件库中,还有名叫 Debugger 插件,专注于将调试工具的功能引入到 Sublime Text 中,它支持多种语言的可视化调试。在 Debugger 的支持列表中,有 lldb或gdb、go、javascript、python…,但没有明确指定 rust。

其实,vscode 中的 rust-analyzer 调试 rust 代码功能是通过 lldb 来实现的 (在 macos/linux上),所以 Sublime Text 中的 Debugger 通过适配器 lldb 应该就是实现 rust debug 的途径(之所以这样说是因为在 Debugger 文档中没有直接指明 rust,网上搜索到的文章也较少,会让新手不知道如何配置,其实是支持的)。若你是 c\c++ 的熟练开发者,有悟的解释就显得非常多余,后文也没有看下去的必要。

vscode Install debugging support

下面将介绍如何在 Sublime Text 编辑器进行配置,来支持 rust 调试。

实验环境:

  • 操作系统: MacOS 13.4.1
  • Sublime Text: dev 4150
  • debugger: latest (实验时最新版本为 v0.10.1)
  • rust: 1.71.0

创建 rust 示例工程 #

先创建一个简单工程,用于后面的试验。

> cargo new debug-me
> cd debug-me
> cargo build
> ./target/debug/debug-me
> # 或者直接 cargo run

创建 rust 示例
创建 rust 示例

安装 Debugger 插件 #

通过 package control 安装 Debugger 插件。 cmd+shift+p,调出快捷命令提示窗口,输入 Install,选择 Package Control: Install PackageEnter,等待远程安装列表下载并加载完成后(速度视网络情况而定),搜索 debugger,并安装。

已安装的插件,在可安装列表中不可见。

![通过package control安装插件][package control:install debugger]

安装成功后,可通过 Debugger: Open 命令打开 Debugger UI 面板。

安装 Debugger 调试适配器 #

Debugger 支持多种语言的调试,需要通过适配器来实现。可以看成 Debugger 插件提供统一的用户界面,并负责与后端具体的调试器交互,适配器就是单独针对具体调试器的专用交互调用程序。cmd+shift+p,调出快捷命令提示框中,输入 debug install,选择命令 ·、Debugger: Install Adaptersenter

安装 debugger rust 调试适配器
安装 debugger rust 调试适配器

若此时当前目录并非 sulime project 时,Sublime Text 会提示。将当前目录保存为工程即可,保存名为 XXX.sublime-project 文件。然后重新安装适配器。在可安装的适配器列表中,选择 lldb,并enter

重新安装 debugger 适配器
重新安装 debugger 适配器

适配器安装成功后,Install Adapters 列表项前面图标由小圆圈变成小圆点。接着设置适配器调试参数。

调试配置 #

安装好适配器后,建立调试器配置,这与在 vscode 中类似的。它包含了调试启动命令、参数,启动模式等,由 Debugger 负责按照对应适应器要求的方式,帮助我们用户运行可以中断调试的进程。

添加配置的有几种方式:

  1. 通过 快捷命令 Debugger: Add Configuration 的命令创建;
  2. 通过 Debugger UI 界面创建;
  3. 在工程配置文件 XXX.sublime-project 手动添加。

方式1-通过快捷命令 Debugger: Add Configuration #

cmd+shift+p,调出 sublime text 快捷命令提示框中,输入 debug add conf,选择并 Enter

添加 lldb 配置
添加 lldb 配置

选择 lldbEnter,出现一个启动方式列表,这些选项有,

* CodeLLDB: Launch
* CodeLLDB: Attach to PID
* CodeLLDB: Attach by Name
* CodeLLDB: Custom
* CodeLLDB: Debug a Cargo Target
* CodeLLDB: Debug a Cargo Tests

选择 CodeLLDB: Launch 即可,其它的方式由你自行学习。每一种方式都文档说明,第个列表选项下面都有 document 文档超链接。

在打开的工程配置文件 *.sublime-project 中填写正确的配置

// debug-me.sublime-project
...
		{
			"type": "lldb",
			"request": "launch",
			"name": "启动调试示例",
			"program": "${folder}/target/debug/debug-me",
			"args": [],
			"cwd": "${folder}"
		},
...		

关键参数是 requestprogramm,分别表示启动类型与对应的二进制可执行程序。这里 programm 对应的是 cargo build 之后生成的二进制程序路径。

方式2-通过 Debugger UI 界面创建配置 #

若 Debugger UI 面板未打开,选择执行 cmd+shift+p,选择 Debugger: OpenEnter

在 Debugger UI 面板,点击 Add Config... 按键,会弹出 Debugger 的快捷命令提示框,Enter 即可,后续步骤与上面相同。

点击 Add Config... 按钮
点击 Add Config… 按钮

当工程存在一个或多个配置时,按钮标签会改为默认选择的配置项名称,弹出的内容是可用配置选择。

方式3-在工程配置文件 .sublime-project 中手动添加 #

通过 Debugger: Add ConfigurationDebugger UI 创建配置,最终这些信息会保存在工程配置文件 .sublime-project 文件的 debugger_configurations 项下。

打开工程配置文件 XXX.sublime-project ,它为 JSON 格式。在 debugger_configurations 项下添加对应的启动参数,若无该项,自行添加即可。

对于不同 request 类型,有不同的参数要求,具体见 CodeLLDB 文档,每一种类型都有对应文档链接。

// debug-me.sublime-project
{
	"folders": [
		{
			"path": ".",
		}
	],
	"debugger_configurations":
	[
		{
			"type": "lldb",
			"request": "launch",
			"name": "启动调试示例",
			"program": "${folder}/target/debug/debug-me",
			"args": [],
			"cwd": "${folder}"
		},
	],
}

调试功能试验 #

一、Debug 模式编译 rust 二进制程序

须注意的是,要使用中断来调试 rust 二进制程序,需要带有调试程序,这样调试时才能对应到程序代码中的断点。rust 程序使用调试模式编译,不能使用 cargo build --release

> cargo build

二、切换到 Callstack 堆栈查看器

打开 Debugger UI 面板,切换到 Callstack,查看进行时调用堆栈。因为当前未进行调试,故面板中内容是空的。

Debugger 调用堆栈
Debugger 调用堆栈

三、设置断点

main.rs 的代码行 println!("{}", lable); ,在编辑区行号前🖱️点击一下,会在该行处打上断点,右键取消断点(这在所有IDE几乎都是一样的)。或者在对应的代码行右键,在弹出的上下文菜单选择 Toggle Breakpoint 设置断点。

设置断点
设置断点

四、启动调试

启动前,先选择对应的配置,若无可选配置,先按上文《调试配置》一节中的方法创建。若有,则在选择列表中选择,也可切换。点击 Debugger UI 上的 ▶︎,启动调试。

在有断点的情况下,程序会在最近的断点处中断下来。在没有断点的情况下,程序会自动执行完毕。

启动中断调试
启动中断调试

修改代码,加入一个局部变量。

// main.rs
fn main() {
    let label: String = "hello, world".to_string();

    println!("{}", label);
}

重新编译,在当前目录执行 cargo build

还是在 println 行上打断点,再次运行,可以看到,程序被中断,局部变量 label 的值可以被探查到。

Debugger 查看本地临时变量
Debugger 查看本地临时变量

延伸 #

sublime text 中常用的 rust 插件 #

在 sublime text 中开发 rust 程序,除了 lsp-rust-analyzer 外,还有 rust-enhancedbuildrunchecktest 等一系列的命令集成进行,两者组合在一起,让 sublime text 成了 rust 的 IDE。

关于 rust 调试支持 #

更多关于 rust 开发调试支持的说明,见 Debugging support in the Rust compiler