Bug 1688882 - Always inform the main process that a minidump has been generated, even if it's incomplete r=gsvelto

Differential Revision: https://phabricator.services.mozilla.com/D103041
This commit is contained in:
M. Sirringhaus 2021-01-28 14:17:34 +00:00
Родитель fdf40620bf
Коммит 5d4a325c23
8 изменённых файлов: 114 добавлений и 47 удалений

Просмотреть файл

@ -20,7 +20,7 @@ rev = "4af6c367603869a30fddb5ffb0aba2b9477ba92e"
[source."https://github.com/msirringhaus/minidump_writer_linux.git"]
git = "https://github.com/msirringhaus/minidump_writer_linux.git"
replace-with = "vendored-sources"
rev = "4ea371049a9cca212cc13c19b7952c1c014085c6"
rev = "43c33ea35e9d97259a3877c115cbd3527c10b33a"
[source."https://github.com/mozilla/neqo"]
git = "https://github.com/mozilla/neqo"

2
Cargo.lock сгенерированный
Просмотреть файл

@ -3124,7 +3124,7 @@ dependencies = [
[[package]]
name = "minidump_writer_linux"
version = "0.1.0"
source = "git+https://github.com/msirringhaus/minidump_writer_linux.git?rev=4ea371049a9cca212cc13c19b7952c1c014085c6#4ea371049a9cca212cc13c19b7952c1c014085c6"
source = "git+https://github.com/msirringhaus/minidump_writer_linux.git?rev=43c33ea35e9d97259a3877c115cbd3527c10b33a#43c33ea35e9d97259a3877c115cbd3527c10b33a"
dependencies = [
"byteorder",
"goblin",

Просмотреть файл

@ -81,7 +81,7 @@ spirv_cross = { git = "https://github.com/kvark/spirv_cross", branch = "wgpu4" }
# failure's backtrace feature might break our builds, see bug 1608157.
failure = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" }
failure_derive = { git = "https://github.com/badboy/failure", rev = "64af847bc5fdcb6d2438bec8a6030812a80519a5" }
minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "4ea371049a9cca212cc13c19b7952c1c014085c6" }
minidump_writer_linux = { git = "https://github.com/msirringhaus/minidump_writer_linux.git", rev = "43c33ea35e9d97259a3877c115cbd3527c10b33a" }
[patch.crates-io.cranelift-codegen]
git = "https://github.com/mozilla-spidermonkey/wasmtime"

Просмотреть файл

@ -1 +1 @@
{"files":{"Cargo.toml":"d83f06b41499b1f763f31498c5412b946a09b93454555140f37b0edd66959e4b","LICENSE":"1ecdd8e8977af83c07c5f97bec87b47d27059b7ea323ca3160fbfa2314f5d99c","src/app_memory.rs":"909676c916c0ffaa3a813632c162f5b1207f8502408b6b3bab48a5f842948c71","src/auxv_reader.rs":"6aff2c1ef3ad0942b93445f5098b07789afbce512f6b4055e9c195df307aea27","src/bin/test.rs":"2278080fd4a13ec5423cb99d7e97a677ea6d73e29c7a99038175ee7a9dfe9c4f","src/cpu_set.rs":"7094f972a7217bf20eeb5b504802177b7aa5dd6cf220235e858fc42259c52f59","src/crash_context/crash_context_aarch64.rs":"97da8a6a66a53ebee4e329c4b01c0a68e74d707adbfb6f2e3ed6fd4318289d0f","src/crash_context/crash_context_arm.rs":"ddf1be0f67e4f43dfae8373d1b902065c671435bbeb7cf4428b2bcb218a1c25a","src/crash_context/crash_context_mips.rs":"3e263d547a3f13ee81d1557a13db6bbd446133821986c2ded94d361634ec1f3a","src/crash_context/crash_context_x86.rs":"8c8566be3c103ec65c83e8f9b2ad4f7a6f19f17656be4b4deed50d7723cc57d8","src/crash_context/crash_context_x86_64.rs":"c658a81a31d66a38c52ffbe816e3945301173f9e6e98c795a822a06be40968bc","src/crash_context/mod.rs":"1578792d46480a79982943ee3b820958ea335a847bbb6b74f44bead6edf17078","src/dso_debug.rs":"c11c6c4d64974042051f000818ac4c3a8895ed2757076612f9209e885d2d5d33","src/dumper_cpu_info/cpu_info_arm.rs":"137953f8424ffb38f89f8fc436a462a64b42583ab36d00d897a81e297736d2d9","src/dumper_cpu_info/cpu_info_x86_mips.rs":"c42db73377cee066f9d4ddca13a77a0692eef513fcefde1f2b91dacce6778f89","src/dumper_cpu_info/mod.rs":"320b629c23ffa30eaead762a74e500f0bc029793234461ef2959681b7650b1e9","src/lib.rs":"87375f3a4cfadb91fd366cb75e1959a08e654e5225955ed56e15d6fc9d208aa0","src/linux_ptrace_dumper.rs":"7095c6adc0d94283a90bdd97a9458df29a7bf2685624e568bc1be8fb1a223baf","src/maps_reader.rs":"7333d74e635b1b7653df25411e23f133c2025e835339f38bf44d7ae5c29e001a","src/minidump_cpu/minidump_cpu_aarch64.rs":"18524f8a3a3d3eda7d0fafb1c168ff06dee1886da0f4278f3c2a54147ef79bc9","src/minidump_cpu/minidump_cpu_amd64.rs":"c4b3cef86ea53864c026d7c598d8a7f59ca6b1ad7e881f94ce34f39dd6b72e33","src/minidump_cpu/minidump_cpu_arm.rs":"2b95ecef302de39a0c105011392dc1419dd3f62762482038318f564d5ed3797a","src/minidump_cpu/minidump_cpu_mips.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc64.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_sparc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_x86.rs":"3dcb2aa4264d76f0727b9750ffce0032738bea97be95fde92089a9d11926c63c","src/minidump_cpu/mod.rs":"50e8df5e294e9d162c97dacb9448bba0ffc1e4bf992f8a2b9cc718f12b92a370","src/minidump_format.rs":"56f737bd95fbbd5b4b3d7773dc491e267887d78b12916645bccbcef16acf2cfc","src/minidump_writer.rs":"5e5cf95b9efa7f8a8ad48c43c03e8a4101efee4206a4a14f92a5cdb676d5e6b6","src/sections/app_memory.rs":"13074b16ffbd144e0cc209ad2cb64571dbb74ba987f65026338645d440e3cd89","src/sections/exception_stream.rs":"08562fcd73e48ce5d251080504526f4f7e65f536325da816f69ff0d8354f4bc4","src/sections/mappings.rs":"15d489a3d053627c793a6794c85bc9d38d72a7299e496142cc38afa2c2a8d54c","src/sections/memory_list_stream.rs":"c15ec66f844122f98d553be501e881837275709d0d8e5ec4ecf4d076fcaf79d7","src/sections/mod.rs":"71911a6265365b75e74b87a83754ae60af7f17bf1faf539450e3cd1dc9a9f0c0","src/sections/systeminfo_stream.rs":"70f8d62a86a874536edfeb9ad0a47916fe90934ae0b29b61ed871335ac2f776f","src/sections/thread_list_stream.rs":"f69de2e50c033d5a1c6a597b942025a6442e71158f376c6afcfe6f3ac929dad7","src/thread_info/mod.rs":"d86206025f4a9612caa90391231403c9bc6512a85309eb4f53b95826ad837215","src/thread_info/thread_info_aarch64.rs":"941bcf68a03d647b946bda2e1542d8965b827e392eb3e4fb4e0193f7e300e12c","src/thread_info/thread_info_arm.rs":"60a9008a4e4d156777b7a3b3d0ef28ec4f97fda217759cdf211e604f9dc9bbd6","src/thread_info/thread_info_mips.rs":"203d1219e81da1f33ac06f36d94eb1452ab9a57cb3ca5258a1a60a0f2c5706d0","src/thread_info/thread_info_x86.rs":"ee9669fd29b295dbded39b1010be5bf9d4100462bb611e2065eb744919197874","tests/common/mod.rs":"19479260f662649f9cdf001c4076614c1e943ae72bce702ef1eed1f48b3beefe","tests/minidump_writer.rs":"dbccfe2a720cee6db6cc16457982c82c1e1ffd0d0d025eaab183befe9925294e","tests/ptrace_dumper.rs":"5d3438f82a9966cd316ec204b977cc674b9dec2f482ecf9f75f92184d39ed58c"},"package":null}
{"files":{"Cargo.toml":"d83f06b41499b1f763f31498c5412b946a09b93454555140f37b0edd66959e4b","LICENSE":"1ecdd8e8977af83c07c5f97bec87b47d27059b7ea323ca3160fbfa2314f5d99c","src/app_memory.rs":"909676c916c0ffaa3a813632c162f5b1207f8502408b6b3bab48a5f842948c71","src/auxv_reader.rs":"6aff2c1ef3ad0942b93445f5098b07789afbce512f6b4055e9c195df307aea27","src/bin/test.rs":"2278080fd4a13ec5423cb99d7e97a677ea6d73e29c7a99038175ee7a9dfe9c4f","src/cpu_set.rs":"7094f972a7217bf20eeb5b504802177b7aa5dd6cf220235e858fc42259c52f59","src/crash_context/crash_context_aarch64.rs":"97da8a6a66a53ebee4e329c4b01c0a68e74d707adbfb6f2e3ed6fd4318289d0f","src/crash_context/crash_context_arm.rs":"ddf1be0f67e4f43dfae8373d1b902065c671435bbeb7cf4428b2bcb218a1c25a","src/crash_context/crash_context_mips.rs":"3e263d547a3f13ee81d1557a13db6bbd446133821986c2ded94d361634ec1f3a","src/crash_context/crash_context_x86.rs":"8c8566be3c103ec65c83e8f9b2ad4f7a6f19f17656be4b4deed50d7723cc57d8","src/crash_context/crash_context_x86_64.rs":"c658a81a31d66a38c52ffbe816e3945301173f9e6e98c795a822a06be40968bc","src/crash_context/mod.rs":"1578792d46480a79982943ee3b820958ea335a847bbb6b74f44bead6edf17078","src/dso_debug.rs":"c11c6c4d64974042051f000818ac4c3a8895ed2757076612f9209e885d2d5d33","src/dumper_cpu_info/cpu_info_arm.rs":"137953f8424ffb38f89f8fc436a462a64b42583ab36d00d897a81e297736d2d9","src/dumper_cpu_info/cpu_info_x86_mips.rs":"c42db73377cee066f9d4ddca13a77a0692eef513fcefde1f2b91dacce6778f89","src/dumper_cpu_info/mod.rs":"320b629c23ffa30eaead762a74e500f0bc029793234461ef2959681b7650b1e9","src/lib.rs":"87375f3a4cfadb91fd366cb75e1959a08e654e5225955ed56e15d6fc9d208aa0","src/linux_ptrace_dumper.rs":"792532413e1ff5455aef4dd886889339f7bca1ef6654aad5b12585bff0d00bbd","src/maps_reader.rs":"7333d74e635b1b7653df25411e23f133c2025e835339f38bf44d7ae5c29e001a","src/minidump_cpu/minidump_cpu_aarch64.rs":"18524f8a3a3d3eda7d0fafb1c168ff06dee1886da0f4278f3c2a54147ef79bc9","src/minidump_cpu/minidump_cpu_amd64.rs":"c4b3cef86ea53864c026d7c598d8a7f59ca6b1ad7e881f94ce34f39dd6b72e33","src/minidump_cpu/minidump_cpu_arm.rs":"2b95ecef302de39a0c105011392dc1419dd3f62762482038318f564d5ed3797a","src/minidump_cpu/minidump_cpu_mips.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_ppc64.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_sparc.rs":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","src/minidump_cpu/minidump_cpu_x86.rs":"3dcb2aa4264d76f0727b9750ffce0032738bea97be95fde92089a9d11926c63c","src/minidump_cpu/mod.rs":"50e8df5e294e9d162c97dacb9448bba0ffc1e4bf992f8a2b9cc718f12b92a370","src/minidump_format.rs":"56f737bd95fbbd5b4b3d7773dc491e267887d78b12916645bccbcef16acf2cfc","src/minidump_writer.rs":"5e5cf95b9efa7f8a8ad48c43c03e8a4101efee4206a4a14f92a5cdb676d5e6b6","src/sections/app_memory.rs":"13074b16ffbd144e0cc209ad2cb64571dbb74ba987f65026338645d440e3cd89","src/sections/exception_stream.rs":"08562fcd73e48ce5d251080504526f4f7e65f536325da816f69ff0d8354f4bc4","src/sections/mappings.rs":"15d489a3d053627c793a6794c85bc9d38d72a7299e496142cc38afa2c2a8d54c","src/sections/memory_list_stream.rs":"c15ec66f844122f98d553be501e881837275709d0d8e5ec4ecf4d076fcaf79d7","src/sections/mod.rs":"71911a6265365b75e74b87a83754ae60af7f17bf1faf539450e3cd1dc9a9f0c0","src/sections/systeminfo_stream.rs":"70f8d62a86a874536edfeb9ad0a47916fe90934ae0b29b61ed871335ac2f776f","src/sections/thread_list_stream.rs":"f69de2e50c033d5a1c6a597b942025a6442e71158f376c6afcfe6f3ac929dad7","src/thread_info/mod.rs":"d86206025f4a9612caa90391231403c9bc6512a85309eb4f53b95826ad837215","src/thread_info/thread_info_aarch64.rs":"941bcf68a03d647b946bda2e1542d8965b827e392eb3e4fb4e0193f7e300e12c","src/thread_info/thread_info_arm.rs":"60a9008a4e4d156777b7a3b3d0ef28ec4f97fda217759cdf211e604f9dc9bbd6","src/thread_info/thread_info_mips.rs":"203d1219e81da1f33ac06f36d94eb1452ab9a57cb3ca5258a1a60a0f2c5706d0","src/thread_info/thread_info_x86.rs":"ee9669fd29b295dbded39b1010be5bf9d4100462bb611e2065eb744919197874","tests/common/mod.rs":"19479260f662649f9cdf001c4076614c1e943ae72bce702ef1eed1f48b3beefe","tests/minidump_writer.rs":"c933d3cd951ac9c2c7fee7a8a55bfc9550cca7ebdeb9e4f25623002a4e643239","tests/ptrace_dumper.rs":"5d3438f82a9966cd316ec204b977cc674b9dec2f482ecf9f75f92184d39ed58c"},"package":null}

Просмотреть файл

@ -1,4 +1,6 @@
// use libc::c_void;
#[cfg(target_os = "android")]
use crate::android::late_process_mappings;
use crate::auxv_reader::{AuxvType, ProcfsAuxvIter};
use crate::maps_reader::{MappingInfo, MappingInfoParsingResult, DELETED_SUFFIX};
use crate::minidump_format::MDGUID;
@ -165,16 +167,17 @@ impl LinuxPtraceDumper {
fn enumerate_threads(&mut self) -> Result<()> {
let task_path = path::PathBuf::from(format!("/proc/{}/task", self.pid));
if task_path.is_dir() {
for entry in std::fs::read_dir(task_path)? {
let name = entry?
.file_name()
.to_str()
.ok_or("Unparsable filename")?
.parse::<Pid>();
if let Ok(tid) = name {
self.threads.push(tid);
}
}
std::fs::read_dir(task_path)?
.into_iter()
.filter_map(|entry| entry.ok()) // Filter out bad entries
.filter_map(|entry| {
entry
.file_name() // Parse name to Pid, filter out those that are unparsable
.to_str()
.and_then(|name| name.parse::<Pid>().ok())
})
.map(|tid| self.threads.push(tid)) // Push the resulting Pids
.count(); // Execute iterator
}
Ok(())
}
@ -184,11 +187,16 @@ impl LinuxPtraceDumper {
let auxv_file = std::fs::File::open(auxv_path)?;
let input = BufReader::new(auxv_file);
let reader = ProcfsAuxvIter::new(input);
for item in reader {
let item = item?;
self.auxv.insert(item.key, item.value);
self.auxv = reader
.filter_map(Result::ok)
.map(|x| (x.key, x.value))
.collect();
if self.auxv.is_empty() {
Err("Found no auxv entry".into())
} else {
Ok(())
}
Ok(())
}
fn enumerate_mappings(&mut self) -> Result<()> {
@ -205,10 +213,10 @@ impl LinuxPtraceDumper {
// actual entry point to find the mapping.
let entry_point_loc = *self.auxv.get(&libc::AT_ENTRY).unwrap_or(&0);
let auxv_path = path::PathBuf::from(format!("/proc/{}/maps", self.pid));
let auxv_file = std::fs::File::open(auxv_path)?;
let maps_path = path::PathBuf::from(format!("/proc/{}/maps", self.pid));
let maps_file = std::fs::File::open(maps_path)?;
for line in BufReader::new(auxv_file).lines() {
for line in BufReader::new(maps_file).lines() {
// /proc/<pid>/maps looks like this
// 7fe34a863000-7fe34a864000 rw-p 00009000 00:31 4746408 /usr/lib64/libogg.so.0.8.4
let line = line?;
@ -454,29 +462,23 @@ impl LinuxPtraceDumper {
}
if section.sh_flags & u64::from(elf::section_header::SHF_ALLOC) != 0 {
if section.sh_flags & u64::from(elf::section_header::SHF_EXECINSTR) != 0 {
unsafe {
let ptr = mem_slice.as_ptr().offset(section.sh_offset.try_into()?);
let text_section = std::slice::from_raw_parts(
ptr as *const u8,
section.sh_size.try_into()?,
);
// Only provide mem::size_of(MDGUID) bytes to keep identifiers produced by this
// function backwards-compatible.
let max_len = std::cmp::min(text_section.len(), 4096);
let mut result = vec![0u8; std::mem::size_of::<MDGUID>()];
let mut offset = 0;
while offset < max_len {
for idx in 0..std::mem::size_of::<MDGUID>() {
if offset + idx >= text_section.len() {
break;
}
result[idx] ^= text_section[offset + idx];
let text_section = &mem_slice[section.sh_offset as usize..]
[..section.sh_size as usize];
// Only provide mem::size_of(MDGUID) bytes to keep identifiers produced by this
// function backwards-compatible.
let max_len = std::cmp::min(text_section.len(), 4096);
let mut result = vec![0u8; std::mem::size_of::<MDGUID>()];
let mut offset = 0;
while offset < max_len {
for idx in 0..std::mem::size_of::<MDGUID>() {
if offset + idx >= text_section.len() {
break;
}
offset += std::mem::size_of::<MDGUID>();
result[idx] ^= text_section[offset + idx];
}
return Ok(result);
offset += std::mem::size_of::<MDGUID>();
}
return Ok(result);
}
}
}

Просмотреть файл

@ -581,3 +581,66 @@ fn test_sanitized_stacks() {
fn test_sanitized_stacks_with_context() {
test_sanitized_stacks_helper(Context::Without)
}
fn test_write_early_abort_helper(context: Context) {
let mut child = start_child_and_return("spawn_alloc_wait");
let pid = child.id() as i32;
let mut tmpfile = tempfile::Builder::new()
.prefix("additional_memory")
.tempfile()
.unwrap();
let mut f = BufReader::new(child.stdout.as_mut().expect("Can't open stdout"));
let mut buf = String::new();
let _ = f
.read_line(&mut buf)
.expect("Couldn't read address provided by child");
let mut output = buf.split_whitespace();
let memory_addr = usize::from_str_radix(output.next().unwrap().trim_start_matches("0x"), 16)
.expect("unable to parse mmap_addr");
// We do not read the actual memory_size, but use something that does not fit into an "isize",
// and should thus create an error during dumping, which should lead to a truncated minidump.
let memory_size = usize::MAX;
let app_memory = AppMemory {
ptr: memory_addr,
length: memory_size,
};
let mut tmp = MinidumpWriter::new(pid, pid);
if context == Context::With {
let crash_context = get_crash_context(pid);
tmp.set_crash_context(crash_context);
}
// This should fail, because during the dump an error is detected (try_from fails)
tmp.set_app_memory(vec![app_memory])
.dump(&mut tmpfile)
.expect_err("Could not write minidump");
child.kill().expect("Failed to kill process");
// Reap child
let waitres = child.wait().expect("Failed to wait for child");
let status = waitres.signal().expect("Child did not die due to signal");
assert_eq!(waitres.code(), None);
assert_eq!(status, Signal::SIGKILL as i32);
// Read dump file and check its contents. There should be a truncated minidump available
let dump = Minidump::read_path(tmpfile.path()).expect("Failed to read minidump");
// Should be there
let _: MinidumpThreadList = dump.get_stream().expect("Couldn't find MinidumpThreadList");
let _: MinidumpModuleList = dump.get_stream().expect("Couldn't find MinidumpThreadList");
// Should be missing:
assert!(dump.get_stream::<MinidumpMemoryList>().is_err());
}
#[test]
fn test_write_early_abort() {
test_write_early_abort_helper(Context::Without)
}
#[test]
fn test_write_early_abort_with_context() {
test_write_early_abort_helper(Context::With)
}

Просмотреть файл

@ -271,11 +271,11 @@ CrashGenerationServer::ClientEvent(short revents)
return true;
#if defined(MOZ_OXIDIZED_BREAKPAD)
if (!write_minidump_linux_with_context(minidump_filename.c_str(),
crashing_pid, crash_context)) {
close(signal_fd);
return true;
}
// Ignoring the return-value here for now.
// The function always creates an empty minidump file even in case of an error.
// So we'll report that as well via the callback-functions.
write_minidump_linux_with_context(minidump_filename.c_str(),
crashing_pid, crash_context);
#else
if (!google_breakpad::WriteMinidump(minidump_filename.c_str(),
crashing_pid, crash_context,

Просмотреть файл

@ -2488,7 +2488,9 @@ set_define("MOZ_USE_NATIVE_POPUP_WINDOWS", True, when="MOZ_USE_NATIVE_POPUP_WIND
# ==============================================================
@depends(target)
def oxidized_breakpad(target):
return False # Disabled pending further testing
if target.kernel == "Linux" and target.os != "Android":
return target.cpu in ("x86", "x86_64")
return False
set_config("MOZ_OXIDIZED_BREAKPAD", True, when=oxidized_breakpad)