pub struct RunSummary {Show 28 fields
pub sched_turns: u64,
pub schedevent_replayed: u64,
pub schedevent_recorded: u64,
pub schedevent_desynced: u64,
pub desync_descrip: Option<String>,
pub reprio_descrip: Option<String>,
pub threads_descrip: String,
pub num_processes: u64,
pub num_threads: u64,
pub syscalls: Option<u64>,
pub virttime_elapsed: u64,
pub virttime_final: u64,
pub realtime_elapsed: Option<Duration>,
pub timeslice_stats: TimesliceStats,
pub per_thread_timeslice: Vec<(DetTid, TimesliceStats)>,
pub preemption: Option<PreemptionSummary>,
pub dispatch_stats: Option<DispatchStats>,
pub replay_departure: Option<Summary>,
pub syscall_histogram: Option<SyscallHistogramSummary>,
pub host_inputs: Option<HostInputSet>,
pub host_inputs_changed: Vec<HostInputChange>,
pub guest_deadlock: bool,
pub virtual_timeout_ns: Option<u64>,
pub exclusive_pairs: BTreeMap<String, u64>,
pub store_exclusives: Option<StoreExclusiveCounts>,
pub store_exclusives_unavailable: Option<String>,
pub guest_ids: Option<GuestIds>,
pub host_id_tasks: u64,
}Expand description
Statistics that summarize a hermit run.
Fields§
§sched_turns: u64Internal number of steps taken by the scheduler.
schedevent_replayed: u64Trace replay: SchedEvents read and replayed from the input recording.
schedevent_recorded: u64Trace replay: SchedEvents recorded to disk during execution.
schedevent_desynced: u64Trace replay: Desync events that occurred while replaying SchedEvents.
desync_descrip: Option<String>A human-readable summary of the desyncs that occurred.
reprio_descrip: Option<String>A summary of when threads where preempted and reprioritized (for –chaos mode), e.g. –record-preemptions-to.
threads_descrip: StringA summary of the thread topology spawned by the guest.
num_processes: u64The number of threads that were group leaders, i.e. processes.
num_threads: u64The number of total system threads that were created during the execution.
syscalls: Option<u64>Total syscalls completed by all guest threads.
virttime_elapsed: u64Deterministic virtual nanoseconds elapsed while computing.
virttime_final: u64Absolute (virtual) time in nanoseconds since epoch at program completion.
realtime_elapsed: Option<Duration>Nondeterministic: Realtime in nanoseconds, i.e. wall-clock time elapsed.
timeslice_stats: TimesliceStatsAggregate distribution of scheduler timeslice durations (virtual ns), summed over all threads.
per_thread_timeslice: Vec<(DetTid, TimesliceStats)>Per-thread timeslice distributions, sorted by DetTid for deterministic
output.
preemption: Option<PreemptionSummary>Configured maximum and timer mechanism from the shared Detcore config.
Absent for older summaries or producers that did not record it; a present
object with a null maximum explicitly records a disabled maximum. Timer
availability is configuration/capability metadata, not measured delivery.
Shown in the full report, but not the INFO guest-behavior view used by
--verify.
dispatch_stats: Option<DispatchStats>How the backend dispatched guest syscalls: through signals, patched
direct calls, or ptrace stops. The record carries its own schema
version. Absent when the run did not collect it or the backend has no
such dispatch (KVM). Deliberately not part of the human-readable
summary, whose INFO view is compared by --verify.
replay_departure: Option<Summary>Accepted findings that make this faithful preemption replay incomplete. Absent for ordinary runs and older JSON summaries; not part of Display or the INFO view compared by verification.
syscall_histogram: Option<SyscallHistogramSummary>Per-syscall entries and outcomes over all guest threads, with the
scope of what was observed (crate::syscall_histogram); its calls
sum to syscalls (RunSummary::syscall_histogram_is_consistent).
Absent from summaries written before it existed. Not part of the
human-readable summary, whose INFO view is compared by --verify.
host_inputs: Option<HostInputSet>The host files the guest opened, with the identity each path’s first
open found and the set’s digest (see crate::host_input). Two
separate runs whose digests differ read different host files, which
Hermit does not make deterministic. Absent when the run did not
record them. Not part of the human-readable summary, whose INFO view
--verify compares.
host_inputs_changed: Vec<HostInputChange>The host files a schedule replay found changed since the recording it
replays, in the order the guest first opened them (see
crate::host_input::HostInputChange). Empty when nothing changed or
the run replayed nothing. Not part of the human-readable summary.
guest_deadlock: boolThe run ended on a deadlock under Hermit’s model: every remaining thread
was blocked with no wake Detcore models. Its status is then
HERMIT_GUEST_DEADLOCK_EXIT, not one the guest exited with. Absent
(false) for every other run and in older summaries.
virtual_timeout_ns: Option<u64>The run ended because its virtual clock passed --virtual-timeout,
whose bound in virtual nanoseconds this is: the scheduler granted no
turn past it. Its status is then 124, not one the guest exited with.
Absent for every other run and in older summaries.
exclusive_pairs: BTreeMap<String, u64>aarch64: the load/store exclusive pairs (LL/SC retry loops) in the guest’s executable file mappings, by guest path. A function of the files’ bytes, so it is in the INFO view. Empty elsewhere.
store_exclusives: Option<StoreExclusiveCounts>Nondeterministic: aarch64, in runs that record or replay
preemptions: the store-exclusives the guest failed, each of which
retried its loop and added retired branches, and those it executed.
Host interrupts decide them, so they are shown in the full report but
not in the INFO view --verify compares. Absent where not counted.
aarch64: why store_exclusives could not be counted in a run that
records or replays preemptions. Full report only.
guest_ids: Option<GuestIds>How the guest’s process and thread IDs were numbered, for a run
without a PID namespace of its own (--no-namespace): chosen from a
base, or the host’s. Absent for a run its PID namespace numbered. Shown
in the full report as launch configuration, not in the INFO view.
host_id_tasks: u64How many host-ID reports were accepted while IDs were to be chosen
(guest_ids): nonzero means chosen IDs are not guaranteed. Shown in
the full report beside guest_ids. This includes conservative reports
before vfork calls, whose parents return only once the child has
exec’d or exited. Failed and restarted attempts can therefore be
counted too; this is not a count of distinct created tasks.
Implementations§
Source§impl RunSummary
impl RunSummary
Sourcepub fn syscall_histogram_is_consistent(&self) -> Option<bool>
pub fn syscall_histogram_is_consistent(&self) -> Option<bool>
Whether the histogram, when present, counts exactly the syscalls
total. None when either is absent.
pub fn info<'a>( &'a self, reprio_description: Option<&'a str>, ) -> RunSummaryInfo<'a>
Trait Implementations§
Source§impl Clone for RunSummary
impl Clone for RunSummary
Source§fn clone(&self) -> RunSummary
fn clone(&self) -> RunSummary
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RunSummary
impl Debug for RunSummary
Source§impl Default for RunSummary
impl Default for RunSummary
Source§fn default() -> RunSummary
fn default() -> RunSummary
Source§impl<'de> Deserialize<'de> for RunSummary
impl<'de> Deserialize<'de> for RunSummary
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Display for RunSummary
The full human-readable report, including recorded launch configuration.
impl Display for RunSummary
The full human-readable report, including recorded launch configuration.
Auto Trait Implementations§
impl Freeze for RunSummary
impl RefUnwindSafe for RunSummary
impl Send for RunSummary
impl Sync for RunSummary
impl Unpin for RunSummary
impl UnsafeUnpin for RunSummary
impl UnwindSafe for RunSummary
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.