Print backtraces for panics, even if the constellation has closed.

This commit is contained in:
Alan Jeffrey 2016-07-29 13:08:21 -05:00
parent 0f1a9f109d
commit 341b9de43b
2 changed files with 12 additions and 5 deletions

View file

@ -1090,7 +1090,7 @@ impl<Message, LTF, STF> Constellation<Message, LTF, STF>
if opts::get().hard_fail { if opts::get().hard_fail {
// It's quite difficult to make Servo exit cleanly if some threads have failed. // It's quite difficult to make Servo exit cleanly if some threads have failed.
// Hard fail exists for test runners so we crash and that's good enough. // Hard fail exists for test runners so we crash and that's good enough.
println!("Pipeline failed in hard-fail mode. Crashing!\n{}\n{}", reason, backtrace.unwrap_or_default()); println!("Pipeline failed in hard-fail mode. Crashing!");
process::exit(1); process::exit(1);
} }

View file

@ -34,10 +34,12 @@ extern crate servo;
#[macro_use] #[macro_use]
extern crate sig; extern crate sig;
use backtrace::Backtrace;
use servo::Browser; use servo::Browser;
use servo::compositing::windowing::WindowEvent; use servo::compositing::windowing::WindowEvent;
use servo::util::opts::{self, ArgumentParsingResult}; use servo::util::opts::{self, ArgumentParsingResult};
use servo::util::servo_version; use servo::util::servo_version;
use std::env;
use std::panic; use std::panic;
use std::process; use std::process;
use std::rc::Rc; use std::rc::Rc;
@ -97,8 +99,8 @@ fn main() {
None None
}; };
// TODO: once log-panics is released, this can be replaced by // TODO: once log-panics is released, can this be replaced by
// log_panics::init(); // log_panics::init()?
panic::set_hook(Box::new(|info| { panic::set_hook(Box::new(|info| {
warn!("Panic hook called."); warn!("Panic hook called.");
let msg = match info.payload().downcast_ref::<&'static str>() { let msg = match info.payload().downcast_ref::<&'static str>() {
@ -111,10 +113,15 @@ fn main() {
let current_thread = thread::current(); let current_thread = thread::current();
let name = current_thread.name().unwrap_or("<unnamed>"); let name = current_thread.name().unwrap_or("<unnamed>");
if let Some(location) = info.location() { if let Some(location) = info.location() {
error!("{} (thread {}, at {}:{})", msg, name, location.file(), location.line()); println!("{} (thread {}, at {}:{})", msg, name, location.file(), location.line());
} else { } else {
error!("{} (thread {})", msg, name); println!("{} (thread {})", msg, name);
} }
if env::var("RUST_BACKTRACE").is_ok() {
println!("{:?}", Backtrace::new());
}
error!("{}", msg);
})); }));
setup_logging(); setup_logging();