#valgrind #cargo-subcommand #cargo #memory-leaks #cli #subcommand

app cargo-valgrind

一个用于运行 valgrind 的 cargo 子命令

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日

#238Cargo 插件

Download history 466/week @ 2024-03-14 354/week @ 2024-03-21 259/week @ 2024-03-28 616/week @ 2024-04-04 433/week @ 2024-04-11 359/week @ 2024-04-18 337/week @ 2024-04-25 297/week @ 2024-05-02 342/week @ 2024-05-09 406/week @ 2024-05-16 376/week @ 2024-05-23 639/week @ 2024-05-30 784/week @ 2024-06-06 497/week @ 2024-06-13 300/week @ 2024-06-20 447/week @ 2024-06-27

2,213 每月下载量
用于 redis_rocksdb

MIT/Apache

32KB
600

cargo-valgrind

一个 cargo 子命令,运行 valgrind 并以有帮助的方式收集其输出。

Latest version Documentation

此命令扩展了 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 runcargo 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.0MIT 许可证 下授权。

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交给 cargo-valgrind 的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~1–12MB
~90K SLoC