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"