xref: /aosp_15_r20/external/crosvm/src/sys/windows/panic_hook.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::panic;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::process::abort;
7*bb4ee6a4SAndroid Build Coastguard Worker 
8*bb4ee6a4SAndroid Build Coastguard Worker /// The intent of our panic hook is to get panic info and a stacktrace into the syslog, even for
9*bb4ee6a4SAndroid Build Coastguard Worker /// jailed subprocesses. It will always abort on panic to ensure a minidump is generated.
10*bb4ee6a4SAndroid Build Coastguard Worker ///
11*bb4ee6a4SAndroid Build Coastguard Worker /// Note that jailed processes will usually have a stacktrace of \<unknown\> because the backtrace
12*bb4ee6a4SAndroid Build Coastguard Worker /// routines attempt to open this binary and are unable to do so in a jail.
set_panic_hook()13*bb4ee6a4SAndroid Build Coastguard Worker pub fn set_panic_hook() {
14*bb4ee6a4SAndroid Build Coastguard Worker     let default_panic = panic::take_hook();
15*bb4ee6a4SAndroid Build Coastguard Worker     panic::set_hook(Box::new(move |info| {
16*bb4ee6a4SAndroid Build Coastguard Worker         // Ensure all in-flight metrics are fully flushed
17*bb4ee6a4SAndroid Build Coastguard Worker         metrics::get_destructor().cleanup();
18*bb4ee6a4SAndroid Build Coastguard Worker         // TODO(b/144724919): should update log_panic_info for this "cleanly exit crosvm" bug
19*bb4ee6a4SAndroid Build Coastguard Worker         // log_panic_info(default_panic.as_ref(), info);
20*bb4ee6a4SAndroid Build Coastguard Worker         default_panic(info);
21*bb4ee6a4SAndroid Build Coastguard Worker         // Abort to trigger the crash reporter so that a minidump is generated.
22*bb4ee6a4SAndroid Build Coastguard Worker         abort();
23*bb4ee6a4SAndroid Build Coastguard Worker     }));
24*bb4ee6a4SAndroid Build Coastguard Worker }
25