0 Tage Serie
rust / expert
Snippet

Abfangen von Thread-Panics mit benutzerdefinierten globalen Panic-Hooks

Bei fortgeschrittenen Tests oder Multithreading-Diagnosen erfasst die Standard-Panic-Behandlung möglicherweise keine ausreichende Kontexttelemetrie oder erhöht keine Metrikzähler. Durch Registrieren eines benutzerdefinierten Panic-Hooks können Sie abstürzende Threads abfangen, Thread-Metadaten aufzeichnen, atomare Diagnosezähler aktualisieren und an die Standard-Panic-Ausgabe anknüpfen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use std::panic;
use std::thread;
use std::sync::atomic::{AtomicUsize, Ordering};
static PANIC_COUNT: AtomicUsize = AtomicUsize::new(0);
pub fn setup_diagnostic_panic_hook() {
let default_hook = panic::take_hook();
panic::set_hook(Box::new(move |panic_info| {
PANIC_COUNT.fetch_add(1, Ordering::SeqCst);
let thread = thread::current();
let thread_name = thread.name().unwrap_or("<unnamed>");
eprintln!(
"Thread '{}' encountered panic. Hook state: {:?}",
thread_name, panic_info
);
default_hook(panic_info);
}));
}
Erklärung
1
let default_hook = panic::take_hook();
Ruft den aktuellen Panic-Hook-Wrapper ab, sodass der benutzerdefinierte Hook die Ausführung an das Standardverhalten weiterleiten kann.
2
panic::set_hook(Box::new(move |panic_info| {
Registriert eine neue globale Closure als Handler für Thread-Panics über die gesamte Lebensdauer der Anwendung hinweg.
3
PANIC_COUNT.fetch_add(1, Ordering::SeqCst);
Verwendet atomare Ordnung, um den globalen Panic-Tracker threadsicher zu inkrementieren.