#线程安全 #跟踪 #过程宏 #执行 #跟踪 #日志 #函数

nightly trace2

一个用于跟踪函数执行过程的过程宏,类似于trace crate,但线程安全且使用log

1个不稳定版本

使用旧的Rust 2015

0.1.0 2018年9月11日

#744 in 过程宏

MIT 许可证

7KB

trace2

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

其功能类似于trace crate,但它线程安全且使用 log,这样你可以有更多的控制权。此外,与trace不同,你不需要声明任何静态变量。只需将trace2属性添加到你想要跟踪的部分,它就会自动工作。

用法

  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块中。

    要将trace添加到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:通过将trace2属性添加到impl块中来跟踪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