servo: Merge #11530 - Obtain backtraces automatically from segfaults (from jdm:sigsegv); r=metajack

<!-- Please describe your changes on the following line: -->
This enables more meaningful output from observing hard crashes outside of GDB through the judicious use of a SIGSEGV signal handler.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #9371 (github issue number if applicable).
- [X] There are tests for these changes OR

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

Source-Repo: https://github.com/servo/servo
Source-Revision: 2c4c2d8779a185a2da264f1ac11eb68b0d492fd0
This commit is contained in:
Josh Matthews 2016-06-20 20:08:50 -05:00
parent e8ce6091a4
commit 1e1b010417
7 changed files with 65 additions and 1 deletions

View File

@ -571,6 +571,15 @@ impl TestBindingMethods for TestBinding {
fn FuncControlledAttributeEnabled(&self) -> bool { false }
fn FuncControlledMethodDisabled(&self) {}
fn FuncControlledMethodEnabled(&self) {}
#[allow(unsafe_code)]
fn CrashHard(&self) {
static READ_ONLY_VALUE: i32 = 0;
unsafe {
let p: *mut u32 = &READ_ONLY_VALUE as *const _ as *mut _;
ptr::write_volatile(p, 0xbaadc0de);
}
}
}
impl TestBinding {

View File

@ -456,3 +456,8 @@ interface TestBinding {
[Func="TestBinding::condition_satisfied"]
const unsigned short funcControlledConstEnabled = 0;
};
partial interface TestBinding {
[Pref="dom.testable_crash.enabled"]
void crashHard();
};

View File

@ -3,6 +3,7 @@ name = "servo"
version = "0.0.1"
dependencies = [
"android_glue 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"backtrace 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"browserhtml 0.1.7 (git+https://github.com/browserhtml/browserhtml?branch=gh-pages)",
"canvas 0.0.1",
"canvas_traits 0.0.1",
@ -37,6 +38,7 @@ dependencies = [
"script_layout_interface 0.0.1",
"script_tests 0.0.1",
"script_traits 0.0.1",
"sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"style 0.0.1",
"style_tests 0.0.1",
"url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2159,6 +2161,11 @@ dependencies = [
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "sig"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "simd"
version = "0.1.0"

View File

@ -75,6 +75,10 @@ euclid = "0.6.4"
libc = "0.2"
url = "1.0.0"
[target.'cfg(not(target_os = "android"))'.dependencies]
sig = "0.1"
backtrace = "0.2"
[target.'cfg(target_os = "android")'.dependencies]
log = "0.3"
android_glue = "0.1.3"

View File

@ -15,11 +15,13 @@
//!
//! [glutin]: https://github.com/tomaka/glutin
#![feature(start)]
#![feature(start, core_intrinsics)]
#[cfg(target_os = "android")]
#[macro_use]
extern crate android_glue;
#[cfg(not(target_os = "android"))]
extern crate backtrace;
extern crate env_logger;
// The window backed by glutin
extern crate glutin_app as app;
@ -30,6 +32,9 @@ extern crate libc;
extern crate log;
// The Servo engine
extern crate servo;
#[cfg(not(target_os = "android"))]
#[macro_use]
extern crate sig;
use servo::Browser;
use servo::compositing::windowing::WindowEvent;
@ -48,7 +53,33 @@ pub mod platform {
pub fn deinit() {}
}
#[cfg(not(target_os = "android"))]
fn install_crash_handler() {
use backtrace::Backtrace;
use sig::ffi::Sig;
use std::intrinsics::abort;
use std::thread;
fn handler(_sig: i32) {
let name = thread::current().name()
.map(|n| format!(" for thread \"{}\"", n))
.unwrap_or("".to_owned());
println!("Stack trace{}\n{:?}", name, Backtrace::new());
unsafe {
abort();
}
}
signal!(Sig::SEGV, handler);
}
#[cfg(target_os = "android")]
fn install_crash_handler() {
}
fn main() {
install_crash_handler();
// Parse the command line options and store them globally
let opts_result = opts::from_cmdline_args(&*args());

View File

@ -1909,6 +1909,7 @@ name = "servo"
version = "0.0.1"
dependencies = [
"android_glue 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"backtrace 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"browserhtml 0.1.7 (git+https://github.com/browserhtml/browserhtml?branch=gh-pages)",
"canvas 0.0.1",
"canvas_traits 0.0.1",
@ -1935,6 +1936,7 @@ dependencies = [
"script 0.0.1",
"script_layout_interface 0.0.1",
"script_traits 0.0.1",
"sig 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"style 0.0.1",
"url 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"util 0.0.1",
@ -2044,6 +2046,11 @@ dependencies = [
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "sig"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "simd"
version = "0.1.0"

View File

@ -4,6 +4,7 @@
"dom.mouseevent.which.enabled": false,
"dom.mozbrowser.enabled": false,
"dom.serviceworker.timeout_seconds": 60,
"dom.testable_crash.enabled": false,
"dom.testbinding.enabled": false,
"gfx.webrender.enabled": false,
"js.baseline.enabled": true,