iptr-perf-pt-reader 0.1.0

Perf.data parser for Intel PT data
Documentation
# 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).