Expand description
This crate provides code coverage support for no_std
and embedded programs.
This is done through a modified version of the LLVM profiling runtime (normally part of compiler-rt) from which all dependencies on libc have been removed.
All types of instrumentation using the LLVM profiling runtime are supported:
- Rust code coverage with
-Zinstrument-coverage
. - Rust profile-guided optimization with
-Cprofile-generate
. - Clang code coverage with
-fprofile-instr-generate -fcoverage-mapping
. - Clang profile-guided optimization with
-fprofile-instr-generate
. - Clang LLVM IR profile-guided optimization with
-fprofile-generate
.
Note that to profile both C and Rust code at the same time you must use Clang with the same LLVM version as the LLVM used by rustc.
Usage
Note: This crate requires a recent nightly compiler.
- Ensure that the following environment variables are set up:
export RUSTFLAGS="-Zinstrument-coverage -Zno-profiler-runtime"
Note that these flags also apply to build-dependencies and proc macros by default. This can be worked around by explicitly specifying a target when invoking cargo:
cargo build
cargo build --target x86_64-unknown-linux-gnu
- Add the
minicov
crate as a dependency to your program:
[dependencies]
minicov = "0.2"
- Before your program exits, call
minicov::capture_coverage
which returns aVec<u8>
and dump its contents to a file with the.profraw
extension:
fn main() {
// ...
let coverage = minicov::capture_coverage();
std::fs::write("output.profraw", coverage).unwrap();
}
If your program is running on a different system than your build system then you will need to transfer this file back to your build system.
- Use a tool such as grcov or llvm-cov to generate a human-readable coverage report:
grcov output.profraw -b ./target/debug/my_program -t html -o cov_report
Structs
Error type returned when trying to merge incompatible coverage data.
Functions
Captures the coverage data for the current program and returns it as a binary blob.
Captures the coverage data for the current program and writes it into the
provided slice. The slice must be the correct size to hold the coverage data
so call get_coverage_data_size
beforehand to ensure enough data is
allocated.
Returns the size required to store the serialized coverage data
Merges previously dumped coverage data into the coverage counters.
Resets all coverage counters in the program to zero.