From 6f7e2b37f37ab3730fea1ca038df5d4891c766ff Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Mon, 19 Jun 2023 10:05:44 +0200 Subject: [PATCH 1/6] Update dependencies Revert change to procfs-core since it is not release still --- Cargo.toml | 18 ++++++++++-------- src/linux/errors.rs | 2 +- src/linux/maps_reader.rs | 5 ++--- src/linux/ptrace_dumper.rs | 5 ++--- src/linux/sections/memory_info_list_stream.rs | 17 ++++++++--------- tests/linux_minidump_writer.rs | 2 +- 6 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 832f3e1a..7d23d64d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,16 +13,16 @@ bitflags = "2.0" byteorder = "1.3.2" cfg-if = "1.0" crash-context = "0.6" -memoffset = "0.8" -minidump-common = "0.16.0" +memoffset = "0.9" +minidump-common = "0.17.0" scroll = "0.11" tempfile = "3.1.0" thiserror = "1.0.21" [target.'cfg(unix)'.dependencies] libc = "0.2.74" -goblin = "0.6" -memmap2 = "0.5" +goblin = "0.7" +memmap2 = "0.7" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] nix = { version = "0.26", default-features = false, features = [ @@ -32,7 +32,9 @@ nix = { version = "0.26", default-features = false, features = [ "user", ] } # Used for parsing procfs info. -procfs-core = { git = "https://github.com/eminence/procfs", rev = "591016286d195f523628eccf5cac9c923ae6ea45" } +procfs = "0.15.1" +# TODO: move to when it is published as it reduces dependencies +#procfs-core = { git = "https://github.com/eminence/procfs", rev = "591016286d195f523628eccf5cac9c923ae6ea45" } [target.'cfg(target_os = "windows")'.dependencies] bitflags = "2.0" @@ -44,13 +46,13 @@ mach2 = "0.4" [dev-dependencies] # Minidump-processor is async so we need an executor futures = { version = "0.3", features = ["executor"] } -minidump = "0.16.0" -memmap2 = "0.5" +minidump = "0.17.0" +memmap2 = "0.7" [target.'cfg(target_os = "macos")'.dev-dependencies] # We dump symbols for the `test` executable so that we can validate that minidumps # created by this crate can be processed by minidump-processor dump_syms = { version = "2.0.0", default-features = false } -minidump-processor = { version = "0.16.0", default-features = false } +minidump-processor = { version = "0.17.0", default-features = false } similar-asserts = "1.2" uuid = "1.0" diff --git a/src/linux/errors.rs b/src/linux/errors.rs index f5183ee9..4f6acf91 100644 --- a/src/linux/errors.rs +++ b/src/linux/errors.rs @@ -155,7 +155,7 @@ pub enum SectionMemInfoListError { #[error("Failed to write to memory")] MemoryWriterError(#[from] MemoryWriterError), #[error("Failed to read from procfs")] - ProcfsError(#[from] procfs_core::ProcError), + ProcfsError(#[from] procfs::ProcError), } #[derive(Debug, Error)] diff --git a/src/linux/maps_reader.rs b/src/linux/maps_reader.rs index b0017f73..3eaa491a 100644 --- a/src/linux/maps_reader.rs +++ b/src/linux/maps_reader.rs @@ -4,7 +4,7 @@ use crate::thread_info::Pid; use byteorder::{NativeEndian, ReadBytesExt}; use goblin::elf; use memmap2::{Mmap, MmapOptions}; -use procfs_core::process::{MMPermissions, MMapPath, MemoryMaps}; +use procfs::process::{MMPermissions, MMapPath, MemoryMaps}; use std::ffi::{OsStr, OsString}; use std::os::unix::ffi::OsStrExt; use std::{fs::File, mem::size_of, path::PathBuf}; @@ -355,11 +355,10 @@ impl MappingInfo { #[cfg(target_pointer_width = "64")] // All addresses are 64 bit and I'm currently too lazy to adjust it to work for both mod tests { use super::*; - use procfs_core::prelude::*; fn get_mappings_for(map: &str, linux_gate_loc: u64) -> Vec { MappingInfo::aggregate( - MemoryMaps::from_read(map.as_bytes()).expect("failed to read mapping info"), + MemoryMaps::from_reader(map.as_bytes()).expect("failed to read mapping info"), linux_gate_loc, ) .unwrap_or_default() diff --git a/src/linux/ptrace_dumper.rs b/src/linux/ptrace_dumper.rs index 93c175a1..651eb26b 100644 --- a/src/linux/ptrace_dumper.rs +++ b/src/linux/ptrace_dumper.rs @@ -17,7 +17,7 @@ use nix::{ errno::Errno, sys::{ptrace, wait}, }; -use procfs_core::process::MMPermissions; +use procfs::process::MMPermissions; use std::{collections::HashMap, ffi::c_void, io::BufReader, path, result::Result}; #[derive(Debug, Clone)] @@ -283,8 +283,7 @@ impl PtraceDumper { let maps_path = path::PathBuf::from(&filename); let maps_file = std::fs::File::open(maps_path).map_err(errmap)?; - use procfs_core::prelude::*; - self.mappings = procfs_core::process::MemoryMaps::from_read(maps_file) + self.mappings = procfs::process::MemoryMaps::from_reader(maps_file) .ok() .and_then(|maps| MappingInfo::aggregate(maps, linux_gate_loc).ok()) .unwrap_or_default(); diff --git a/src/linux/sections/memory_info_list_stream.rs b/src/linux/sections/memory_info_list_stream.rs index 370b8726..16dc0a96 100644 --- a/src/linux/sections/memory_info_list_stream.rs +++ b/src/linux/sections/memory_info_list_stream.rs @@ -1,26 +1,25 @@ use super::*; use minidump_common::format::{MemoryProtection, MemoryState, MemoryType}; -use procfs_core::{ - prelude::*, - process::{MMPermissions, MemoryMaps}, -}; +use procfs::process::MMPermissions; /// Write a MemoryInfoListStream using information from procfs. pub fn write( config: &mut MinidumpWriter, buffer: &mut DumpBuf, ) -> Result { - let maps = MemoryMaps::from_file(std::path::PathBuf::from(format!( - "/proc/{}/maps", - config.blamed_thread - )))?; + let process = procfs::process::Process::new(config.blamed_thread)?; + let maps = process.maps()?; + // let maps = MemoryMaps::from_file(std::path::PathBuf::from(format!( + // "/proc/{}/maps", + // config.blamed_thread + // )))?; let list_header = MemoryWriter::alloc_with_val( buffer, MDMemoryInfoList { size_of_header: std::mem::size_of::() as u32, size_of_entry: std::mem::size_of::() as u32, - number_of_entries: maps.len() as u64, + number_of_entries: maps.memory_maps.len() as u64, }, )?; diff --git a/tests/linux_minidump_writer.rs b/tests/linux_minidump_writer.rs index f8eb7c61..f7df2a0b 100644 --- a/tests/linux_minidump_writer.rs +++ b/tests/linux_minidump_writer.rs @@ -13,7 +13,7 @@ use minidump_writer::{ thread_info::Pid, }; use nix::{errno::Errno, sys::signal::Signal}; -use procfs_core::process::MMPermissions; +use procfs::process::MMPermissions; use std::collections::HashSet; use std::{ From 3682f628983752dd9a922f07087d5553e348a2d8 Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Mon, 19 Jun 2023 10:06:26 +0200 Subject: [PATCH 2/6] Test code only, check start The name (erroneously?) can include the (deleted) suffix which broke the comparison --- src/bin/test.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bin/test.rs b/src/bin/test.rs index f2dce164..ab35f235 100644 --- a/src/bin/test.rs +++ b/src/bin/test.rs @@ -108,8 +108,12 @@ mod linux { // Now check that PtraceDumper interpreted the mappings properly. let dumper = PtraceDumper::new(getppid().as_raw())?; let mut mapping_count = 0; - for map in &dumper.mappings { - if map.name == Some(path.clone().into()) { + for map in dbg!(&dumper.mappings) { + if map + .name + .as_ref() + .map_or(false, |name| name.to_string_lossy().starts_with(&path)) + { mapping_count += 1; // This mapping should encompass the entire original mapped // range. From 43b1a199194865fbebc8a495945233d21351e94a Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Mon, 19 Jun 2023 13:41:34 +0200 Subject: [PATCH 3/6] Fix mac compilation --- Cargo.toml | 5 +++-- tests/mac_minidump_writer.rs | 7 +++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d23d64d..c711b27b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ thiserror = "1.0.21" [target.'cfg(unix)'.dependencies] libc = "0.2.74" goblin = "0.7" -memmap2 = "0.7" +memmap2 = "0.5" [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies] nix = { version = "0.26", default-features = false, features = [ @@ -47,12 +47,13 @@ mach2 = "0.4" # Minidump-processor is async so we need an executor futures = { version = "0.3", features = ["executor"] } minidump = "0.17.0" -memmap2 = "0.7" +memmap2 = "0.5" [target.'cfg(target_os = "macos")'.dev-dependencies] # We dump symbols for the `test` executable so that we can validate that minidumps # created by this crate can be processed by minidump-processor dump_syms = { version = "2.0.0", default-features = false } minidump-processor = { version = "0.17.0", default-features = false } +minidump-unwind = { version = "0.17", features = ["debuginfo"] } similar-asserts = "1.2" uuid = "1.0" diff --git a/tests/mac_minidump_writer.rs b/tests/mac_minidump_writer.rs index 4dafb1a7..b2474b48 100644 --- a/tests/mac_minidump_writer.rs +++ b/tests/mac_minidump_writer.rs @@ -182,10 +182,9 @@ fn stackwalks() { ) .expect("failed to dump symbols"); - let provider = - minidump_processor::Symbolizer::new(minidump_processor::simple_symbol_supplier(vec![ - ".test-symbols".into(), - ])); + let provider = minidump_unwind::Symbolizer::new(minidump_unwind::simple_symbol_supplier(vec![ + ".test-symbols".into(), + ])); let state = futures::executor::block_on(async { minidump_processor::process_minidump(&md.minidump, &provider).await From 401e124b304e1f509e8236f303bc68c9ea9f1182 Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Wed, 21 Jun 2023 09:36:49 +0200 Subject: [PATCH 4/6] Use published version of procfs-core --- Cargo.toml | 4 +--- src/linux/errors.rs | 2 +- src/linux/maps_reader.rs | 5 +++-- src/linux/ptrace_dumper.rs | 5 +++-- src/linux/sections/memory_info_list_stream.rs | 14 ++++++-------- tests/linux_minidump_writer.rs | 2 +- 6 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index c711b27b..a84e2d6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,9 +32,7 @@ nix = { version = "0.26", default-features = false, features = [ "user", ] } # Used for parsing procfs info. -procfs = "0.15.1" -# TODO: move to when it is published as it reduces dependencies -#procfs-core = { git = "https://github.com/eminence/procfs", rev = "591016286d195f523628eccf5cac9c923ae6ea45" } +procfs-core = "0.16.0-RC1" [target.'cfg(target_os = "windows")'.dependencies] bitflags = "2.0" diff --git a/src/linux/errors.rs b/src/linux/errors.rs index 4f6acf91..f5183ee9 100644 --- a/src/linux/errors.rs +++ b/src/linux/errors.rs @@ -155,7 +155,7 @@ pub enum SectionMemInfoListError { #[error("Failed to write to memory")] MemoryWriterError(#[from] MemoryWriterError), #[error("Failed to read from procfs")] - ProcfsError(#[from] procfs::ProcError), + ProcfsError(#[from] procfs_core::ProcError), } #[derive(Debug, Error)] diff --git a/src/linux/maps_reader.rs b/src/linux/maps_reader.rs index 3eaa491a..760d1fdf 100644 --- a/src/linux/maps_reader.rs +++ b/src/linux/maps_reader.rs @@ -4,7 +4,7 @@ use crate::thread_info::Pid; use byteorder::{NativeEndian, ReadBytesExt}; use goblin::elf; use memmap2::{Mmap, MmapOptions}; -use procfs::process::{MMPermissions, MMapPath, MemoryMaps}; +use procfs_core::process::{MMPermissions, MMapPath, MemoryMaps}; use std::ffi::{OsStr, OsString}; use std::os::unix::ffi::OsStrExt; use std::{fs::File, mem::size_of, path::PathBuf}; @@ -355,10 +355,11 @@ impl MappingInfo { #[cfg(target_pointer_width = "64")] // All addresses are 64 bit and I'm currently too lazy to adjust it to work for both mod tests { use super::*; + use procfs_core::FromRead; fn get_mappings_for(map: &str, linux_gate_loc: u64) -> Vec { MappingInfo::aggregate( - MemoryMaps::from_reader(map.as_bytes()).expect("failed to read mapping info"), + MemoryMaps::from_read(map.as_bytes()).expect("failed to read mapping info"), linux_gate_loc, ) .unwrap_or_default() diff --git a/src/linux/ptrace_dumper.rs b/src/linux/ptrace_dumper.rs index 651eb26b..1a4f26f9 100644 --- a/src/linux/ptrace_dumper.rs +++ b/src/linux/ptrace_dumper.rs @@ -17,7 +17,7 @@ use nix::{ errno::Errno, sys::{ptrace, wait}, }; -use procfs::process::MMPermissions; +use procfs_core::process::MMPermissions; use std::{collections::HashMap, ffi::c_void, io::BufReader, path, result::Result}; #[derive(Debug, Clone)] @@ -283,7 +283,8 @@ impl PtraceDumper { let maps_path = path::PathBuf::from(&filename); let maps_file = std::fs::File::open(maps_path).map_err(errmap)?; - self.mappings = procfs::process::MemoryMaps::from_reader(maps_file) + use procfs_core::FromRead; + self.mappings = procfs_core::process::MemoryMaps::from_read(maps_file) .ok() .and_then(|maps| MappingInfo::aggregate(maps, linux_gate_loc).ok()) .unwrap_or_default(); diff --git a/src/linux/sections/memory_info_list_stream.rs b/src/linux/sections/memory_info_list_stream.rs index 16dc0a96..c3cd728c 100644 --- a/src/linux/sections/memory_info_list_stream.rs +++ b/src/linux/sections/memory_info_list_stream.rs @@ -1,25 +1,23 @@ use super::*; use minidump_common::format::{MemoryProtection, MemoryState, MemoryType}; -use procfs::process::MMPermissions; +use procfs_core::{process::MMPermissions, FromRead}; /// Write a MemoryInfoListStream using information from procfs. pub fn write( config: &mut MinidumpWriter, buffer: &mut DumpBuf, ) -> Result { - let process = procfs::process::Process::new(config.blamed_thread)?; - let maps = process.maps()?; - // let maps = MemoryMaps::from_file(std::path::PathBuf::from(format!( - // "/proc/{}/maps", - // config.blamed_thread - // )))?; + let maps = procfs_core::process::MemoryMaps::from_file(std::path::PathBuf::from(format!( + "/proc/{}/maps", + config.blamed_thread + )))?; let list_header = MemoryWriter::alloc_with_val( buffer, MDMemoryInfoList { size_of_header: std::mem::size_of::() as u32, size_of_entry: std::mem::size_of::() as u32, - number_of_entries: maps.memory_maps.len() as u64, + number_of_entries: maps.len() as u64, }, )?; diff --git a/tests/linux_minidump_writer.rs b/tests/linux_minidump_writer.rs index f7df2a0b..f8eb7c61 100644 --- a/tests/linux_minidump_writer.rs +++ b/tests/linux_minidump_writer.rs @@ -13,7 +13,7 @@ use minidump_writer::{ thread_info::Pid, }; use nix::{errno::Errno, sys::signal::Signal}; -use procfs::process::MMPermissions; +use procfs_core::process::MMPermissions; use std::collections::HashSet; use std::{ From 46fbf45f2b37d5eebfa2f0b1af620eca81828c37 Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Wed, 21 Jun 2023 09:38:32 +0200 Subject: [PATCH 5/6] Remove dbg --- src/bin/test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/test.rs b/src/bin/test.rs index ab35f235..24e293c7 100644 --- a/src/bin/test.rs +++ b/src/bin/test.rs @@ -108,7 +108,7 @@ mod linux { // Now check that PtraceDumper interpreted the mappings properly. let dumper = PtraceDumper::new(getppid().as_raw())?; let mut mapping_count = 0; - for map in dbg!(&dumper.mappings) { + for map in &dumper.mappings { if map .name .as_ref() From 882a25126bca08742bc866e1e3f6b0aab8a9218e Mon Sep 17 00:00:00 2001 From: Jake Shadle Date: Wed, 21 Jun 2023 10:49:36 +0200 Subject: [PATCH 6/6] Specify patch version for crash-context --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index a84e2d6c..64f2a2a2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ license = "MIT" bitflags = "2.0" byteorder = "1.3.2" cfg-if = "1.0" -crash-context = "0.6" +crash-context = "0.6.1" memoffset = "0.9" minidump-common = "0.17.0" scroll = "0.11"