From b637c0e84a9dbb5883130e0ea1e5ee9e8acf3bc1 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 11:47:26 -0800 Subject: [PATCH 01/15] Add initial debug fmt for Backtrace --- src/libstd/backtrace.rs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 5ba1c940251dc..6b4ae77cec77d 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -106,6 +106,7 @@ use backtrace_rs as backtrace; /// previous point in time. In some instances the `Backtrace` type may /// internally be empty due to configuration. For more information see /// `Backtrace::capture`. +#[derive(Debug)] pub struct Backtrace { inner: Inner, } @@ -126,12 +127,14 @@ pub enum BacktraceStatus { Captured, } +#[derive(Debug)] enum Inner { Unsupported, Disabled, Captured(Mutex), } +#[derive(Debug)] struct Capture { actual_start: usize, resolved: bool, @@ -143,11 +146,13 @@ fn _assert_send_sync() { _assert::(); } +#[derive(Debug)] struct BacktraceFrame { frame: backtrace::Frame, symbols: Vec, } +#[derive(Debug)] struct BacktraceSymbol { name: Option>, filename: Option, @@ -159,6 +164,20 @@ enum BytesOrWide { Wide(Vec), } +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::Full, + crate::env::current_dir().as_ref().ok(), + ) + } +} + impl Backtrace { /// Returns whether backtrace captures are enabled through environment /// variables. @@ -267,12 +286,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"), From 49204563e13f57917cc22ac8f8b608927a432038 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 13:15:03 -0800 Subject: [PATCH 02/15] Get vaguely working with a test for checking output --- src/libstd/backtrace.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 6b4ae77cec77d..f6c34486d7093 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -152,7 +152,6 @@ struct BacktraceFrame { symbols: Vec, } -#[derive(Debug)] struct BacktraceSymbol { name: Option>, filename: Option, @@ -164,6 +163,16 @@ enum BytesOrWide { Wide(Vec), } +impl fmt::Debug for BacktraceSymbol { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_struct("BacktraceSymbol") + .field("name", &self.name.as_ref().map(|b| backtrace::SymbolName::new(b))) + .field("filename", &self.filename) + .field("lineno", &self.lineno) + .finish() + } +} + impl fmt::Debug for BytesOrWide { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { output_filename( @@ -364,3 +373,19 @@ impl Capture { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn debug_backtrace_fmt() { + let bt = Backtrace::capture(); + eprintln!("uncaptured: {:?}", bt); + let bt = Backtrace::force_capture(); + eprintln!("captured: {:?}", bt); + eprintln!("display print: {}", bt); + eprintln!("resolved: {:?}", bt); + unimplemented!(); + } +} From c0ba79eefd82d0a5614e295659b18f7b31e542a3 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:15:13 -0800 Subject: [PATCH 03/15] less noisy format --- src/libstd/backtrace.rs | 44 ++++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index f6c34486d7093..87e6eafe47977 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -106,7 +106,6 @@ use backtrace_rs as backtrace; /// previous point in time. In some instances the `Backtrace` type may /// internally be empty due to configuration. For more information see /// `Backtrace::capture`. -#[derive(Debug)] pub struct Backtrace { inner: Inner, } @@ -146,7 +145,6 @@ fn _assert_send_sync() { _assert::(); } -#[derive(Debug)] struct BacktraceFrame { frame: backtrace::Frame, symbols: Vec, @@ -163,13 +161,45 @@ enum BytesOrWide { Wide(Vec), } +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 mut dbg = fmt.debug_list(); + + for frame in &capture.frames { + dbg.entries(&frame.symbols); + } + + dbg.finish() + } +} + +impl fmt::Debug for BacktraceFrame { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_list().entries(&self.symbols).finish() + } +} + impl fmt::Debug for BacktraceSymbol { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_struct("BacktraceSymbol") - .field("name", &self.name.as_ref().map(|b| backtrace::SymbolName::new(b))) - .field("filename", &self.filename) - .field("lineno", &self.lineno) - .finish() + let mut dbg = fmt.debug_struct(""); + dbg.field("fn", &self.name.as_ref().map(|b| backtrace::SymbolName::new(b))); + + if let Some(fname) = self.filename.as_ref() { + dbg.field("file", fname); + } + + if let Some(line) = self.lineno.as_ref() { + dbg.field("line", &self.lineno); + } + + dbg.finish() } } From 0d5444ffa6ac0447849627406d15d16630a6364b Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:16:24 -0800 Subject: [PATCH 04/15] remove unnecessary derives --- src/libstd/backtrace.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 87e6eafe47977..571c13241b53a 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -126,14 +126,12 @@ pub enum BacktraceStatus { Captured, } -#[derive(Debug)] enum Inner { Unsupported, Disabled, Captured(Mutex), } -#[derive(Debug)] struct Capture { actual_start: usize, resolved: bool, From 76e6d6fe114944c88bea77baf700aa5ead2aa9e3 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:17:40 -0800 Subject: [PATCH 05/15] remove unnecessary Debug impl for BacktraceFrame --- src/libstd/backtrace.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 571c13241b53a..b3d26890fdd87 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -178,12 +178,6 @@ impl fmt::Debug for Backtrace { } } -impl fmt::Debug for BacktraceFrame { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_list().entries(&self.symbols).finish() - } -} - impl fmt::Debug for BacktraceSymbol { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { let mut dbg = fmt.debug_struct(""); From 583dd2c3eebafb72ec89fd4497c3cb751e2343ba Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:18:29 -0800 Subject: [PATCH 06/15] make it compile --- src/libstd/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index b3d26890fdd87..63669532ebc03 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -188,7 +188,7 @@ impl fmt::Debug for BacktraceSymbol { } if let Some(line) = self.lineno.as_ref() { - dbg.field("line", &self.lineno); + dbg.field("line", line); } dbg.finish() From 87117783fb59a580d0a90200ac62ecf219142e49 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:39:32 -0800 Subject: [PATCH 07/15] final format cleanups --- src/libstd/backtrace.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 63669532ebc03..46ea719b2ad41 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -168,6 +168,8 @@ impl fmt::Debug for Backtrace { }; capture.resolve(); + write!(fmt, "Backtrace ")?; + let mut dbg = fmt.debug_list(); for frame in &capture.frames { @@ -181,7 +183,12 @@ impl fmt::Debug for Backtrace { impl fmt::Debug for BacktraceSymbol { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { let mut dbg = fmt.debug_struct(""); - dbg.field("fn", &self.name.as_ref().map(|b| backtrace::SymbolName::new(b))); + + if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { + dbg.field("fn", &fn_name); + } else { + dbg.field("fn", &""); + } if let Some(fname) = self.filename.as_ref() { dbg.field("file", fname); From 70c91330143b7979ec2847d0016ece75053e5d39 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 15:48:09 -0800 Subject: [PATCH 08/15] remove Some from fn name --- src/libstd/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 46ea719b2ad41..d5a7d6b8a9406 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -185,7 +185,7 @@ impl fmt::Debug for BacktraceSymbol { let mut dbg = fmt.debug_struct(""); if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - dbg.field("fn", &fn_name); + dbg.field("fn", &format_args!("\"{}\"", fn_name)); } else { dbg.field("fn", &""); } From 230ed3ea75a18984a0e34fb99dae69e8aa779c64 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 17:28:04 -0800 Subject: [PATCH 09/15] use debug_map and skip empty frames --- src/libstd/backtrace.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index d5a7d6b8a9406..d481f227db73e 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -173,6 +173,10 @@ impl fmt::Debug for Backtrace { let mut dbg = fmt.debug_list(); for frame in &capture.frames { + if frame.frame.ip().is_null() { + continue; + } + dbg.entries(&frame.symbols); } @@ -182,20 +186,20 @@ impl fmt::Debug for Backtrace { impl fmt::Debug for BacktraceSymbol { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut dbg = fmt.debug_struct(""); + let mut dbg = fmt.debug_map(); if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - dbg.field("fn", &format_args!("\"{}\"", fn_name)); + dbg.entry(&"fn", &format_args!("\"{}\"", fn_name)); } else { - dbg.field("fn", &""); + dbg.entry(&"fn", &""); } if let Some(fname) = self.filename.as_ref() { - dbg.field("file", fname); + dbg.entry(&"file", fname); } if let Some(line) = self.lineno.as_ref() { - dbg.field("line", line); + dbg.entry(&"line", line); } dbg.finish() @@ -415,6 +419,7 @@ mod tests { eprintln!("captured: {:?}", bt); eprintln!("display print: {}", bt); eprintln!("resolved: {:?}", bt); + eprintln!("resolved alt: {:#?}", bt); unimplemented!(); } } From de25048a23bbec9ee0dc2f9485e45514444a0d42 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 17:42:04 -0800 Subject: [PATCH 10/15] add nice alt fmt for debug --- src/libstd/backtrace.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index d481f227db73e..7ca7ab674ba3f 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -186,23 +186,23 @@ impl fmt::Debug for Backtrace { impl fmt::Debug for BacktraceSymbol { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut dbg = fmt.debug_map(); + write!(fmt, "{{ ")?; if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - dbg.entry(&"fn", &format_args!("\"{}\"", fn_name)); + write!(fmt, "fn: \"{:?}\"", fn_name)?; } else { - dbg.entry(&"fn", &""); + write!(fmt, "fn: \"\"")?; } if let Some(fname) = self.filename.as_ref() { - dbg.entry(&"file", fname); + write!(fmt, ", file: {:?}", fname)?; } if let Some(line) = self.lineno.as_ref() { - dbg.entry(&"line", line); + write!(fmt, ", line: {:?}", line)?; } - dbg.finish() + write!(fmt, " }}") } } From 192b10391784de14e8cc672314e3b68e9c450fce Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 17:45:58 -0800 Subject: [PATCH 11/15] make symbol printing consistent with backtrace_rs --- src/libstd/backtrace.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 7ca7ab674ba3f..b82a44350cc8a 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -189,9 +189,10 @@ impl fmt::Debug for BacktraceSymbol { write!(fmt, "{{ ")?; if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - write!(fmt, "fn: \"{:?}\"", fn_name)?; + write!(fmt, "fn: ")?; + fmt::Display::fmt(&fn_name, fmt)?; } else { - write!(fmt, "fn: \"\"")?; + write!(fmt, "fn: ")?; } if let Some(fname) = self.filename.as_ref() { From 7064a0ec59005f1e67e89a794ff70d687d2d7041 Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 21:07:36 -0800 Subject: [PATCH 12/15] maximum alternative consistency! --- src/libstd/backtrace.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index b82a44350cc8a..448b988d99c1c 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -168,11 +168,17 @@ impl fmt::Debug for Backtrace { }; capture.resolve(); + let frames = if fmt.alternate() { + &capture.frames[..] + } else { + &capture.frames[capture.actual_start..] + }; + write!(fmt, "Backtrace ")?; let mut dbg = fmt.debug_list(); - for frame in &capture.frames { + for frame in frames { if frame.frame.ip().is_null() { continue; } @@ -215,7 +221,7 @@ impl fmt::Debug for BytesOrWide { BytesOrWide::Bytes(w) => BytesOrWideString::Bytes(w), BytesOrWide::Wide(w) => BytesOrWideString::Wide(w), }, - backtrace::PrintFmt::Full, + if fmt.alternate() { backtrace::PrintFmt::Full } else { backtrace::PrintFmt::Short }, crate::env::current_dir().as_ref().ok(), ) } @@ -419,6 +425,7 @@ mod tests { let bt = Backtrace::force_capture(); eprintln!("captured: {:?}", bt); eprintln!("display print: {}", bt); + eprintln!("display print alt: {:#}", bt); eprintln!("resolved: {:?}", bt); eprintln!("resolved alt: {:#?}", bt); unimplemented!(); From 6797bfd203dea6601548098214504375ad0e45ac Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 21:38:59 -0800 Subject: [PATCH 13/15] rule over the code in libstd with an iron fist --- src/libstd/backtrace.rs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 448b988d99c1c..391d22df5e51e 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -168,11 +168,7 @@ impl fmt::Debug for Backtrace { }; capture.resolve(); - let frames = if fmt.alternate() { - &capture.frames[..] - } else { - &capture.frames[capture.actual_start..] - }; + let frames = &capture.frames[capture.actual_start..]; write!(fmt, "Backtrace ")?; @@ -195,10 +191,9 @@ impl fmt::Debug for BacktraceSymbol { write!(fmt, "{{ ")?; if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - write!(fmt, "fn: ")?; - fmt::Display::fmt(&fn_name, fmt)?; + write!(fmt, "fn: \"{}\"", fn_name)?; } else { - write!(fmt, "fn: ")?; + write!(fmt, "fn: \"\"")?; } if let Some(fname) = self.filename.as_ref() { @@ -221,7 +216,7 @@ impl fmt::Debug for BytesOrWide { BytesOrWide::Bytes(w) => BytesOrWideString::Bytes(w), BytesOrWide::Wide(w) => BytesOrWideString::Wide(w), }, - if fmt.alternate() { backtrace::PrintFmt::Full } else { backtrace::PrintFmt::Short }, + backtrace::PrintFmt::Short, crate::env::current_dir().as_ref().ok(), ) } From c8817aa521092b02d4b9e8494429e178259e506a Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Mon, 10 Feb 2020 21:54:27 -0800 Subject: [PATCH 14/15] backwards again, god damnit --- src/libstd/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 391d22df5e51e..4b47a8cf16923 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -191,7 +191,7 @@ impl fmt::Debug for BacktraceSymbol { write!(fmt, "{{ ")?; if let Some(fn_name) = self.name.as_ref().map(|b| backtrace::SymbolName::new(b)) { - write!(fmt, "fn: \"{}\"", fn_name)?; + write!(fmt, "fn: \"{:#}\"", fn_name)?; } else { write!(fmt, "fn: \"\"")?; } From ec8ee7fb81c208fbd0fe53f11b1c792f3e0d6c6f Mon Sep 17 00:00:00 2001 From: Jane Lusby Date: Tue, 11 Feb 2020 08:39:27 -0800 Subject: [PATCH 15/15] remove intentionally failing test --- src/libstd/backtrace.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/libstd/backtrace.rs b/src/libstd/backtrace.rs index 4b47a8cf16923..a1c9aa75d779a 100644 --- a/src/libstd/backtrace.rs +++ b/src/libstd/backtrace.rs @@ -408,21 +408,3 @@ impl Capture { } } } - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn debug_backtrace_fmt() { - let bt = Backtrace::capture(); - eprintln!("uncaptured: {:?}", bt); - let bt = Backtrace::force_capture(); - eprintln!("captured: {:?}", bt); - eprintln!("display print: {}", bt); - eprintln!("display print alt: {:#}", bt); - eprintln!("resolved: {:?}", bt); - eprintln!("resolved alt: {:#?}", bt); - unimplemented!(); - } -}