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}