9 个版本

0.2.7 2024 年 2 月 19 日
0.2.6 2023 年 6 月 21 日
0.2.5 2023 年 4 月 13 日
0.2.4 2023 年 3 月 28 日
0.0.1 2022 年 9 月 15 日

112调试 中排名

Download history 4370/week @ 2024-03-14 3441/week @ 2024-03-21 3914/week @ 2024-03-28 4952/week @ 2024-04-04 4779/week @ 2024-04-11 5467/week @ 2024-04-18 5340/week @ 2024-04-25 5032/week @ 2024-05-02 4454/week @ 2024-05-09 5099/week @ 2024-05-16 4167/week @ 2024-05-23 5265/week @ 2024-05-30 4200/week @ 2024-06-06 4327/week @ 2024-06-13 4291/week @ 2024-06-20 3220/week @ 2024-06-27

每月 16,959 次下载
用于 8 crate(5 个直接使用)

MIT 许可证

51KB
776 代码行

async-backtrace

异步函数的效率、逻辑 'stack trace'。

使用方法

要使用,用 #[async_backtrace::framed] 注释你的异步函数,例如

#[tokio::main]
async fn main() {
    tokio::select! {
        _ = tokio::spawn(async_backtrace::frame!(pending())) => {}
        _ = foo() => {}
    };
}

#[async_backtrace::framed]
async fn pending() {
    std::future::pending::<()>().await
}

#[async_backtrace::framed]
async fn foo() {
    bar().await;
}

#[async_backtrace::framed]
async fn bar() {
    futures::join!(fiz(), buz());
}

#[async_backtrace::framed]
async fn fiz() {
    tokio::task::yield_now().await;
}

#[async_backtrace::framed]
async fn buz() {
    println!("{}", baz().await);
}

#[async_backtrace::framed]
async fn baz() -> String {
    async_backtrace::taskdump_tree(true)
}

此示例程序将打印类似以下内容

taskdump::foo::{{closure}} at backtrace/examples/taskdump.rs:20:1
  └╼ taskdump::bar::{{closure}} at backtrace/examples/taskdump.rs:25:1
     ├╼ taskdump::buz::{{closure}} at backtrace/examples/taskdump.rs:35:1
     │  └╼ taskdump::baz::{{closure}} at backtrace/examples/taskdump.rs:40:1
     └╼ taskdump::fiz::{{closure}} at backtrace/examples/taskdump.rs:30:1taskdump::pending::{{closure}} at backtrace/examples/taskdump.rs:15:1

最小化开销

为了最小化开销,请确保您在异步运行时创建的未来使用 #[framed] 标记。

换句话说,避免这样做

tokio::spawn(async {
    foo().await;
    bar().await;
}).await;

#[async_backtrace::framed] async fn foo() {}
#[async_backtrace::framed] async fn bar() {}

...而应该这样做

tokio::spawn(async_backtrace::location!().frame(async {
    foo().await;
    bar().await;
})).await;

#[async_backtrace::framed] async fn foo() {}
#[async_backtrace::framed] async fn bar() {}

估计开销

要估计在您的应用程序中采用 #[framed] 的开销,请参考 ./backtrace/benches/frame_overhead.rs 中的基准测试和解释性指南。您可以使用 cargo bench 运行这些基准测试。

许可证

该项目采用 MIT 许可证

贡献

除非您明确表示,否则您提交给 async-backtrace 的任何贡献,均应按照 MIT 许可证进行许可,不附加任何其他条款或条件。

依赖项

~2–29MB
~381K SLoC