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 在 调试 中排名
每月 16,959 次下载
用于 8 个 crate(5 个直接使用)
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:1
╼ taskdump::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