我將 Visual Studio Code 作為Rust首選編輯器。遺憾的是 VS Code 不能非常好地完成 Rust 的調試。 配置調試器不難,但仍然需要幾個步驟。我已經完整配置了好幾次。我正在寫這個指南,以方便我以後查閱,而不必非要記住詳細的安裝步驟。 希望這個指南對老鐵們也能有些幫助,要記得 ...
我將 Visual Studio Code 作為Rust首選編輯器。遺憾的是 VS Code 不能非常好地完成 Rust 的調試。
配置調試器不難,但仍然需要幾個步驟。我已經完整配置了好幾次。我正在寫這個指南,以方便我以後查閱,而不必非要記住詳細的安裝步驟。
希望這個指南對老鐵們也能有些幫助,要記得給我 666 啊。
安裝 Rust 和 VS Code
不多廢話,下麵的必裝。
安裝 VS Code 拓展
你需要安裝一個拓展,安裝哪個取決於你的平臺。
- Windows : C/C++ - Visual Studio Marketplace
- OS X / Linux :CodeLLDB - Visual Studio Marketplace
必要的話,你該繼續安裝 Rust (rls) - Visual Studio Marketplace 。
配置 VS Code
現在 VS Code 工具已經安裝完成,接下來需要配置你的 VS Code 啟動項。
點擊 調試 -> 添加配置
如果你使用的是 Windows,選擇 C++ (Windows)
如果你使用的是 Mac/Linux,選擇 LLDB: Custom Launch
添加配置應該會創建並打開啟動配置文件 launch.json
。 你必須手動修改配置項 "program" 對應的可執行文件名稱。
{
"version": "0.2.0",
"configurations": [
{
"name": "(Windows) Launch",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceRoot}/target/debug/foo.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceRoot}",
"environment": [],
"externalConsole": true
},
{
"name": "(OSX) Launch",
"type": "lldb",
"request": "launch",
"program": "${workspaceRoot}/target/debug/foo",
"args": [],
"cwd": "${workspaceRoot}",
}
]
}
上面的配置項可以複製粘貼下來。
下一步,你應該確認已經啟用斷點功能。有些讀者已經反饋說需要有這一步。 有些機器預設是啟動該功能的。
文件 -> 首選項 -> 設置
搞定!
添加一個斷點。 按 F5 鍵啟動。哇啦!
局限
使用 VS Code 可以很棒的調試 Rust ,不能說完美,但稱得上非常不錯。
基礎類型 OK 。當然,假定它們沒有被編譯器優化過。
我發現,當優化 "unused" 變數時,Rust 的編譯器的處理方式比 C++ 的更激進。有時我將中間值存儲給變數,僅用於調試器調試,而中間值會有缺失,這多少讓我感到厭煩。
謝天謝地,Vectors
正常。我更希望未展開的 “預覽” 能提供更多的信息。
不幸的是,其他容器類型根本無法工作。 HashMap
是無法被理解的廢話。
Visual Studio 2017 有用於 C++ 的 Natvis 。 這些不是那麼棒,會導致我有挺多抱怨的。不過說起來,總比 Rust 什麼都沒有的好。
混合調試
為了寫這篇文章,我學到了新東西。我有些迫不及待的想要分享它。
彼時,我正在試用庫 microprofile 。它的表現跟我的預期不太一致,所以我單步調試了一下。 令我非常驚訝的是,我調試進了封裝好的 Rust 代碼。更令我深感震驚的是,我還可以調試進入底層的 C++ 代碼!
上來就是懟。無需額外配置,沒有 996,你不必手動指定包含路徑。
太 6 了。你可以輕鬆的調試引用的封裝庫,如果它底層依賴了 C++ 代碼,你依然可以繼續調試 C++ 代碼。
microprofile 用起來意想不到的簡單。 當浮一大白!
示例項目
我已經整理出了一個小的示例項目,預先配置好了 launch.json 。它應該可以正常運行。
- 運行 cargo build
- 打開 .vscode/ws.code-workspace
- 添加一個斷點
- 選擇你的調試啟動配置
- 按 F5
示例的文件夾結構:
Cargo.toml
[package]
name = "vscode_debug_example"
version = "0.1.0"
authors = ["Forrest Smith <[email protected]>"]
edition = "2018"
[dependencies]
microprofile = "0.0.2"
rand = "0.6.5"
src/main.rs
use rand::*;
use std::collections::HashMap;
#[macro_use]
extern crate microprofile;
fn some_test_func() -> i32 {
let mut sorted_nums = vec![5, 2, 6, 4, 3, 1];
sorted_nums.sort();
let result = sorted_nums.iter().sum();
result
}
fn some_func() {
another_func();
}
fn another_func() {
one_more_func();
}
fn one_more_func() {
microprofile::shutdown();
}
#[allow(unused)]
fn main() {
// Hello
println!("Hello, world!");
// 數字類型
let mut i = 5;
i += 3;
let f: f32 = 42.0;
// 字元串類型
let s = "SomeString";
let t = "SomeOtherString";
let mut u: String = "The".to_string();
u.push_str("ThirdString");
// Vec; 運行很好!
let nums = vec![1, 2, 3, 4, 5];
// HashMap; 運行效果不佳 :(
let mut map = HashMap::<String, String>::new();
map.insert("some_key".to_string(), "some_value".to_string());
map.insert("some_other_key".to_string(), "some_other_value".to_string());
// 調試進入 random 包
let x: u8 = random();
let y = random::<f64>();
// 配置調試 (C++)
microprofile::init();
{
microprofile::scope!("group", "test");
let result = some_test_func();
}
some_func();
//microprofile::shutdown();
// Goodbye
println!("Goodbye cruel world");
}
最後的一些想法
我喜歡調試器。使用 VS Code 調試 Rust 不夠完美,但已經非常不錯了。本篇指南有你入門開啟 Rust 編程所需的一切。
示例項目應該可以在所有平臺正常運行。不過,我只測試了 Windows 和 OS X 。如果某個調試步驟或者所需流程有所變化,該指南錯過了它,請告訴我。
感謝閱讀。
譯文來源
翻譯自:How to Debug Rust with Visual Studio Code