MST

星途 面试题库

面试题:Rust 中调试并发程序的基础技巧

在 Rust 编写的并发程序中,当出现线程间数据竞争导致程序崩溃时,你会使用哪些基本的调试工具和方法来定位问题?请至少列举两种工具,并简述使用步骤。
22.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

1. Rust 内置的 RUST_BACKTRACE 环境变量

  1. 使用步骤: 在运行程序时设置 RUST_BACKTRACE=1 环境变量。例如在 Unix - 类系统(Linux、macOS)的终端中,运行命令 RUST_BACKTRACE=1 cargo run。在 Windows 系统中,可以在命令提示符下使用 set RUST_BACKTRACE=1 && cargo run,或者在 PowerShell 中使用 $env:RUST_BACKTRACE = 1; cargo run。这样程序崩溃时会打印出详细的调用栈信息,通过分析调用栈,能够了解程序执行到哪里出现了问题,帮助定位到可能存在数据竞争的代码位置。

2. thread - sanitizer(TSan)

  1. 安装: 确保你的 Rust 工具链安装了 llvm 组件,因为 thread - sanitizer 依赖于 LLVM。可以使用 rustup component add llvm-tools-preview 命令安装。
  2. 编译运行: 使用 RUSTFLAGS="-Z sanitizer=thread" 编译程序。例如 RUSTFLAGS="-Z sanitizer=thread" cargo build。运行编译后的程序,thread - sanitizer 会检测到线程间的数据竞争,并输出详细的报告,包括竞争发生的位置、涉及的线程等信息,帮助开发者准确定位数据竞争问题。

3. miri

  1. 安装: 使用 rustup toolchain install nightly 安装 Rust nightly 版本,因为 miri 目前只在 nightly 版本中可用。然后使用 rustup component add miri --toolchain nightly 安装 miri 组件。
  2. 运行: 使用 cargo +nightly miri run 运行程序。miri 是 Rust 的内存安全检查器,它会模拟程序执行,检测出数据竞争等内存和并发相关的错误,并给出详细的错误信息和位置,帮助开发者定位问题。