diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-02-12 20:36:56 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-12 20:36:56 +0100 |
| commit | 5a800d7ee641054c59199b6960ea30936a0b9de2 (patch) | |
| tree | c392660513d8323e89370e82799cc11668c6e31b /src/libstd | |
| parent | 29dd5df791bb70d6c5d3d1118c1289d4f3d51899 (diff) | |
| parent | ec8ee7fb81c208fbd0fe53f11b1c792f3e0d6c6f (diff) | |
| download | rust-5a800d7ee641054c59199b6960ea30936a0b9de2.tar.gz rust-5a800d7ee641054c59199b6960ea30936a0b9de2.zip | |
Rollup merge of #69038 - yaahc:backtrace-debug, r=dtolnay
Add initial debug fmt for Backtrace Fixes the first point in https://github.com/rust-lang/rust/issues/65280 related to https://github.com/rust-lang/rust/issues/53487
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/backtrace.rs | 69 |
1 files changed, 63 insertions, 6 deletions
diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 5ba1c940251..a1c9aa75d77 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -159,6 +159,69 @@ enum BytesOrWide { Wide(Vec<u16>), } +impl fmt::Debug for Backtrace { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + let mut capture = match &self.inner { + Inner::Unsupported => return fmt.write_str("unsupported backtrace"), + Inner::Disabled => return fmt.write_str("disabled backtrace"), + Inner::Captured(c) => c.lock().unwrap(), + }; + capture.resolve(); + + let frames = &capture.frames[capture.actual_start..]; + + write!(fmt, "Backtrace ")?; + + let mut dbg = fmt.debug_list(); + + for frame in frames { + if frame.frame.ip().is_null() { + continue; + } + + dbg.entries(&frame.symbols); + } + + dbg.finish() + } +} + +impl fmt::Debug for BacktraceSymbol { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(fmt, "{{ ")?; + + if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { + write!(fmt, "fn: \"{:#}\"", fn_name)?; + } else { + write!(fmt, "fn: \"<unknown>\"")?; + } + + if let Some(fname) = self.filename.as_ref() { + write!(fmt, ", file: {:?}", fname)?; + } + + if let Some(line) = self.lineno.as_ref() { + write!(fmt, ", line: {:?}", line)?; + } + + write!(fmt, " }}") + } +} + +impl fmt::Debug for BytesOrWide { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + output_filename( + fmt, + match self { + BytesOrWide::Bytes(w) => BytesOrWideString::Bytes(w), + BytesOrWide::Wide(w) => BytesOrWideString::Wide(w), + }, + backtrace::PrintFmt::Short, + crate::env::current_dir().as_ref().ok(), + ) + } +} + impl Backtrace { /// Returns whether backtrace captures are enabled through environment /// variables. @@ -268,12 +331,6 @@ impl Backtrace { impl fmt::Display for Backtrace { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Debug::fmt(self, fmt) - } -} - -impl fmt::Debug for Backtrace { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { let mut capture = match &self.inner { Inner::Unsupported => return fmt.write_str("unsupported backtrace"), Inner::Disabled => return fmt.write_str("disabled backtrace"), |
