#coverage #gcov #no-std

nightly no-std app cargo-minicov

为无_std和嵌入式程序提供代码覆盖率支持

3个版本

0.1.2 2020年11月13日
0.1.1 2020年4月20日
0.1.0 2020年4月20日

#1512嵌入式开发

Apache-2.0/MIT

10KB
127

minicov

Crates.io Documentation

此crate为no_std和嵌入式程序提供代码覆盖率支持。

使用方法

注意:此crate需要较新的nightly编译器(2020-04-20或更高版本)。

  1. 安装cargo-minicov工具
cargo install cargo-minicov
  1. 确保设置以下环境变量
export CARGO_INCREMENTAL=0
export RUSTFLAGS="-Zprofile -Zno-profiler-runtime -Copt-level=0 -Clink-dead-code -Coverflow-checks=off"

请注意,使用这些标志可能导致构建依赖项和proc宏无法编译。可以通过在调用cargo时明确指定目标来解决这个问题

# Fails to compile
cargo build

# Works
cargo build --target x86_64-unknown-linux-gnu
  1. minicov crate作为依赖项添加到您的程序中
[dependencies]
minicov = "0.1"
  1. (可选) LLVM生成的分析工具依赖于全局构造函数来工作。这在大多数系统上通常可以按默认设置运行。但是,如果您的程序在裸机运行,则可能需要您自己进行此操作。minicov提供了一个辅助函数来执行此操作
unsafe {
    minicov::run_static_constructors();
}

警告:请确保您的运行时没有为您执行此操作的情况下不要再次调用静态构造函数。这样做是未定义的行为,可能会导致崩溃和/或数据损坏。

  1. 在您的程序退出之前,调用minicov::capture_coverage,该函数返回一个Vec<u8>并将内容转储到文件中
fn main() {
    // ...

    let coverage = minicov::capture_coverage().unwrap();
    std::fs::write("output.minicov", coverage).unwrap();
}

如果您的程序在不同于您的构建系统的系统上运行,则需要将此文件传输回您的构建系统。

  1. 程序运行完成后,使用cargo minicov命令从捕获的覆盖率生成GCOV .gcda文件
cargo minicov output.minicov

您可以将多个输入文件传递给cargo minicov,甚至可以将多个输入文件合并为单个文件

cargo minicov a.minicov b.minicov

# Or

cat a.minicov b.minicov > combined.minicov
cargo minicov combined.minicov
  1. 使用您喜欢的GCOV兼容覆盖率工具(例如grcov)处理.gcda文件。
grcov ./target/x86_64-unknown-linux-gnu/debug/ -s . -t html --llvm --branch --ignore-not-existing -o ./target/debug/coverage/

变更日志

许可证

根据以下许可证之一授权

任选其一。

贡献

除非你明确表示,否则,根据Apache-2.0许可证定义,你有意提交的任何贡献,包括但不限于代码,均应作为上述双重许可,不附加任何额外条款或条件。

依赖项

约1.8–2.8MB
约46K SLoC