2 个版本
使用旧的 Rust 2015
0.1.1 | 2018年2月13日 |
---|---|
0.1.0 | 2018年2月12日 |
#5 in #tracepoints
在 2 crates 中使用
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-ust
的ctf_*
宏的列表,请参见CTFType。还需要注意的是.add_field
调用的顺序,因为这些决定了生成的跟踪点函数的参数顺序。
最后,我们可以实例化我们的事件类来创建一个特定的事件。这就是lttng-usg-generate
实际上发出我们可以用于代码中的跟踪点的原理。
要实际使用此处生成的跟踪点,您还需要包含所有对lttng-ust-rs
运行时支持的lttng-ust
crate。因此,在将lttng-ust = "0.1.0"
添加到您的Cargo.toml
后,在您项目的主文件中(可能是lib.rs
或main.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