13 个稳定版本
2.1.0 | 2022年7月28日 |
---|---|
2.0.3 | 2022年2月24日 |
2.0.1 | 2021年3月31日 |
1.3.0 | 2019年11月30日 |
1.2.0 | 2019年8月26日 |
#238 在 Cargo 插件 中
2,213 每月下载量
用于 redis_rocksdb
32KB
600 行
cargo-valgrind
一个 cargo 子命令,运行 valgrind 并以有帮助的方式收集其输出。
此命令扩展了 cargo 的功能,可以直接在任意的 crate 可执行文件上运行 valgrind
。然后使用 valgrind 的输出将二进制文件标记为通过/失败。
此命令对于普通 Rust 程序通常是不必要的,特别是如果你只使用安全的 Rust 代码。但如果你做 FFI 相关的事情(无论是通过简单使用 FFI 绑定 crate 还是因为你正在开发这样的 FFI 绑定的安全包装),检查 FFI 边界处的内存使用是否正确可能会非常有帮助。
用法
一个典型的错误是
use std::ffi::CString;
use std::os::raw::c_char;
extern "C" {
fn puts(s: *const c_char);
}
fn main() {
let string = CString::new("Test").unwrap();
let ptr = string.into_raw();
unsafe { puts(ptr) };
// unsafe { CString::from_raw(ptr) };
}
变量 string
的内存永远不会被释放。如果你在 shell 中运行 cargo valgrind run
,它将检测到泄漏
$ cargo valgrind run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/cstring`
Test
Error Leaked 5 bytes
Info at realloc (vg_replace_malloc.c:826)
at realloc (alloc.rs:125)
at realloc (alloc.rs:184)
at reserve_internal<u8,alloc::alloc::Global> (raw_vec.rs:666)
at reserve_exact<u8,alloc::alloc::Global> (raw_vec.rs:411)
at reserve_exact<u8> (vec.rs:482)
at std::ffi::c_str::CString::from_vec_unchecked (c_str.rs:355)
at std::ffi::c_str::CString::_new (c_str.rs:330)
at std::ffi::c_str::CString::new (c_str.rs:324)
at cstring::main (main.rs:9)
at std::rt::lang_start::{{closure}} (rt.rs:64)
at {{closure}} (rt.rs:49)
at std::panicking::try::do_call (panicking.rs:293)
at __rust_maybe_catch_panic (lib.rs:85)
at try<i32,closure> (panicking.rs:272)
at catch_unwind<closure,i32> (panic.rs:394)
at std::rt::lang_start_internal (rt.rs:48)
at std::rt::lang_start (rt.rs:64)
at main
Summary Leaked 5 B total
取消注释 unsafe { CString::from_raw(ptr) };
重新获取内存并正确释放它。 cargo valgrind run
将为你编译二进制文件,并且不会检测到泄漏,因为没有泄漏了。
如果你想向 valgrind 传递标志(例如运行一个不同的子工具),你可以将 VALGRINDFLAGS
环境变量设置为一个由空格分隔的有效 Valgrind 选项列表。
注意:使用 cargo-valgrind
1.x 版本的用户需要注意命令行发生了变化。之前有一个 cargo valgrind
子命令,它取代了 cargo run
或 cargo test
命令。现在命令行是 cargo valgrind <command>
,其中 <command>
可以是任何正常的 cargo 子命令。
安装
需求
您需要安装 valgrind
并将其添加到 PATH
中(您可以在 shell 中运行 valgrind --help
来测试)。
您还需要安装 cargo
并将其添加到 PATH
中,但由于这是一个 cargo 子命令,您几乎肯定已经安装了它。
安装二进制文件
运行以下命令从 crates.io 安装
$ cargo install cargo-valgrind
这将安装最新的官方发布版本。
如果您想使用尚未发布到 crates.io
的最新更改,您可以按以下方式从 git 存储库安装二进制文件
$ cargo install --git https://github.com/jfrimmel/cargo-valgrind
许可证
根据您的选择,在 Apache License, Version 2.0 或 MIT 许可证 下授权。
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给 cargo-valgrind
的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~1–12MB
~90K SLoC