diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 4c75d370d5..ccf381b5b1 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -36,7 +36,7 @@ use std::{ path::{Path, PathBuf}, str, sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU32, Ordering}, Arc, Weak, }, thread, @@ -405,11 +405,18 @@ struct PanicRequest { token: String, } +static PANIC_COUNT: AtomicU32 = AtomicU32::new(0); + fn init_panic_hook(app: &App, installation_id: Option) { let is_pty = stdout_is_a_pty(); let platform = app.platform(); panic::set_hook(Box::new(move |info| { + let prior_panic_count = PANIC_COUNT.fetch_add(1, Ordering::SeqCst); + if prior_panic_count > 0 { + std::panic::resume_unwind(Box::new(())); + } + let app_version = ZED_APP_VERSION .or_else(|| platform.app_version().ok()) .map_or("dev".to_string(), |v| v.to_string()); @@ -464,7 +471,6 @@ fn init_panic_hook(app: &App, installation_id: Option) { if is_pty { if let Some(panic_data_json) = serde_json::to_string_pretty(&panic_data).log_err() { eprintln!("{}", panic_data_json); - return; } } else { if let Some(panic_data_json) = serde_json::to_string(&panic_data).log_err() { @@ -481,6 +487,8 @@ fn init_panic_hook(app: &App, installation_id: Option) { } } } + + std::process::abort(); })); }