[翻譯]使用Visual Studio Code怎樣調(diào)試Rust

image

我將 Visual Studio Code 作為Rust首選編輯器。遺憾的是 VS Code 不能非常好地完成 Rust 的調(diào)試。

配置調(diào)試器不難,但仍然需要幾個(gè)步驟。我已經(jīng)完整配置了好幾次。我正在寫這個(gè)指南,以方便我以后查閱,而不必非要記住詳細(xì)的安裝步驟。

希望這個(gè)指南對(duì)老鐵們也能有些幫助,要記得給我 666 啊。

安裝 Rust 和 VS Code

不多廢話,下面的必裝。

安裝 VS Code 拓展

你需要安裝一個(gè)拓展,安裝哪個(gè)取決于你的平臺(tái)。

必要的話,你該繼續(xù)安裝 Rust (rls) - Visual Studio Marketplace 。

配置 VS Code

現(xiàn)在 VS Code 工具已經(jīng)安裝完成,接下來需要配置你的 VS Code 啟動(dòng)項(xiàng)。

點(diǎn)擊 調(diào)試 -> 添加配置
如果你使用的是 Windows,選擇 C++ (Windows)
如果你使用的是 Mac/Linux,選擇 LLDB: Custom Launch

添加配置應(yīng)該會(huì)創(chuàng)建并打開啟動(dòng)配置文件 launch.json 。 你必須手動(dòng)修改配置項(xiàng) "program" 對(duì)應(yīng)的可執(zhí)行文件名稱。

{
    "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}",
        }
    ]
}

上面的配置項(xiàng)可以復(fù)制粘貼下來。

下一步,你應(yīng)該確認(rèn)已經(jīng)啟用斷點(diǎn)功能。有些讀者已經(jīng)反饋說需要有這一步。 有些機(jī)器默認(rèn)是啟動(dòng)該功能的。

文件 -> 首選項(xiàng) -> 設(shè)置

搞定!

添加一個(gè)斷點(diǎn)。 按 F5 鍵啟動(dòng)。哇啦!

局限

使用 VS Code 可以很棒的調(diào)試 Rust ,不能說完美,但稱得上非常不錯(cuò)。

基礎(chǔ)類型 OK 。當(dāng)然,假定它們沒有被編譯器優(yōu)化過。


image

我發(fā)現(xiàn),當(dāng)優(yōu)化 "unused" 變量時(shí),Rust 的編譯器的處理方式比 C++ 的更激進(jìn)。有時(shí)我將中間值存儲(chǔ)給變量,僅用于調(diào)試器調(diào)試,而中間值會(huì)有缺失,這多少讓我感到厭煩。

謝天謝地,Vectors 正常。我更希望未展開的 “預(yù)覽” 能提供更多的信息。

image

不幸的是,其他容器類型根本無(wú)法工作。 HashMap 是無(wú)法被理解的廢話。

image

Visual Studio 2017 有用于 C++ 的 Natvis 。 這些不是那么棒,會(huì)導(dǎo)致我有挺多抱怨的。不過說起來,總比 Rust 什么都沒有的好。

image

混合調(diào)試

為了寫這篇文章,我學(xué)到了新東西。我有些迫不及待的想要分享它。

彼時(shí),我正在試用庫(kù) microprofile 。它的表現(xiàn)跟我的預(yù)期不太一致,所以我單步調(diào)試了一下。 令我非常驚訝的是,我調(diào)試進(jìn)了封裝好的 Rust 代碼。更令我深感震驚的是,我還可以調(diào)試進(jìn)入底層的 C++ 代碼!

image

上來就是懟。無(wú)需額外配置,沒有 996,你不必手動(dòng)指定包含路徑。

太 6 了。你可以輕松的調(diào)試引用的封裝庫(kù),如果它底層依賴了 C++ 代碼,你依然可以繼續(xù)調(diào)試 C++ 代碼。

microprofile 用起來意想不到的簡(jiǎn)單。 當(dāng)浮一大白!

示例項(xiàng)目

我已經(jīng)整理出了一個(gè)小的示例項(xiàng)目,預(yù)先配置好了 launch.json 。它應(yīng)該可以正常運(yùn)行。

  1. 運(yùn)行 cargo build
  2. 打開 .vscode/ws.code-workspace
  3. 添加一個(gè)斷點(diǎn)
  4. 選擇你的調(diào)試啟動(dòng)配置
  5. 按 F5

示例的文件夾結(jié)構(gòu):


image

Cargo.toml

[package]
name = "vscode_debug_example"
version = "0.1.0"
authors = ["Forrest Smith <forrestthewoods@gmail.com>"]
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!");

    // 數(shù)字類型
    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; 運(yùn)行很好!
    let nums = vec![1, 2, 3, 4, 5];

    // HashMap; 運(yùn)行效果不佳 :(
    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());

    // 調(diào)試進(jìn)入 random 包
    let x: u8 = random();
    let y = random::<f64>();

    // 配置調(diào)試 (C++)
    microprofile::init();
    {
        microprofile::scope!("group", "test");
        let result = some_test_func();
    }
    some_func();
    //microprofile::shutdown();

    // Goodbye
    println!("Goodbye cruel world");
}

下載 :vscode_rust_example.zip

最后的一些想法

我喜歡調(diào)試器。使用 VS Code 調(diào)試 Rust 不夠完美,但已經(jīng)非常不錯(cuò)了。本篇指南有你入門開啟 Rust 編程所需的一切。

示例項(xiàng)目應(yīng)該可以在所有平臺(tái)正常運(yùn)行。不過,我只測(cè)試了 Windows 和 OS X 。如果某個(gè)調(diào)試步驟或者所需流程有所變化,該指南錯(cuò)過了它,請(qǐng)告訴我。

感謝閱讀。

譯文來源

翻譯自:How to Debug Rust with Visual Studio Code

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容