diff --git a/Cargo.lock b/Cargo.lock index f3927c6c95b7431301401e12d5da803cc2a7d455..6025f75abddc9c76274fc18393dec55ab7e4999d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4043,6 +4043,7 @@ dependencies = [ "smol", "system_specs", "workspace-hack", + "zstd", ] [[package]] diff --git a/crates/crashes/Cargo.toml b/crates/crashes/Cargo.toml index 370f0bb5f6b1088e0a5af90e786b937283072e73..9af416cbb0801c68e1a9a85b37a1b80c52da476c 100644 --- a/crates/crashes/Cargo.toml +++ b/crates/crashes/Cargo.toml @@ -17,6 +17,7 @@ serde.workspace = true serde_json.workspace = true system_specs.workspace = true workspace-hack.workspace = true +zstd.workspace = true [target.'cfg(target_os = "macos")'.dependencies] mach2.workspace = true diff --git a/crates/crashes/src/crashes.rs b/crates/crashes/src/crashes.rs index f7bc96bff93afff70970e1a5f9488048005ec4b3..f867f6cbdd6d1e0aa1dab8d7e4cd188295ace480 100644 --- a/crates/crashes/src/crashes.rs +++ b/crates/crashes/src/crashes.rs @@ -172,9 +172,16 @@ impl minidumper::ServerHandler for CrashServer { fn on_minidump_created(&self, result: Result) -> LoopAction { let minidump_error = match result { - Ok(mut md_bin) => { + Ok(MinidumpBinary { mut file, path, .. }) => { use io::Write; - let _ = md_bin.file.flush(); + file.flush().ok(); + // TODO: clean this up once https://github.com/EmbarkStudios/crash-handling/issues/101 is addressed + drop(file); + let original_file = File::open(&path).unwrap(); + let compressed_path = path.with_extension("zstd"); + let compressed_file = File::create(&compressed_path).unwrap(); + zstd::stream::copy_encode(original_file, compressed_file, 0).ok(); + fs::rename(&compressed_path, path).unwrap(); None } Err(e) => Some(format!("{e:?}")), diff --git a/crates/zed/src/reliability.rs b/crates/zed/src/reliability.rs index 9c12a5f1466323cf22233156d1e9bde741f10fa6..544fac226e3f80042104cfd1575c28e244100b3d 100644 --- a/crates/zed/src/reliability.rs +++ b/crates/zed/src/reliability.rs @@ -60,7 +60,9 @@ pub fn init_panic_hook( .or_else(|| info.payload().downcast_ref::().cloned()) .unwrap_or_else(|| "Box".to_string()); - if *release_channel::RELEASE_CHANNEL != ReleaseChannel::Dev { + if *release_channel::RELEASE_CHANNEL != ReleaseChannel::Dev + || env::var("ZED_GENERATE_MINIDUMPS").is_ok() + { crashes::handle_panic(payload.clone(), info.location()); }