You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
示例代码:examples/debug
工欲善其事,必先利其器。在正式开发项目,我想先简单介绍一下 Rust 常用的 debug 手段,欢迎补充。
Rust Playground
Rust Playground 是 Rust 编译器的在线网页版,用于试验该语言。提供了 crates.io 下载量最高的前 100 个 crate(一个不起眼的小知识,它的前端界面使用 React 构建)。
Rust 源代码在变成机器语言之前,会经过一系列的中间表示 (
IR: intermediate representation
) 来完成编译。查看这些中间表示,也可以帮助我们更好的理解源代码。一般需要经过以下三级HIR
、MIR
和LLVM
(简单来说就是变得越来越看不懂了):名词解释
raw source code
) 转换为抽象语法树 (AST
),主要包括词法分析 (lexing
)、解析 (parsing
)、宏扩展 (macro expansion
)、名称解析 (name resolution
)、条件编译 (conditional compilation
)、特征门检查 (feature-gate checking
) 和抽象语法树的验 (validation of the AST
)。这些任务之间并没有明确的执行顺序。High-Level Intermediate Representation
是大多数 rustc 中使用的主要 IR。它是在解析、宏扩展和名称解析之后生成的抽象语法树 (AST) 的编译器友好表示。 HIR 的许多部分都非常类似于普通 Rust 的语法,除了 Rust 中的一些表达式已被“解构 (desugaring
)”(例如:for 循环将转换为了 loop,因此在 HIR 中不会出现 for)。 这使 HIR 比普通 AST 更易于分析。Typed High-Level Intermediate Representation
以前称为 HAIR,是 rustc 使用的另一个 IR,在类型检查后生成。它(截至 2022 年 4 月)只用于 MIR 的构建和穷举性检查。还有一个在 THIR 上运行的实验性的不安全检查器,作为当前 MIR 不安全检查器的替代,可以通过向 rustc 传递-Z thir-unsafeck
标志来代替 MIR 不安全检查器。Mid-level Intermediate Representation
是由 HIR 构建的。MIR 是在 RFC 1211 中引入的。它是 Rust 的一种根本性的简化形式,用于某些流程敏感的安全检查——尤其是借用检查器! 同时也用于优化和代码生成。如果你想了解 MIR 的高层次介绍,以及它所依赖的一些编译器概念(如控制流图和解构),你可能会喜欢 rust-lang 博客中介绍 MIR 的文章。插件
cargo 插件
cargo-expand 是对 cargo 命令的扩展,可以打印出宏扩展的结果和应用于当前 crate 的
#[derive]
扩展,执行以下命令安装:编辑
src/main.rs
:执行
cargo expand
命令:VS Code 插件
LLDB 的主要调试重点是 C++ 和 Rust 语言,为此 CodeLLDB 包括用于向量、字符串、映射和其他标准库类型的内置可视化工具。这里就不做过多解释,需要使用的朋友可以查看文档,了解更多。
终端调试
在源码内使用
print!
或dbg!
会将调试信息输出在终端。print
rust print 由
std::fmt
中定义的一系列宏处理,其中包含:format!
- 将格式化文本写入字符串 (String)print!
- 格式与format!
一样,但文本打印到控制台 (io::stdout
)println!
- 格式与print!
一样,但新增了一个换行符(新起一行)eprint!
- 格式与print!
一样,但文本打印到标准错误 (io::stderr
)eprintln!
- 格式与eprint!
一样,但新增了一个换行符(新起一行)dbg!
rust dbg! 是一个非常有用的调试宏,与 print 不同的是:它会输出文件名,当前代码行号,变量名称以及变量的值。
Beta Was this translation helpful? Give feedback.
All reactions