linux_perf_event_reader/lib.rs
1//! # linux-perf-event-reader
2//!
3//! This crate lets you parse Linux perf events and associated structures.
4//!
5//! ## Example
6//!
7//! ```rust
8//! use linux_perf_event_reader::{
9//! CommOrExecRecord, Endianness, EventRecord, PerfEventAttr, RawData, RawEventRecord,
10//! RecordParseInfo, RecordType
11//! };
12//!
13//! # fn it_works() {
14//! // Read the perf_event_attr data.
15//! let attr_data = [
16//! 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 3, 0, 0, 0, 0, 0, 0, 47, 177, 0,
17//! 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 183, 215, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
18//! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 15,
19//! 255, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20//! 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 128, 0,
21//! 0, 0, 0, 0, 0, 0,
22//! ];
23//! let (attr, _size) =
24//! PerfEventAttr::parse::<_, byteorder::LittleEndian>(&attr_data[..]).unwrap();
25//! let parse_info = RecordParseInfo::new(&attr, Endianness::LittleEndian);
26//!
27//! let body = b"lG\x08\0lG\x08\0dump_syms\0\0\0\0\0\0\0lG\x08\0lG\x08\08\x1b\xf8\x18hX\x04\0";
28//! let body_raw_data = RawData::from(&body[..]);
29//! let raw_record = RawEventRecord::new(RecordType::COMM, 0x2000, body_raw_data, parse_info);
30//! let parsed_record = raw_record.parse().unwrap();
31//!
32//! assert_eq!(
33//! parsed_record,
34//! EventRecord::Comm(CommOrExecRecord {
35//! pid: 542572,
36//! tid: 542572,
37//! name: RawData::Single(b"dump_syms"),
38//! is_execve: true
39//! })
40//! );
41//! # }
42//! ```
43mod common_data;
44pub mod constants;
45mod endian;
46mod event_record;
47mod parse_info;
48mod perf_event;
49mod raw_data;
50mod registers;
51mod sample;
52mod types;
53mod utils;
54
55pub use common_data::*;
56pub use endian::*;
57pub use event_record::*;
58pub use parse_info::*;
59pub use perf_event::*;
60pub use raw_data::*;
61pub use registers::*;
62pub use sample::*;
63pub use types::*;
64
65#[cfg(test)]
66mod test {
67 use crate::{
68 CommOrExecRecord, Endianness, EventRecord, PerfEventAttr, RawData, RawEventRecord,
69 RecordParseInfo, RecordType,
70 };
71
72 #[test]
73 fn it_works() {
74 // Read the perf_event_attr data.
75 let attr_data = [
76 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 3, 0, 0, 0, 0, 0, 0, 47, 177, 0,
77 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 183, 215, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 15,
79 255, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 128, 0,
81 0, 0, 0, 0, 0, 0,
82 ];
83 let (attr, _size) =
84 PerfEventAttr::parse::<_, byteorder::LittleEndian>(&attr_data[..]).unwrap();
85 let parse_info = RecordParseInfo::new(&attr, Endianness::LittleEndian);
86
87 let body = b"lG\x08\0lG\x08\0dump_syms\0\0\0\0\0\0\0lG\x08\0lG\x08\08\x1b\xf8\x18hX\x04\0";
88 let body_raw_data = RawData::from(&body[..]);
89 let raw_record = RawEventRecord::new(RecordType::COMM, 0x2000, body_raw_data, parse_info);
90 let parsed_record = raw_record.parse().unwrap();
91
92 assert_eq!(
93 parsed_record,
94 EventRecord::Comm(CommOrExecRecord {
95 pid: 542572,
96 tid: 542572,
97 name: RawData::Single(b"dump_syms"),
98 is_execve: true
99 })
100 );
101 }
102}