[翻译]使用Visual Studio Code怎样调试Rust

image

我将 Visual Studio Code 作为Rust首选编辑器。遗憾的是 VS Code 不能非常好地完成 Rust 的调试。

配置调试器不难,但仍然需要几个步骤。我已经完整配置了好几次。我正在写这个指南,以方便我以后查阅,而不必非要记住详细的安装步骤。

希望这个指南对老铁们也能有些帮助,要记得给我 666 啊。

安装 Rust 和 VS Code

不多废话,下面的必装。

安装 VS Code 拓展

你需要安装一个拓展,安装哪个取决于你的平台。

必要的话,你该继续安装 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 。当然,假定它们没有被编译器优化过。


image

我发现,当优化 "unused" 变量时,Rust 的编译器的处理方式比 C++ 的更激进。有时我将中间值存储给变量,仅用于调试器调试,而中间值会有缺失,这多少让我感到厌烦。

谢天谢地,Vectors 正常。我更希望未展开的 “预览” 能提供更多的信息。

image

不幸的是,其他容器类型根本无法工作。 HashMap 是无法被理解的废话。

image

Visual Studio 2017 有用于 C++ 的 Natvis 。 这些不是那么棒,会导致我有挺多抱怨的。不过说起来,总比 Rust 什么都没有的好。

image

混合调试

为了写这篇文章,我学到了新东西。我有些迫不及待的想要分享它。

彼时,我正在试用库 microprofile 。它的表现跟我的预期不太一致,所以我单步调试了一下。 令我非常惊讶的是,我调试进了封装好的 Rust 代码。更令我深感震惊的是,我还可以调试进入底层的 C++ 代码!

image

上来就是怼。无需额外配置,没有 996,你不必手动指定包含路径。

太 6 了。你可以轻松的调试引用的封装库,如果它底层依赖了 C++ 代码,你依然可以继续调试 C++ 代码。

microprofile 用起来意想不到的简单。 当浮一大白!

示例项目

我已经整理出了一个小的示例项目,预先配置好了 launch.json 。它应该可以正常运行。

  1. 运行 cargo build
  2. 打开 .vscode/ws.code-workspace
  3. 添加一个断点
  4. 选择你的调试启动配置
  5. 按 F5

示例的文件夹结构:


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!");

    // 数字类型
    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");
}

下载 :vscode_rust_example.zip

最后的一些想法

我喜欢调试器。使用 VS Code 调试 Rust 不够完美,但已经非常不错了。本篇指南有你入门开启 Rust 编程所需的一切。

示例项目应该可以在所有平台正常运行。不过,我只测试了 Windows 和 OS X 。如果某个调试步骤或者所需流程有所变化,该指南错过了它,请告诉我。

感谢阅读。

译文来源

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342