# iptr-perf-pt-reader
`iptr-perf-pt-reader` is a utility crate of [`iptr`](https://github.com/Evian-Zhang/iptr) project, providing basic capabilities of extracting Intel-PT-related data from `perf.data` format.
To use this crate, add this crate to your `Cargo.toml`:
```toml
[dependencies]
iptr-perf-pt-reader = "0.1"
```
## Usage
This crate provides two main APIs: [`extract_pt_auxtraces`](https://docs.rs/iptr-perf-pt-reader/latest/iptr_perf_pt_reader/fn.extract_pt_auxtraces.html) and [`extract_pt_auxtraces_and_mmap_data`](https://docs.rs/iptr-perf-pt-reader/latest/iptr_perf_pt_reader/fn.extract_pt_auxtraces_and_mmap_data.html). The former function extract all raw Intel PT trace from the `perf.data`, and the latter function additionally extract the mmap-related information for `ipr-edge-analyzer` to build a memory reader. The usage is very straightforward:
```rust
fn parse_perf_data(perf_data: &[u8]) {
let (pt_traces, mmaped_headers) =
iptr_perf_pt_reader::extract_pt_auxtraces_and_mmap_data(perf_data).unwrap();
for pt_trace in pt_traces {
println!("Get a PT trace with size {}", pt_trace.size);
// Real data is in pt_trace.auxtrace_data
}
for mmaped_header in mmaped_headers {
println!(
"During perf, {} is mmaped to the address {:x}",
mmaped_header.filename,
mmaped_header.addr,
);
}
}
```
Currently, we only deal with `perf.data` generated by `perf record -e intel_pt`. For `perf.data` generated without Intel PT traces, the results of extraction are not tested.
## Alternatives
[linux-perf-data](https://crates.io/crates/linux-perf-data) crate provides a more general interface for dealing with `perf.data`. However, this crate's support for AUXTRACE header is not completed, see [issue#21](https://github.com/mstange/linux-perf-data/pull/21).