#proc-macro #trace #tracing #control #logging #real #trace2

trace2_macro

trace2的真实过程宏实现

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2018年9月11日

#57#real


用于 trace2

MIT 许可证

18KB
369 行代码(不含注释)

trace2

一个用于跟踪Rust语言中函数执行的进程宏(nightly版本)。

功能类似于trace crate,但它是线程安全的,并使用log,以便您可以有更多的控制。此外,与trace不同,您不需要声明任何静态变量。只需添加属性到您想要跟踪的部分即可 它就正常工作™

用法

  1. 将依赖项添加到您的Cargo.toml

    trace2 = "0.1"
    
  2. 导入crate

    #![feature(use_extern_macros)]   // Not needed if your rustc is recent enough.
    extern crate trace2;
    
  3. #[::trace2::trace2]属性添加到函数、impl块或mod块中。

    向mod添加跟踪需要启用proc_macro_mod功能的最新Rust nightly编译器。

示例

跟踪特定函数

examples/basic.rs:通过向函数添加trace2属性来跟踪指定函数。

#![feature(use_extern_macros)]
#![feature(proc_macro_path_invoc)]

extern crate trace2;
#[macro_use]
extern crate log;
extern crate env_logger;

#[::trace2::trace2]
fn foo(a: i32, b: i32) {
    println!("I'm in foo!");
    bar((a, b));
}

#[::trace2::trace2]
fn bar((a, b): (i32, i32)) -> i32 {
    println!("I'm in bar!");
    if a == 1 {
        2
    } else {
        b
    }
}

fn main() {
    env_logger::Builder::from_default_env()
        .default_format_module_path(false)
        .init();

    foo(1, 2);
}

输出

TRACE 2018-09-06T17:06:54Z: >>>> basic::foo(a: 1, b: 2)
I'm in foo!
TRACE 2018-09-06T17:06:54Z: >>>>>>>> basic::bar(a: 1, b: 2)
I'm in bar!
TRACE 2018-09-06T17:06:54Z: <<<<<<<< basic::bar = 2
TRACE 2018-09-06T17:06:54Z: <<<< basic::foo = ()

跟踪整个impl块

examples/impl_level.rs:通过向impl块添加trace2属性来跟踪impl块中的所有函数。

#![feature(use_extern_macros)]
#![feature(proc_macro_path_invoc)]

extern crate trace2;
#[macro_use]
extern crate log;
extern crate env_logger;

struct Foo;

#[trace2::trace2]
impl Foo {
    fn foo(b: i32) -> i32 {
        b
    }

    fn bar(&self, a: i32) -> i32 {
        a
    }

    fn boz(&self, a: i32) -> i32 {
        self.bar(a)
    }
}

fn main() {
    env_logger::Builder::from_default_env()
        .default_format_module_path(false)
        .init();

    let foo = Foo;
    Foo::foo(2);
    foo.bar(7);
    foo.boz(13);
}

输出

TRACE 2018-09-11T07:05:59Z: >>>> impl_level::Foo::foo(b: 2)
TRACE 2018-09-11T07:05:59Z: <<<< impl_level::Foo::foo = 2
TRACE 2018-09-11T07:05:59Z: >>>> impl_level::Foo::bar(a: 7)
TRACE 2018-09-11T07:05:59Z: <<<< impl_level::Foo::bar = 7
TRACE 2018-09-11T07:05:59Z: >>>> impl_level::Foo::boz(a: 13)
TRACE 2018-09-11T07:05:59Z: >>>>>>>> impl_level::Foo::bar(a: 13)
TRACE 2018-09-11T07:05:59Z: <<<<<<<< impl_level::Foo::bar = 13
TRACE 2018-09-11T07:05:59Z: <<<< impl_level::Foo::boz = 13

examples目录中查看更多示例。

待办事项

  • 支持输出嵌套跟踪属性的impl类型
  • 支持暂停

许可证

MIT

依赖项

~2MB
~47K SLoC