mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-09-08 00:00:13 +02:00
tokio: improve task dump documentation (#5778)
Adds depth to the taskdump example, and documentation to Handle::dump.
This commit is contained in:
@@ -1,26 +1,36 @@
|
||||
//! Snapshots of runtime state.
|
||||
//!
|
||||
//! See [Handle::dump][crate::runtime::Handle::dump].
|
||||
|
||||
use std::fmt;
|
||||
|
||||
/// A snapshot of a runtime's state.
|
||||
///
|
||||
/// See [Handle::dump][crate::runtime::Handle::dump].
|
||||
#[derive(Debug)]
|
||||
pub struct Dump {
|
||||
tasks: Tasks,
|
||||
}
|
||||
|
||||
/// Snapshots of tasks.
|
||||
///
|
||||
/// See [Handle::dump][crate::runtime::Handle::dump].
|
||||
#[derive(Debug)]
|
||||
pub struct Tasks {
|
||||
tasks: Vec<Task>,
|
||||
}
|
||||
|
||||
/// A snapshot of a task.
|
||||
///
|
||||
/// See [Handle::dump][crate::runtime::Handle::dump].
|
||||
#[derive(Debug)]
|
||||
pub struct Task {
|
||||
trace: Trace,
|
||||
}
|
||||
|
||||
/// An execution trace of a task's last poll.
|
||||
///
|
||||
/// See [Handle::dump][crate::runtime::Handle::dump].
|
||||
#[derive(Debug)]
|
||||
pub struct Trace {
|
||||
inner: super::task::trace::Trace,
|
||||
|
||||
@@ -373,7 +373,77 @@ cfg_metrics! {
|
||||
|
||||
cfg_taskdump! {
|
||||
impl Handle {
|
||||
/// Capture a snapshot of this runtime's state.
|
||||
/// Captures a snapshot of the runtime's state.
|
||||
///
|
||||
/// This functionality is experimental, and comes with a number of
|
||||
/// requirements and limitations.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// This can be used to get call traces of each task in the runtime.
|
||||
/// Calls to `Handle::dump` should usually be enclosed in a
|
||||
/// [timeout][crate::time::timeout], so that dumping does not escalate a
|
||||
/// single blocked runtime thread into an entirely blocked runtime.
|
||||
///
|
||||
/// ```
|
||||
/// # use tokio::runtime::Runtime;
|
||||
/// # fn dox() {
|
||||
/// # let rt = Runtime::new().unwrap();
|
||||
/// # rt.spawn(async {
|
||||
/// use tokio::runtime::Handle;
|
||||
/// use tokio::time::{timeout, Duration};
|
||||
///
|
||||
/// // Inside an async block or function.
|
||||
/// let handle = Handle::current();
|
||||
/// if let Ok(dump) = timeout(Duration::from_secs(2), handle.dump()).await {
|
||||
/// for (i, task) in dump.tasks().iter().enumerate() {
|
||||
/// let trace = task.trace();
|
||||
/// println!("TASK {i}:");
|
||||
/// println!("{trace}\n");
|
||||
/// }
|
||||
/// }
|
||||
/// # });
|
||||
/// # }
|
||||
/// ```
|
||||
///
|
||||
/// # Requirements
|
||||
///
|
||||
/// ## Debug Info Must Be Available
|
||||
/// To produce task traces, the application must **not** be compiled
|
||||
/// with split debuginfo. On Linux, including debuginfo within the
|
||||
/// application binary is the (correct) default. You can further ensure
|
||||
/// this behavior with the following directive in your `Cargo.toml`:
|
||||
///
|
||||
/// ```toml
|
||||
/// [profile.*]
|
||||
/// split-debuginfo = "off"
|
||||
/// ```
|
||||
///
|
||||
/// ## Platform Requirements
|
||||
///
|
||||
/// Task dumps are supported on Linux atop x86 and x86_64.
|
||||
///
|
||||
/// ## Current Thread Runtime Requirements
|
||||
///
|
||||
/// On the `current_thread` runtime, task dumps may only be requested
|
||||
/// from *within* the context of the runtime being dumped. Do not, for
|
||||
/// example, await `Handle::dump()` on a different runtime.
|
||||
///
|
||||
/// # Limitations
|
||||
///
|
||||
/// ## Local Executors
|
||||
///
|
||||
/// Tasks managed by local executors (e.g., `FuturesUnordered` and
|
||||
/// [`LocalSet`][crate::task::LocalSet]) may not appear in task dumps.
|
||||
///
|
||||
/// ## Non-Termination When Workers Are Blocked
|
||||
///
|
||||
/// The future produced by `Handle::dump` may never produce `Ready` if
|
||||
/// another runtime worker is blocked for more than 250ms. This may
|
||||
/// occur if a dump is requested during shutdown, or if another runtime
|
||||
/// worker is infinite looping or synchronously deadlocked. For these
|
||||
/// reasons, task dumping should usually be paired with an explicit
|
||||
/// [timeout][crate::time::timeout].
|
||||
pub async fn dump(&self) -> crate::runtime::Dump {
|
||||
match &self.inner {
|
||||
scheduler::Handle::CurrentThread(handle) => handle.dump(),
|
||||
|
||||
Reference in New Issue
Block a user