#tracers #probe #dtrace #probing #api #underneath #system-tap

sys tracers-dyn-stap

使用 libstapsdt 实现动态探测API,它又使用 Linux SystemTap。不要直接使用此crate。始终使用 tracers crate,并让它自动检测要使用哪种实现。

1 个不稳定发布

0.1.0 2019年11月20日

#8 in #tracers


用于 tracers

MIT/Apache 和可能 LGPL-3.0-or-later

93KB
1.5K SLoC

Rust 1.5K SLoC // 0.0% comments C 239 SLoC // 0.1% comments Python 33 SLoC // 0.4% comments GNU Style Assembly 2 SLoC Shell 1 SLoC

tracers - Rust插桩库

Crates.io Azure Build Status - Linux/macOS/Windows Cirrus CI - FreeBSD

摘要

tracers 旨在成为一个易于使用且跨平台的Rust crate,它使得向Rust程序中添加高性能低开销的探测变得简单。在底层,它将使用每个平台的本地探测机制,例如Linux上的System Tap、BSD上的DTrace和Windows上的ETW。那些没有支持探测机制的平台将回退到无操作实现。

这个crate的关键目标是在任何Rust项目中使用它,在合适的地方创建和触发探测,并始终保留这些探测。当探测在编译时被禁用时,应该没有运行时影响,当探测被编译但在运行时未启用时,探测影响不应超过一两个CPU指令。

状态

重要tracers 仍然是实验性的。作者正在内部使用它,但这个crate尚未被广泛使用,可能包含微妙且关键的缺陷。

快速入门

在您的 Cargo.toml 中需要添加

[dependencies]
...
tracers = "0.1.0"
tracers-macros = "0.1.0"

[build-dependencies]
...
tracers-build = "0.1.0"

重要的是不要忘记将 tracers-build 添加到您的 build-dependencies 中,因为您需要在构建时使用它进行下一步,即如果您还没有,创建一个 src/build.rs 文件,并确保它包含以下内容

use tracers_build::build;

fn main() {
build();
}

如果您已经有了 build.rs,您需要确保在 main 函数中某个位置添加对 tracers_build::build() 的调用,最好是在早期。

到此为止,您已经拥有了定义tracer所需的所有东西。这里有一个简单的例子

use tracers_macros::{probe, tracer};

#[tracer]
trait SimpleProbes {
fn hello(who: &str);
fn greeting(greeting: &str, name: &str);
fn optional_greeting(greeting: &str, name: &Option<&str>);
}

fn main() {
loop {
    probe!(SimpleProbes::hello("world"));
    probe!(SimpleProbes::greeting("hello", "world"));
    let name = Some("world");
    probe!(SimpleProbes::optional_greeting("hello", &name));
    let name: Option<&str> = None;
    probe!(SimpleProbes::optional_greeting("hello", &name));
}
}

您已经定义了三个探测,hellogreetingoptional_greeting。默认情况下,在编译时禁用跟踪,所以当您运行此代码时,所有的探测基础设施都将被优化掉,您将留下零运行时开销。

要实际启用探测,您需要在 tracers 包中激活相应的功能之一。例如,在您的 Cargo.toml

[dependencies]
...
tracers = { version = "0.1.0", features = [ "force_static_stap"]

将启用 SystemTap 探测。如果您再次重新构建并使用来自 BCCtplist 工具,应该能够在二进制文件中看到探测。

请注意,#[tracers] 宏会为您生成的 trait 生成一些有用的文档。尝试使用 cargo doc 并在文档中查找您的 trait,以获取有关如何使用每个探测的额外提示。

examples/ 目录包含一些简单的示例。

平台

tracers 包和运行时组件应在任何受支持的 Rust 平台上编译和运行(尽管目前还不支持 no_std)。将 tracers 添加为依赖项不应破坏任何平台上的项目;如果确实如此,则是一个错误,并鼓励您在 GitHub 上打开一个问题。

话虽如此,tracers 包默认实际上并不进行任何追踪;它编译为空。要实际启用追踪,需要一个受支持的平台。截至本文撰写之时,这意味着

  • Linux with System Tap(具有 force_static_stap 功能)
  • Linux with LTT-ng(具有 force_static_lttng 功能)

目前正在努力支持以下平台

  • Windows(具有 Windows 系统API的事件追踪)
  • FreeBSD 和 macOS(具有 DTrace)

许可证

除非另有说明,否则本项目根据您的选择采用以下任一许可证

进行选择。

然而,以下 -sys 包具有与其封装的第三方代码对应的许可证

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交给 tracers 的任何有意贡献都应如上所述双许可,没有其他条款或条件。

发布

本节仅适用于维护者。

要发布新版本,必须首先发布依赖项。bin/publish.sh 脚本有助于自动化过程,但过程仍然相当手动。

发布流程

  1. 将所有包及其对其他 tracers 包的依赖项的 version 属性更新为新目标版本。

  2. 确保所有依赖项都既有用于本地开发的路径依赖,又有用于发布的版本依赖。这些必须与新发布的版本保持一致。

  3. 更新 documentation 链接以反映当前版本。

必须按以下顺序发布包

  • tracers-core
  • tracers-libelf-sys
  • tracers-libstapsdt-sys
  • tracers-codegen
  • tracers-macros-hack
  • tracers-macros
  • tracers-dyn-stap
  • tracers-dyn-noop
  • tracers-build
  • tracers

依赖项

~1.8–3.5MB
~66K SLoC