Структура Trace
pub struct Trace { /* private fields */ }
tokio_unstable и Linux, при включённых возможностях crate rt и crate taskdump, а также на (AArch64 или s390x или x86 или x86-64).Трассировка выполнения последнего опроса задачи.
Разрешение обратной трассировки — через реализацию Display или через resolve_backtraces — разбирает отладочную информацию, что может быть ресурсоёмкой для процессора операцией и занимать довольно много времени, зависящего от платформы; часто это более 100 миллисекунд, особенно если исполняемый файл текущего процесса велик. В некоторых случаях платформа может кэшировать часть отладочной информации внутри себя, поэтому последующие вызовы resolve_backtraces могут выполняться быстрее первого, но все гарантии зависят от платформы.
Чтобы не блокировать среду выполнения, рекомендуется разрешать обратные трассировки внутри spawn_blocking() и использовать механизм ограничения параллелизма, чтобы избежать неожиданного снижения производительности.
См. Handle::dump.
Реализации
impl Trace
pub fn resolve_backtraces(&self) -> Vec<Backtrace>
Разрешает и возвращает список обратных трассировок, связанных с опросами в этой трассировке.
Точный набор включённых сюда обратных трассировок не гарантирован и может измениться в будущем, но можно ожидать по одному элементу Backtrace для каждого вызова poll нижнеуровневой будущей задачи Tokio; поэтому, если используется что-то вроде join!, для каждой будущей задачи в объединении будет своя обратная трассировка.
pub fn capture<F, R>(f: F) -> (R, Trace)where F: FnOnce() -> R,
Выполняет функцию f в режиме трассировки и возвращает её результат вместе с полученной Trace.
Обычно в качестве f передают функцию опроса будущей задачи; возвращённая обратная трассировка покажет, чем занимается эта будущая задача.
Используйте вместо этого Handle::dump, если хотите узнать, чем заняты все задачи вашей программы. Дополнительные сведения о дампах см. также в Handle::dump; однако, в отличие от Handle::dump, эта функция не должна быть намного медленнее прямого вызова f.
Из-за особенностей реализации трассировки конечные будущие задачи Tokio обычно вместо выполнения своей фактической работы возвращают Poll::Pending, не регистрируя пробуждатель задачи ни в одном драйвере. Это означает, что выполнение, вероятно, не будет продвигаться, если в итоге не вызвать будущую задачу вне capture или явно не запланировать задачу повторно (например, вызвав cx.waker().wake_by_ref()) после возврата capture.
Пример использования:
use std::future::Future;
use std::task::Poll;
use tokio::runtime::dump::Trace;
// some future
let mut test_future = std::pin::pin!(async move { tokio::task::yield_now().await; 0 });
// trace it once, see what it's doing
let (trace, res) = Trace::root(std::future::poll_fn(|cx| {
let (res, trace) = Trace::capture(|| test_future.as_mut().poll(cx));
Poll::Ready((trace, res))
})).await;
// await it to let it finish, outside of a `capture`
let output = match res {
Poll::Ready(output) => output,
Poll::Pending => test_future.await,
};
println!("{trace}");Вложенные вызовы
Вложенные вызовы capture могут возвращать частичные трассировки, но не приведут к другому нежелательному поведению (например, не вызовут панику).
pub fn root<F>(f: F) -> Root<F> ⓘwhere F: Future,
Создаёт корень для стековых трассировок, полученных с помощью Trace::capture. Кадры стека выше корня не будут захвачены.
Допускается вкладывать несколько будущих задач Root. Захват остановится на первом корне. Также допустимо не использовать Root, но в этом случае нет гарантии, где остановится захват.
Реализации трейтов
Реализации автоматических трейтов
impl Freeze for Trace
impl RefUnwindSafe for Trace
impl Send for Trace
impl Sync for Trace
impl Unpin for Trace
impl UnsafeUnpin for Trace
impl UnwindSafe for Trace
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу, возвращая обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/runtime/dump/struct.Trace.html