Capture scoped backtraces.
Use Trace::root
to define the upper unwinding bound of an execution
trace, and Trace::leaf
to define its lower bounds (the points at which
backtraces are collected). The resulting traces are trees, since a single
invocation of Trace::root
may have multiple sub-invocations of
Trace::leaf
.
For example, running this program:
use scoped_trace::Trace;
fn main() {
let (_, trace) = Trace::root(|| foo());
println!("{trace}");
}
fn foo() {
bar();
baz();
}
fn bar() {
Trace::leaf();
}
fn baz() {
Trace::leaf();
}
...will produce an output like:
╼ inlining::main::{{closure}} at example.rs:4:38
├╼ inlining::foo at example.rs:9:5
│ └╼ inlining::bar at example.rs:14:5
└╼ inlining::foo at example.rs:10:5
└╼ inlining::baz at example.rs:18:5
This project is licensed under the Apache License, Version 2.0, or the MIT license, at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in scoped-trace by you, shall be licensed as MIT and Apache 2.0, without any additional terms or conditions.