pub struct UnwindIterator<'u, 'c, 'r, U: Unwinder + ?Sized, F: FnMut(u64) -> Result<u64, ()>> { /* private fields */ }
Expand description

An iterator for unwinding the entire stack, starting from the initial register values.

The first yielded frame is the instruction pointer. Subsequent addresses are return addresses.

This iterator attempts to detect if stack unwinding completed successfully, or if the stack was truncated prematurely. If it thinks that it successfully found the root function, it will complete with Ok(None), otherwise it will complete with Err(...). However, the detection does not work in all cases, so you should expect Err(...) to be returned even during normal operation. As a result, it is not recommended to use this iterator as a FallibleIterator, because you might lose the entire stack if the last iteration returns Err(...).

Lifetimes:

  • 'u: The lifetime of the Unwinder.
  • 'c: The lifetime of the unwinder cache.
  • 'r: The lifetime of the exclusive access to the read_stack callback.

Implementations§

source§

impl<'u, 'c, 'r, U: Unwinder + ?Sized, F: FnMut(u64) -> Result<u64, ()>> UnwindIterator<'u, 'c, 'r, U, F>

source

pub fn new( unwinder: &'u U, pc: u64, regs: U::UnwindRegs, cache: &'c mut U::Cache, read_stack: &'r mut F ) -> Self

Create a new iterator. You’d usually use Unwinder::iter_frames instead.

source§

impl<'u, 'c, 'r, U: Unwinder + ?Sized, F: FnMut(u64) -> Result<u64, ()>> UnwindIterator<'u, 'c, 'r, U, F>

source

pub fn next(&mut self) -> Result<Option<FrameAddress>, Error>

Yield the next frame in the stack.

The first frame is Ok(Some(FrameAddress::InstructionPointer(...))). Subsequent frames are Ok(Some(FrameAddress::ReturnAddress(...))).

If a root function has been reached, this iterator completes with Ok(None). Otherwise it completes with Err(...), usually indicating that a certain stack address could not be read.

Trait Implementations§

source§

impl<'u, 'c, 'r, U: Unwinder + ?Sized, F: FnMut(u64) -> Result<u64, ()>> FallibleIterator for UnwindIterator<'u, 'c, 'r, U, F>

§

type Item = FrameAddress

The type being iterated over.
§

type Error = Error

The error type.
source§

fn next(&mut self) -> Result<Option<FrameAddress>, Error>

Advances the iterator and returns the next value. Read more
source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns bounds on the remaining length of the iterator. Read more
source§

fn count(self) -> Result<usize, Self::Error>
where Self: Sized,

Consumes the iterator, returning the number of remaining items.
source§

fn last(self) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized,

Returns the last element of the iterator.
source§

fn nth(&mut self, n: usize) -> Result<Option<Self::Item>, Self::Error>

Returns the nth element of the iterator.
source§

fn step_by(self, step: usize) -> StepBy<Self>
where Self: Sized,

Returns an iterator starting at the same point, but stepping by the given amount at each iteration. Read more
source§

fn chain<I>(self, it: I) -> Chain<Self, I>
where I: IntoFallibleIterator<Item = Self::Item, Error = Self::Error>, Self: Sized,

Returns an iterator which yields the elements of this iterator followed by another.
source§

fn zip<I>( self, o: I ) -> Zip<Self, <I as IntoFallibleIterator>::IntoFallibleIter>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>,

Returns an iterator that yields pairs of this iterator’s and another iterator’s values.
source§

fn map<F, B>(self, f: F) -> Map<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> Result<B, Self::Error>,

Returns an iterator which applies a fallible transform to the elements of the underlying iterator.
source§

fn for_each<F>(self, f: F) -> Result<(), Self::Error>
where Self: Sized, F: FnMut(Self::Item) -> Result<(), Self::Error>,

Calls a fallible closure on each element of an iterator.
source§

fn filter<F>(self, f: F) -> Filter<Self, F>
where Self: Sized, F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator which uses a predicate to determine which values should be yielded. The predicate may fail; such failures are passed to the caller.
source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where Self: Sized, F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which both filters and maps. The closure may fail; such failures are passed along to the consumer.
source§

fn enumerate(self) -> Enumerate<Self>
where Self: Sized,

Returns an iterator which yields the current iteration count as well as the value.
source§

fn peekable(self) -> Peekable<Self>
where Self: Sized,

Returns an iterator that can peek at the next element without consuming it.
source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that skips elements based on a predicate.
source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where Self: Sized, P: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns an iterator that yields elements based on a predicate.
source§

fn skip(self, n: usize) -> Skip<Self>
where Self: Sized,

Returns an iterator which skips the first n values of this iterator.
source§

fn take(self, n: usize) -> Take<Self>
where Self: Sized,

Returns an iterator that yields only the first n values of this iterator.
source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where Self: Sized, F: FnMut(&mut St, Self::Item) -> Result<Option<B>, Self::Error>,

Returns an iterator which applies a stateful map to values of this iterator.
source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where Self: Sized, U: IntoFallibleIterator<Error = Self::Error>, F: FnMut(Self::Item) -> Result<U, Self::Error>,

Returns an iterator which maps this iterator’s elements to iterators, yielding those iterators’ values.
source§

fn fuse(self) -> Fuse<Self>
where Self: Sized,

Returns an iterator which yields this iterator’s elements and ends after the first Ok(None). Read more
source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where Self: Sized, F: FnMut(&Self::Item) -> Result<(), Self::Error>,

Returns an iterator which passes each element to a closure before returning it.
source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Borrow an iterator rather than consuming it. Read more
source§

fn collect<T>(self) -> Result<T, Self::Error>
where T: FromIterator<Self::Item>, Self: Sized,

Transforms the iterator into a collection. Read more
source§

fn partition<B, F>(self, f: F) -> Result<(B, B), Self::Error>
where Self: Sized, B: Default + Extend<Self::Item>, F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Transforms the iterator into two collections, partitioning elements by a closure.
source§

fn fold<B, F>(self, init: B, f: F) -> Result<B, Self::Error>
where Self: Sized, F: FnMut(B, Self::Item) -> Result<B, Self::Error>,

Applies a function over the elements of the iterator, producing a single final value.
source§

fn try_fold<B, E, F>(&mut self, init: B, f: F) -> Result<B, E>
where Self: Sized, E: From<Self::Error>, F: FnMut(B, Self::Item) -> Result<B, E>,

Applies a function over the elements of the iterator, producing a single final value. Read more
source§

fn all<F>(&mut self, f: F) -> Result<bool, Self::Error>
where Self: Sized, F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if all elements of this iterator match a predicate.
source§

fn any<F>(&mut self, f: F) -> Result<bool, Self::Error>
where Self: Sized, F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Determines if any element of this iterator matches a predicate.
source§

fn find<F>(&mut self, f: F) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized, F: FnMut(&Self::Item) -> Result<bool, Self::Error>,

Returns the first element of the iterator that matches a predicate.
source§

fn find_map<B, F>(&mut self, f: F) -> Result<Option<B>, Self::Error>
where Self: Sized, F: FnMut(Self::Item) -> Result<Option<B>, Self::Error>,

Applies a function to the elements of the iterator, returning the first non-None result.
source§

fn position<F>(&mut self, f: F) -> Result<Option<usize>, Self::Error>
where Self: Sized, F: FnMut(Self::Item) -> Result<bool, Self::Error>,

Returns the position of the first element of this iterator that matches a predicate. The predicate may fail; such failures are returned to the caller.
source§

fn max_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized, B: Ord, F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the maximum value from the function.
source§

fn max_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the maximum value with respect to the function.
source§

fn min_by_key<B, F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized, B: Ord, F: FnMut(&Self::Item) -> Result<B, Self::Error>,

Returns the element of the iterator which gives the minimum value from the function.
source§

fn min_by<F>(self, f: F) -> Result<Option<Self::Item>, Self::Error>
where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Result<Ordering, Self::Error>,

Returns the element that gives the minimum value with respect to the function.
source§

fn unzip<A, B, FromA, FromB>(self) -> Result<(FromA, FromB), Self::Error>
where Self: Sized + FallibleIterator<Item = (A, B)>, FromA: Default + Extend<A>, FromB: Default + Extend<B>,

Converts an iterator of pairs into a pair of containers.
source§

fn cloned<'a, T>(self) -> Cloned<Self>
where Self: Sized + FallibleIterator<Item = &'a T>, T: 'a + Clone,

Returns an iterator which clones all of its elements.
source§

fn partial_cmp<I>(self, other: I) -> Result<Option<Ordering>, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Lexicographically compares the elements of this iterator to that of another.
source§

fn eq<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are equal to those of another.
source§

fn ne<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialEq<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are not equal to those of another.
source§

fn lt<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less than those of another.
source§

fn le<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically less than or equal to those of another.
source§

fn gt<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically greater than those of another.
source§

fn ge<I>(self, other: I) -> Result<bool, Self::Error>
where Self: Sized, I: IntoFallibleIterator<Error = Self::Error>, Self::Item: PartialOrd<<I as IntoFallibleIterator>::Item>,

Determines if the elements of this iterator are lexicographically greater than or equal to those of another.
source§

fn iterator(self) -> Iterator<Self>
where Self: Sized,

Returns a normal (non-fallible) iterator over Result<Item, Error>.
source§

fn map_err<B, F>(self, f: F) -> MapErr<Self, F>
where F: FnMut(Self::Error) -> B, Self: Sized,

Returns an iterator which applies a transform to the errors of the underlying iterator.

Auto Trait Implementations§

§

impl<'u, 'c, 'r, U, F> RefUnwindSafe for UnwindIterator<'u, 'c, 'r, U, F>

§

impl<'u, 'c, 'r, U, F> Send for UnwindIterator<'u, 'c, 'r, U, F>
where F: Send, U: Sync, <U as Unwinder>::Cache: Send, <U as Unwinder>::UnwindRegs: Send,

§

impl<'u, 'c, 'r, U, F> Sync for UnwindIterator<'u, 'c, 'r, U, F>
where F: Sync, U: Sync, <U as Unwinder>::Cache: Sync, <U as Unwinder>::UnwindRegs: Sync,

§

impl<'u, 'c, 'r, U, F> Unpin for UnwindIterator<'u, 'c, 'r, U, F>
where <U as Unwinder>::UnwindRegs: Unpin,

§

impl<'u, 'c, 'r, U, F> !UnwindSafe for UnwindIterator<'u, 'c, 'r, U, F>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<I> IntoFallibleIterator for I

§

type Item = <I as FallibleIterator>::Item

The elements of the iterator.
§

type Error = <I as FallibleIterator>::Error

The error value of the iterator.
§

type IntoFallibleIter = I

The iterator.
source§

fn into_fallible_iter(self) -> I

Creates a fallible iterator from a value.
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.