| //! Test that with `-C panic=abort` the backtrace is not cut off by default | |
| //! (i.e. without using `-C force-unwind-tables=yes`) by ensuring that our own | |
| //! functions are in the backtrace. If we just check one function it might be | |
| //! the last function, so make sure the backtrace can continue by checking for | |
| //! two functions. Regression test for | |
| //! <https://github.com/rust-lang/rust/issues/81902>. | |
| //@ run-pass | |
| //@ needs-subprocess | |
| // We want to test if unwind tables are emitted by default. We must make sure | |
| // to disable debuginfo to test that, because enabling debuginfo also means that | |
| // unwind tables are emitted, which prevents us from testing what we want. | |
| // We also need to set opt-level=0 to avoid optimizing away our functions. | |
| //@ compile-flags: -C panic=abort -C opt-level=0 -C debuginfo=0 | |
| //@ no-prefer-dynamic | |
| //@ ignore-apple | |
| //@ ignore-arm-unknown-linux-gnueabihf FIXME(#146996) Try removing this once #146996 has been fixed. | |
| //@ ignore-msvc Backtraces on Windows requires debuginfo which we can't use here | |
| //@ ignore-backends: gcc | |
| static FN_1: &str = "this_function_must_be_in_the_backtrace"; | |
| fn this_function_must_be_in_the_backtrace() { | |
| and_this_function_too(); | |
| } | |
| static FN_2: &str = "and_this_function_too"; | |
| fn and_this_function_too() { | |
| panic!("generate panic backtrace"); | |
| } | |
| fn run_test() { | |
| let output = std::process::Command::new(std::env::current_exe().unwrap()) | |
| .arg("whatever") | |
| .env("RUST_BACKTRACE", "full") | |
| .output() | |
| .unwrap(); | |
| let backtrace = std::str::from_utf8(&output.stderr).unwrap(); | |
| fn assert(function_name: &str, backtrace: &str) { | |
| assert!( | |
| backtrace.contains(function_name), | |
| "ERROR: no `{}` in stderr! actual stderr: {}", | |
| function_name, | |
| backtrace | |
| ); | |
| } | |
| assert(FN_1, backtrace); | |
| assert(FN_2, backtrace); | |
| } | |
| fn main() { | |
| let args: Vec<String> = std::env::args().collect(); | |
| if args.len() == 1 { | |
| run_test(); | |
| } else { | |
| this_function_must_be_in_the_backtrace(); | |
| } | |
| } |