Rust With Debugger | 在 sublime text 中调试 rust 程序
目录
在 vscode 中开发 rust 程序时,一般会安装 rust-analyzer 插件辅助开发,它自带了 调试功能 。
sublime text 也可以当作 rust 的代码编辑器,也有 rust-analyzer 插件,通过 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
- Microsoft C++ (ms-vscode.cpptools) – on Windows
- CodeLLDB (vadimcn.vscode-lldb) – on macOS/Linux
下面将介绍如何在 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
安装 Debugger 插件 #
通过 package control 安装 Debugger 插件。 cmd+shift+p,调出快捷命令提示窗口,输入 Install
,选择 Package Control: Install Package
并 Enter,等待远程安装列表下载并加载完成后(速度视网络情况而定),搜索 debugger
,并安装。
已安装的插件,在可安装列表中不可见。
![通过package control安装插件][package control:install debugger]
安装成功后,可通过 Debugger: Open
命令打开 Debugger UI 面板。
安装 Debugger 调试适配器 #
Debugger 支持多种语言的调试,需要通过适配器来实现。可以看成 Debugger 插件提供统一的用户界面,并负责与后端具体的调试器交互,适配器就是单独针对具体调试器的专用交互调用程序。cmd+shift+p,调出快捷命令提示框中,输入 debug install
,选择命令 ·、Debugger: Install Adapters
并 enter。
若此时当前目录并非 sulime project 时,Sublime Text 会提示。将当前目录保存为工程即可,保存名为 XXX.sublime-project 文件。然后重新安装适配器。在可安装的适配器列表中,选择 lldb
,并enter。
适配器安装成功后,Install Adapters
列表项前面图标由小圆圈变成小圆点。接着设置适配器调试参数。
调试配置 #
安装好适配器后,建立调试器配置,这与在 vscode 中类似的。它包含了调试启动命令、参数,启动模式等,由 Debugger 负责按照对应适应器要求的方式,帮助我们用户运行可以中断调试的进程。
添加配置的有几种方式:
- 通过 快捷命令
Debugger: Add Configuration
的命令创建; - 通过 Debugger UI 界面创建;
- 在工程配置文件
XXX.sublime-project
手动添加。
方式1-通过快捷命令 Debugger: Add Configuration
#
cmd+shift+p,调出 sublime text 快捷命令提示框中,输入 debug add conf,选择并 Enter。
选择 lldb
并Enter,出现一个启动方式列表,这些选项有,
* 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}"
},
...
关键参数是 request
和 programm
,分别表示启动类型与对应的二进制可执行程序。这里 programm
对应的是 cargo build
之后生成的二进制程序路径。
方式2-通过 Debugger UI 界面创建配置 #
若 Debugger UI 面板未打开,选择执行 cmd+shift+p,选择
Debugger: Open
并 Enter。
在 Debugger UI 面板,点击 Add Config...
按键,会弹出 Debugger
的快捷命令提示框,Enter 即可,后续步骤与上面相同。
当工程存在一个或多个配置时,按钮标签会改为默认选择的配置项名称,弹出的内容是可用配置选择。
方式3-在工程配置文件 .sublime-project
中手动添加 #
通过 Debugger: Add Configuration
和 Debugger 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
,查看进行时调用堆栈。因为当前未进行调试,故面板中内容是空的。
三、设置断点
在 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
的值可以被探查到。
延伸 #
sublime text 中常用的 rust 插件 #
在 sublime text 中开发 rust 程序,除了 lsp-rust-analyzer
外,还有 rust-enhanced
将 build
、run
、check
、test
等一系列的命令集成进行,两者组合在一起,让 sublime text 成了 rust 的 IDE。
关于 rust 调试支持 #
更多关于 rust 开发调试支持的说明,见 Debugging support in the Rust compiler