mirror of
https://github.com/servo/servo.git
synced 2025-06-25 01:24:37 +01:00
Improve winit/mach segfault output This patch improves the output that you see when the winit port segfaults, especially when the segfault happens on a layout or script thread, by making two changes to our crash handler and one change to mach. * we make the crash handler use stderr instead of stdout, because [std::io::stdout](https://doc.rust-lang.org/std/io/fn.stdout.html) allocates when first called, which will often cause a second segfault * we make the crash handler reraise the signal to terminate abnormally, allowing mach to distinguish it from exiting normally with the same status code as a signal number * we make mach print different messages for whether the process terminated by signal or exited normally You can try this yourself by running servo with the following patch: ```diff diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index ac1a7fe21e..77c4c9d087 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -589,6 +589,7 @@ impl LayoutThread { rw_data: &rw_data, possibly_locked_rw_data: &mut possibly_locked_rw_data, }; + unsafe { std::ptr::read::<usize>(std::ptr::null()); } while self.handle_request(&mut rw_data) { // Loop indefinitely. } ``` Before: ``` $ ./mach run -d about:blank [should print “Stack trace for "Layout(1,1)"” here, but segfaults] Servo exited with return value 11 ``` After: ``` $ ./mach run -d about:blank Caught signal 11 in thread "Layout(1,1)" [should ideally print backtrace here, but segfaults] Servo was terminated by signal 11 ``` --- <!-- 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 #29442 <!-- Either: --> - [ ] There are tests for these changes OR - [x] These changes do not require tests because it would be impractical to test them (r? @jdm, @SimonSapin based on git log for crash handler) |
||
---|---|---|
.. | ||
gstplugin | ||
libmlservo | ||
libsimpleservo | ||
winit |