From 6d4975644bef6e58abdbe631eecd84b64debdf83 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sat, 3 Mar 2018 17:59:30 +0100 Subject: [PATCH 01/11] Filter backtrace --- .gitignore | 3 +- src/libstd/sys_common/backtrace.rs | 91 +++++++++++++++------ src/test/run-make/filter_backtrace/Makefile | 21 +++++ src/test/run-make/filter_backtrace/main.rs | 3 + 4 files changed, 92 insertions(+), 26 deletions(-) create mode 100644 src/test/run-make/filter_backtrace/Makefile create mode 100644 src/test/run-make/filter_backtrace/main.rs diff --git a/.gitignore b/.gitignore index 57407a2399a2f..3a5d95d44a00d 100644 --- a/.gitignore +++ b/.gitignore @@ -82,7 +82,7 @@ __pycache__/ /src/libstd_unicode/SpecialCasing.txt /src/libstd_unicode/UnicodeData.txt /stage[0-9]+/ -/target +target/ /test/ /tmp/ TAGS @@ -101,7 +101,6 @@ version.ml version.texi .cargo !src/vendor/** -/src/target/ no_llvm_build diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index 1955f3ec9a28f..f26b2a36f98e2 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -69,16 +69,18 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { inline_context: 0, }; MAX_NB_FRAMES]; let (nb_frames, context) = unwind_backtrace(&mut frames)?; - let (skipped_before, skipped_after) = - filter_frames(&frames[..nb_frames], format, &context); - if skipped_before + skipped_after > 0 { + let filtered_frames = filter_frames(&frames[..nb_frames], &context, format); + if filtered_frames.len() != nb_frames { writeln!(w, "note: Some details are omitted, \ run with `RUST_BACKTRACE=full` for a verbose backtrace.")?; } writeln!(w, "stack backtrace:")?; - let filtered_frames = &frames[..nb_frames - skipped_after]; - for (index, frame) in filtered_frames.iter().skip(skipped_before).enumerate() { + for (index, frame, is_on_filter_edge) in filtered_frames { + // Don't use ANSI escape codes on windows, because most terminals on it don't support them + if is_on_filter_edge && cfg!(not(windows)) { + write!(w, "\x1B[2m")?; + } resolve_symname(*frame, |symname| { output(w, index, *frame, symname, format) }, &context)?; @@ -88,43 +90,84 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { if has_more_filenames { w.write_all(b" <... and possibly more>")?; } + if cfg!(not(windows)) { + write!(w, "\x1B[0m")?; + } } Ok(()) } -/// Returns a number of frames to remove at the beginning and at the end of the -/// backtrace, according to the backtrace format. -fn filter_frames(frames: &[Frame], - format: PrintFormat, - context: &BacktraceContext) -> (usize, usize) -{ - if format == PrintFormat::Full { - return (0, 0); - } +fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { + const FILTERED_SYMBOLS: &[&str] = &[ + "main", + "rust_begin_unwind", + ]; + const FILTERED_SYMBOL_PARTS: &[&str] = &[ + "panic", + "sys", + "lang_start", + ]; + let mut should_show = true; + let _ = resolve_symname(*frame, |symname| { + if let Some(mangled_symbol_name) = symname { + for filtered_symbol in FILTERED_SYMBOLS { + if mangled_symbol_name == *filtered_symbol { + should_show = false; + return Ok(()); + } + } + for filtered_symbol_part in FILTERED_SYMBOL_PARTS { + if mangled_symbol_name.contains(filtered_symbol_part) { + should_show = false; + return Ok(()); + } + } + } + Ok(()) + }, context); + should_show +} - let skipped_before = 0; +/// Returns the frames to show as a Vec. +/// If the bool is true the frame is on the edge between showing and not showing. +fn filter_frames<'a>(frames: &'a [Frame], + context: &BacktraceContext, + format: PrintFormat) -> Vec<(usize, &'a Frame, bool)> +{ + let mut frames_iter = frames.iter().enumerate().peekable(); + let mut filtered_frames = Vec::new(); + let mut show_prev_frame = false; - let skipped_after = frames.len() - frames.iter().position(|frame| { - let mut is_marker = false; + while let Some((i, frame)) = frames_iter.next() { + let mut is_after_begin_short_backtrace = false; let _ = resolve_symname(*frame, |symname| { if let Some(mangled_symbol_name) = symname { // Use grep to find the concerned functions if mangled_symbol_name.contains("__rust_begin_short_backtrace") { - is_marker = true; + is_after_begin_short_backtrace = true; } } Ok(()) }, context); - is_marker - }).unwrap_or(frames.len()); + if is_after_begin_short_backtrace && format != PrintFormat::Full { + break; + } - if skipped_before + skipped_after >= frames.len() { - // Avoid showing completely empty backtraces - return (0, 0); + let show_cur_frame = should_show_frame(frame, context); + let show_next_frame = frames_iter + .peek() + .map(|&(_, frame)| should_show_frame(frame, context)) + .unwrap_or(false); + if show_cur_frame { + filtered_frames.push((i, frame, false)); + } else if show_prev_frame || show_next_frame || format == PrintFormat::Full { + filtered_frames.push((i, frame, true)); + } + show_prev_frame = show_cur_frame; } - (skipped_before, skipped_after) + filtered_frames } diff --git a/src/test/run-make/filter_backtrace/Makefile b/src/test/run-make/filter_backtrace/Makefile new file mode 100644 index 0000000000000..5deaaf1d87c44 --- /dev/null +++ b/src/test/run-make/filter_backtrace/Makefile @@ -0,0 +1,21 @@ +-include ../tools.mk + +# Test that short backtraces don't include several internal symbols + +all: + $(RUSTC) main.rs -o $(TMPDIR)/main + # with short backtrace + RUST_BACKTRACE=1 $(TMPDIR)/main 2> $(TMPDIR)/short_bt.stderr || exit 0 && exit 1 + $(CGREP) "panicked at" < $(TMPDIR)/short_bt.stderr + $(CGREP) -v "std::panicking" < $(TMPDIR)/short_bt.stderr + $(CGREP) -v "std::sys" < $(TMPDIR)/short_bt.stderr + $(CGREP) -v "__rust_maybe_catch_panic" < $(TMPDIR)/short_bt.stderr + $(CGREP) -v "__rust_begin_short_backtrace" < $(TMPDIR)/short_bt.stderr + # with long backtrace + RUST_BACKTRACE=full $(TMPDIR)/main 2> $(TMPDIR)/long_bt.stderr || exit 0 && exit 1 + $(CGREP) "panicked at" < $(TMPDIR)/long_bt.stderr + $(CGREP) "std::panicking" < $(TMPDIR)/long_bt.stderr + $(CGREP) "std::sys" < $(TMPDIR)/long_bt.stderr + $(CGREP) "__rust_maybe_catch_panic" < $(TMPDIR)/long_bt.stderr + # FIXME: prevent tail call optimization for this + $(CGREP) -v "__rust_begin_short_backtrace" < $(TMPDIR)/long_bt.stderr diff --git a/src/test/run-make/filter_backtrace/main.rs b/src/test/run-make/filter_backtrace/main.rs new file mode 100644 index 0000000000000..f982ed77a660d --- /dev/null +++ b/src/test/run-make/filter_backtrace/main.rs @@ -0,0 +1,3 @@ +fn main() { + (None as Option<()>).unwrap(); +} From 6ccf28aa527c0bb90a3debec8baf53b47eee29a0 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sat, 17 Mar 2018 19:01:04 +0100 Subject: [PATCH 02/11] Wip --- .gitignore | 2 +- src/libstd/sys_common/backtrace.rs | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 3a5d95d44a00d..b44c65acb3d52 100644 --- a/.gitignore +++ b/.gitignore @@ -82,7 +82,7 @@ __pycache__/ /src/libstd_unicode/SpecialCasing.txt /src/libstd_unicode/UnicodeData.txt /stage[0-9]+/ -target/ +/target /test/ /tmp/ TAGS diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index f26b2a36f98e2..75c384ef797cd 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -102,11 +102,14 @@ fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { const FILTERED_SYMBOLS: &[&str] = &[ "main", "rust_begin_unwind", + "__rust_maybe_catch_panic" ]; const FILTERED_SYMBOL_PARTS: &[&str] = &[ - "panic", - "sys", - "lang_start", + "_ZN4core9panicking", + "_ZN3std9panicking", + "_ZN3std3sys", + "_ZN3std10sys_common", + "_ZN3std2rt", ]; let mut should_show = true; let _ = resolve_symname(*frame, |symname| { @@ -118,7 +121,7 @@ fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { } } for filtered_symbol_part in FILTERED_SYMBOL_PARTS { - if mangled_symbol_name.contains(filtered_symbol_part) { + if mangled_symbol_name.begins_with(filtered_symbol_part) { should_show = false; return Ok(()); } From 199b485995a815fdcea9e80c043b93f431fe95d5 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 20 Mar 2018 08:17:49 +0100 Subject: [PATCH 03/11] Don't emit ansi codes --- src/libstd/sys_common/backtrace.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index 75c384ef797cd..fcb11620c170c 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -77,10 +77,6 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { writeln!(w, "stack backtrace:")?; for (index, frame, is_on_filter_edge) in filtered_frames { - // Don't use ANSI escape codes on windows, because most terminals on it don't support them - if is_on_filter_edge && cfg!(not(windows)) { - write!(w, "\x1B[2m")?; - } resolve_symname(*frame, |symname| { output(w, index, *frame, symname, format) }, &context)?; @@ -90,9 +86,6 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { if has_more_filenames { w.write_all(b" <... and possibly more>")?; } - if cfg!(not(windows)) { - write!(w, "\x1B[0m")?; - } } Ok(()) From 8e4a951343b75358f947c19a1389d27ce7bba4a6 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Wed, 21 Mar 2018 17:08:00 +0100 Subject: [PATCH 04/11] s/begins_with/starts_with --- src/libstd/sys_common/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index fcb11620c170c..2437a34824840 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -114,7 +114,7 @@ fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { } } for filtered_symbol_part in FILTERED_SYMBOL_PARTS { - if mangled_symbol_name.begins_with(filtered_symbol_part) { + if mangled_symbol_name.starts_with(filtered_symbol_part) { should_show = false; return Ok(()); } From a9c5a9583c3371d8cb36f894cd3ae116c36e053c Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Mon, 26 Mar 2018 18:57:42 +0200 Subject: [PATCH 05/11] Add license --- src/test/run-make/filter_backtrace/main.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/run-make/filter_backtrace/main.rs b/src/test/run-make/filter_backtrace/main.rs index f982ed77a660d..403e1999635f1 100644 --- a/src/test/run-make/filter_backtrace/main.rs +++ b/src/test/run-make/filter_backtrace/main.rs @@ -1,3 +1,13 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + fn main() { (None as Option<()>).unwrap(); } From 2a74f378632f85c124d796132ca53413b8b6ccde Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Wed, 28 Mar 2018 15:24:07 +0200 Subject: [PATCH 06/11] Silence warning --- src/libstd/sys_common/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index 2437a34824840..d09bc9374193f 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -76,7 +76,7 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { } writeln!(w, "stack backtrace:")?; - for (index, frame, is_on_filter_edge) in filtered_frames { + for (index, frame, _is_on_filter_edge) in filtered_frames { resolve_symname(*frame, |symname| { output(w, index, *frame, symname, format) }, &context)?; From 1edc7814caf3d8d7084b884d934d9c41205e4288 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Thu, 29 Mar 2018 13:24:09 +0200 Subject: [PATCH 07/11] Use RUST_BACKTRACE=full in run-pass/backtrace.rs --- src/test/run-pass/backtrace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/run-pass/backtrace.rs b/src/test/run-pass/backtrace.rs index 3e1ae730e4af3..f5a01d80d1588 100644 --- a/src/test/run-pass/backtrace.rs +++ b/src/test/run-pass/backtrace.rs @@ -53,7 +53,7 @@ fn expected(fn_name: &str) -> String { fn runtest(me: &str) { // Make sure that the stack trace is printed - let p = template(me).arg("fail").env("RUST_BACKTRACE", "1").spawn().unwrap(); + let p = template(me).arg("fail").env("RUST_BACKTRACE", "full").spawn().unwrap(); let out = p.wait_with_output().unwrap(); assert!(!out.status.success()); let s = str::from_utf8(&out.stderr).unwrap(); From 7663b93cc9bce0a2ec8fcfb4b27abf213975779e Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Sun, 8 Apr 2018 11:19:01 +0200 Subject: [PATCH 08/11] A bit more iterator like --- src/libstd/sys_common/backtrace.rs | 47 +++++++++++++++++------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index d09bc9374193f..42d4be98885ac 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -76,7 +76,7 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { } writeln!(w, "stack backtrace:")?; - for (index, frame, _is_on_filter_edge) in filtered_frames { + for (index, frame) in filtered_frames { resolve_symname(*frame, |symname| { output(w, index, *frame, symname, format) }, &context)?; @@ -129,36 +129,41 @@ fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { /// If the bool is true the frame is on the edge between showing and not showing. fn filter_frames<'a>(frames: &'a [Frame], context: &BacktraceContext, - format: PrintFormat) -> Vec<(usize, &'a Frame, bool)> + format: PrintFormat) -> Vec<(usize, &'a Frame)> { - let mut frames_iter = frames.iter().enumerate().peekable(); + if format == PrintFormat::Full { + return frames.iter().enumerate().collect(); + } + + let mut frames_iter = frames + .iter() + .enumerate() + .peekable() + .take_while(|frame| { + let mut is_after_begin_short_backtrace = false; + let _ = resolve_symname(*frame, |symname| { + if let Some(mangled_symbol_name) = symname { + // Use grep to find the concerned functions + if mangled_symbol_name.contains("__rust_begin_short_backtrace") { + is_after_begin_short_backtrace = true; + } + } + Ok(()) + }, context); + !is_after_begin_short_backtrace + }); + let mut filtered_frames = Vec::new(); let mut show_prev_frame = false; while let Some((i, frame)) = frames_iter.next() { - let mut is_after_begin_short_backtrace = false; - let _ = resolve_symname(*frame, |symname| { - if let Some(mangled_symbol_name) = symname { - // Use grep to find the concerned functions - if mangled_symbol_name.contains("__rust_begin_short_backtrace") { - is_after_begin_short_backtrace = true; - } - } - Ok(()) - }, context); - if is_after_begin_short_backtrace && format != PrintFormat::Full { - break; - } - let show_cur_frame = should_show_frame(frame, context); let show_next_frame = frames_iter .peek() .map(|&(_, frame)| should_show_frame(frame, context)) .unwrap_or(false); - if show_cur_frame { - filtered_frames.push((i, frame, false)); - } else if show_prev_frame || show_next_frame || format == PrintFormat::Full { - filtered_frames.push((i, frame, true)); + if show_prev_frame || show_cur_frame || show_next_frame { + filtered_frames.push((i, frame)); } show_prev_frame = show_cur_frame; } From 0c4e2d206e931578f65d745408fb6eae1cf427ce Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Mon, 16 Apr 2018 20:14:36 +0200 Subject: [PATCH 09/11] Use an iterator instead of a vec --- src/libstd/lib.rs | 1 + src/libstd/sys_common/backtrace.rs | 72 ++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index d7d856fe3ad06..b72e75bcb52f7 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -255,6 +255,7 @@ #![feature(char_internals)] #![feature(collections_range)] #![feature(compiler_builtins_lib)] +#![feature(conservative_impl_trait)] #![feature(const_fn)] #![feature(core_float)] #![feature(core_intrinsics)] diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs index 42d4be98885ac..08e6d5a62ab64 100644 --- a/src/libstd/sys_common/backtrace.rs +++ b/src/libstd/sys_common/backtrace.rs @@ -70,7 +70,7 @@ fn _print(w: &mut Write, format: PrintFormat) -> io::Result<()> { }; MAX_NB_FRAMES]; let (nb_frames, context) = unwind_backtrace(&mut frames)?; let filtered_frames = filter_frames(&frames[..nb_frames], &context, format); - if filtered_frames.len() != nb_frames { + if format != PrintFormat::Full { writeln!(w, "note: Some details are omitted, \ run with `RUST_BACKTRACE=full` for a verbose backtrace.")?; } @@ -128,20 +128,18 @@ fn should_show_frame(frame: &Frame, context: &BacktraceContext) -> bool { /// Returns the frames to show as a Vec. /// If the bool is true the frame is on the edge between showing and not showing. fn filter_frames<'a>(frames: &'a [Frame], - context: &BacktraceContext, - format: PrintFormat) -> Vec<(usize, &'a Frame)> + context: &'a BacktraceContext, + format: PrintFormat) -> impl Iterator + 'a { if format == PrintFormat::Full { - return frames.iter().enumerate().collect(); + return FilterFrames::Pass(frames.iter().enumerate()); } - let mut frames_iter = frames + let frames_iter = frames .iter() - .enumerate() - .peekable() - .take_while(|frame| { + .take_while(move |frame| { let mut is_after_begin_short_backtrace = false; - let _ = resolve_symname(*frame, |symname| { + let _ = resolve_symname(**frame, |symname| { if let Some(mangled_symbol_name) = symname { // Use grep to find the concerned functions if mangled_symbol_name.contains("__rust_begin_short_backtrace") { @@ -151,26 +149,52 @@ fn filter_frames<'a>(frames: &'a [Frame], Ok(()) }, context); !is_after_begin_short_backtrace - }); + }) + .enumerate() + .peekable(); - let mut filtered_frames = Vec::new(); - let mut show_prev_frame = false; - - while let Some((i, frame)) = frames_iter.next() { - let show_cur_frame = should_show_frame(frame, context); - let show_next_frame = frames_iter - .peek() - .map(|&(_, frame)| should_show_frame(frame, context)) - .unwrap_or(false); - if show_prev_frame || show_cur_frame || show_next_frame { - filtered_frames.push((i, frame)); - } - show_prev_frame = show_cur_frame; + FilterFrames::Filter { + show_prev_frame: false, + context: context, + iter: frames_iter, } +} - filtered_frames +enum FilterFrames<'a, I: ::iter::Iterator> { + Filter { + show_prev_frame: bool, + context: &'a BacktraceContext, + iter: ::iter::Peekable, + }, + Pass(::iter::Enumerate<::slice::Iter<'a, Frame>>), } +impl<'a, I: ::iter::Iterator> ::iter::Iterator for FilterFrames<'a, I> { + type Item = (usize, &'a Frame); + + fn next(&mut self) -> Option<(usize, &'a Frame)> { + match *self { + FilterFrames::Filter { ref mut show_prev_frame, ref mut context, ref mut iter } => { + while let Some((i, frame)) = iter.next() { + let show_cur_frame = should_show_frame(frame, context); + let show_next_frame = iter + .peek() + .map(|&(_, frame)| should_show_frame(frame, context)) + .unwrap_or(false); + if *show_prev_frame || show_cur_frame || show_next_frame { + *show_prev_frame = show_cur_frame; + return Some((i, frame)); + } + *show_prev_frame = show_cur_frame; + } + None + } + FilterFrames::Pass(ref mut iter) => { + iter.next() + } + } + } +} /// Fixed frame used to clean the backtrace with `RUST_BACKTRACE=1`. #[inline(never)] From d87fd39d185877ee2f199abae3bc02276911d488 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Tue, 17 Apr 2018 08:19:59 +0200 Subject: [PATCH 10/11] Remove now stable feature gate --- src/libstd/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index b72e75bcb52f7..d7d856fe3ad06 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -255,7 +255,6 @@ #![feature(char_internals)] #![feature(collections_range)] #![feature(compiler_builtins_lib)] -#![feature(conservative_impl_trait)] #![feature(const_fn)] #![feature(core_float)] #![feature(core_intrinsics)] From 313dfd5e7a030ff987a8ada4b991c829551d419e Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Wed, 18 Apr 2018 14:21:09 +0200 Subject: [PATCH 11/11] Add debug cat to test --- src/test/run-make/filter_backtrace/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/run-make/filter_backtrace/Makefile b/src/test/run-make/filter_backtrace/Makefile index 5deaaf1d87c44..ecfd3d4da857a 100644 --- a/src/test/run-make/filter_backtrace/Makefile +++ b/src/test/run-make/filter_backtrace/Makefile @@ -6,6 +6,7 @@ all: $(RUSTC) main.rs -o $(TMPDIR)/main # with short backtrace RUST_BACKTRACE=1 $(TMPDIR)/main 2> $(TMPDIR)/short_bt.stderr || exit 0 && exit 1 + cat $(TMPDIR)/short_bt.stderr # FIXME: remove this debug cat $(CGREP) "panicked at" < $(TMPDIR)/short_bt.stderr $(CGREP) -v "std::panicking" < $(TMPDIR)/short_bt.stderr $(CGREP) -v "std::sys" < $(TMPDIR)/short_bt.stderr @@ -13,6 +14,7 @@ all: $(CGREP) -v "__rust_begin_short_backtrace" < $(TMPDIR)/short_bt.stderr # with long backtrace RUST_BACKTRACE=full $(TMPDIR)/main 2> $(TMPDIR)/long_bt.stderr || exit 0 && exit 1 + cat $(TMPDIR)/long_bt.stderr # FIXME: remove this debug cat $(CGREP) "panicked at" < $(TMPDIR)/long_bt.stderr $(CGREP) "std::panicking" < $(TMPDIR)/long_bt.stderr $(CGREP) "std::sys" < $(TMPDIR)/long_bt.stderr