#generate #tracepoints #tracing #bindings #generation #lttng-ust #semi-automatically

lttng-ust-generate

半自动生成 lttng-ust tracepoints(生成代码)

2 个版本

使用旧的 Rust 2015

0.1.1 2018年2月13日
0.1.0 2018年2月12日

#5 in #tracepoints


2 crates 中使用

MIT 许可证

35KB
636

lttng-ust-generate

为 Rust 提供 lttng-ust 的编译时支持。有关更多详细信息,请参阅根模块文档。


lib.rs:

Rust 绑定到 LTTNG-UST

此库提供了一种让 Rust 代码定义 LTTNG tracepoints 的方法。如果您的当前平台不支持 LTTNG,(即您不在 Linux 系统上),这个包可能对您来说不是很有用。然而,如果您在 Linux 上并且需要高性能跟踪和丰富的工具生态系统,那么这个包就是为您准备的!

入门

要开始,您需要将 lttng-ust-generate 添加到您的 Cargo.toml 文件的 [build-dependencies] 部分中。然后,在您的 build.rs 文件中,添加以下代码

use std::env;
use std::path::PathBuf;

use lttng_ust_generate::{Provider, Generator, CTFType, CIntegerType};

let mut provider = Provider::new("my_first_rust_provider"); // stage 1
provider.create_class("my_first_class") //stage 2
    .add_field("my_integer_field", CTFType::Integer(CIntegerType::I32))
    .add_field("my_string_field", CTFType::SequenceText)
    .instantiate("my_first_tracepoint"); // stage 3

Generator::default()
    .generated_lib_name("tracepoint_library_link_name")
    .register_provider(provider)
    .output_file_name(PathBuf::from(env::var("OUT_DIR").unwrap()).join("tracepoints.rs"))
    .generate()
    .expect("Unable to generate tracepoint bindings");

分解这个,在 lttng-ust-rs 中创建 tracepoints 主要有三个阶段。首先是创建一个提供者,我们使用上述的 Provider::new 构造函数来完成。提供者名称应全局唯一,以便在注册了多个 lttng-ust 事件的系统上识别您的特定应用程序或库。

首先,我们需要创建一个事件类。事件类描述了跟踪点事件的布局。事件可以有最多10个不同的字段。所有字段名称应在事件类内唯一。有关我们目前支持的所有类型及其如何映射到来自man 3 lttng-ustctf_*宏的列表,请参见CTFType。还需要注意的是.add_field调用的顺序,因为这些决定了生成的跟踪点函数的参数顺序。

最后,我们可以实例化我们的事件类来创建一个特定的事件。这就是lttng-usg-generate实际上发出我们可以用于代码中的跟踪点的原理。

要实际使用此处生成的跟踪点,您还需要包含所有对lttng-ust-rs运行时支持的lttng-ust crate。因此,在将lttng-ust = "0.1.0"添加到您的Cargo.toml后,在您项目的主文件中(可能是lib.rsmain.rs)添加以下内容:

import_tracepoints!(concat!(env!("OUT_DIR"), "/tracepoints.rs"), tracepoints)

虽然我们建议将此放在crate的根目录下,但宏可以在任何地方工作。注意,第一个参数将生成我们在调用生成器时使用的路径。宏的第二个参数是要放置所有跟踪点的模块的名称。

现在我们可以在代码的任何地方使用我们的跟踪点,如下所示:

tracepoints::my_first_rust_provider::my_first_tracepoint(42, "the meaning of life");

请在GitHub仓库examples目录中查看完整的用法示例。

祝您跟踪愉快!

依赖项

约7MB
约135K SLoC