From 1b82f89c5741a02f558ce8c46512501b5f880815 Mon Sep 17 00:00:00 2001
From: Sage Mitchell <[email protected]>
Date: Wed, 17 Aug 2022 14:51:23 -0700
Subject: [PATCH 1/2] Make `dir_section` and `mem_writer` modules public
`./examples/synthetic.rs` demonstrates how consumers may use those
modules, regardless of `target_os`, to construct and serialize a
minidump.
---
examples/synthetic.rs | 36 ++++++++++++++++++++++++++++++++++++
src/lib.rs | 10 ++--------
2 files changed, 38 insertions(+), 8 deletions(-)
create mode 100644 examples/synthetic.rs
diff --git a/examples/synthetic.rs b/examples/synthetic.rs
new file mode 100644
index 00000000..58ddc7d2
--- /dev/null
+++ b/examples/synthetic.rs
@@ -0,0 +1,36 @@
+//! Emits default minidump with no streams to specified path
+
+use std::fs::File;
+
+use minidump_writer::{
+ dir_section::DirSection,
+ mem_writer::{Buffer, MemoryWriter},
+ minidump_format::{MDRawHeader, MD_HEADER_SIGNATURE, MD_HEADER_VERSION},
+};
+
+// usage: `cargo run --example synthetic /tmp/micro-minidump.dmp`
+fn main() {
+ let output_path = std::env::args()
+ .nth(1)
+ .expect("missing argument: output file path");
+
+ let num_writers = 0u32;
+ let buffer_capacity = 32;
+
+ let mut destination = File::create(output_path).expect("failed to create file");
+ let mut buffer = Buffer::with_capacity(buffer_capacity);
+ let mut header_section = MemoryWriter::::alloc(&mut buffer).unwrap();
+ let mut dir_section = DirSection::new(&mut buffer, num_writers, &mut destination).unwrap();
+
+ let header = MDRawHeader {
+ signature: MD_HEADER_SIGNATURE,
+ version: MD_HEADER_VERSION,
+ stream_count: num_writers,
+ stream_directory_rva: dir_section.position(),
+ checksum: 0,
+ time_date_stamp: 0u32,
+ flags: 0,
+ };
+ header_section.set_value(&mut buffer, header).unwrap();
+ dir_section.write_to_file(&mut buffer, None).unwrap();
+}
diff --git a/src/lib.rs b/src/lib.rs
index 00ce6074..a76291d0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -17,11 +17,5 @@ cfg_if::cfg_if! {
pub mod minidump_cpu;
pub mod minidump_format;
-// Non-windows platforms need additional code since they are essentially
-// replicating functionality we get for free on Windows
-cfg_if::cfg_if! {
- if #[cfg(not(target_os = "windows"))] {
- pub(crate) mod mem_writer;
- pub(crate) mod dir_section;
- }
-}
+pub mod dir_section;
+pub mod mem_writer;
From 9f1f1504ce8558591a45f649641aab0b13e94fdb Mon Sep 17 00:00:00 2001
From: Jake Shadle
Date: Wed, 24 Aug 2022 07:47:16 +0200
Subject: [PATCH 2/2] Fix clippy lints
---
src/linux/app_memory.rs | 2 +-
src/linux/auxv_reader.rs | 4 ++--
src/linux/maps_reader.rs | 4 ++--
src/mem_writer.rs | 4 ++--
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/src/linux/app_memory.rs b/src/linux/app_memory.rs
index dfffdfa3..80e77d5b 100644
--- a/src/linux/app_memory.rs
+++ b/src/linux/app_memory.rs
@@ -1,6 +1,6 @@
// These entries store a list of memory regions that the client wants included
// in the minidump.
-#[derive(Debug, Default, PartialEq)]
+#[derive(Debug, Default, PartialEq, Eq)]
pub struct AppMemory {
pub ptr: usize,
pub length: usize,
diff --git a/src/linux/auxv_reader.rs b/src/linux/auxv_reader.rs
index 24a89bf5..1fcaff96 100644
--- a/src/linux/auxv_reader.rs
+++ b/src/linux/auxv_reader.rs
@@ -19,7 +19,7 @@ pub type AuxvType = u32;
pub type AuxvType = u64;
/// An auxv key-value pair.
-#[derive(Debug, PartialEq)]
+#[derive(Debug, PartialEq, Eq)]
pub struct AuxvPair {
pub key: AuxvType,
pub value: AuxvType,
@@ -38,7 +38,7 @@ impl ProcfsAuxvIter {
let pair_size = 2 * std::mem::size_of::();
let buf: Vec = Vec::with_capacity(pair_size);
- ProcfsAuxvIter {
+ Self {
pair_size,
buf,
input,
diff --git a/src/linux/maps_reader.rs b/src/linux/maps_reader.rs
index 8078b163..8050387a 100644
--- a/src/linux/maps_reader.rs
+++ b/src/linux/maps_reader.rs
@@ -12,7 +12,7 @@ pub const RESERVED_FLAGS: &str = "---p";
type Result = std::result::Result;
-#[derive(Debug, PartialEq, Clone)]
+#[derive(Debug, PartialEq, Eq, Clone)]
pub struct SystemMappingInfo {
pub start_address: usize,
pub end_address: usize,
@@ -20,7 +20,7 @@ pub struct SystemMappingInfo {
// One of these is produced for each mapping in the process (i.e. line in
// /proc/$x/maps).
-#[derive(Debug, PartialEq, Clone)]
+#[derive(Debug, PartialEq, Eq, Clone)]
pub struct MappingInfo {
// On Android, relocation packing can mean that the reported start
// address of the mapping must be adjusted by a bias in order to
diff --git a/src/mem_writer.rs b/src/mem_writer.rs
index a723c2aa..25c6a59f 100644
--- a/src/mem_writer.rs
+++ b/src/mem_writer.rs
@@ -88,7 +88,7 @@ impl std::ops::Deref for Buffer {
}
}
-#[derive(Debug, PartialEq)]
+#[derive(Debug)]
pub struct MemoryWriter {
pub position: MDRVA,
pub size: usize,
@@ -139,7 +139,7 @@ where
}
}
-#[derive(Debug, PartialEq)]
+#[derive(Debug)]
pub struct MemoryArrayWriter {
pub position: MDRVA,
array_size: usize,