#perf #linux #parser #perf-event #data-file #linux-kernel #file-format

linux-perf-data

perf.data 和 jitdump 格式的解析器。这些格式由 Linux perf 工具使用。

15 个版本 (9 个重大更新)

0.10.2 2024年6月28日
0.9.0 2024年3月4日
0.8.2 2023年6月12日
0.8.0 2023年3月20日
0.6.0 2022年6月10日

#608解析器实现

Download history 879/week @ 2024-05-03 951/week @ 2024-05-10 964/week @ 2024-05-17 537/week @ 2024-05-24 706/week @ 2024-05-31 471/week @ 2024-06-07 580/week @ 2024-06-14 331/week @ 2024-06-21 746/week @ 2024-06-28 284/week @ 2024-07-05 634/week @ 2024-07-12 318/week @ 2024-07-19 380/week @ 2024-07-26 290/week @ 2024-08-02 289/week @ 2024-08-09 268/week @ 2024-08-16

每月1,267 次下载
用于 5 个 crate (2 个直接使用)

MIT/Apache

140KB
2.5K SLoC

crates.io page docs.rs page

linux-perf-data

perf.data 文件格式的解析器。

这种格式的文件由一个头部、一个数据部分和几个其他补充部分组成。数据部分包含文件的主要内容:一系列记录。

有两种类型的记录:来自内核的事件记录和来自 perf / simpleperf 的 "用户记录"。

此 crate 还包含用于解析 jitdump 文件的解析代码,这些文件与 perf.data 文件一起用于分析 JIT 运行时。

示例

use linux_perf_data::{AttributeDescription, PerfFileReader, PerfFileRecord};

let file = std::fs::File::open("perf.data")?;
let reader = std::io::BufReader::new(file);
let PerfFileReader { mut perf_file, mut record_iter } = PerfFileReader::parse_file(reader)?;
let event_names: Vec<_> =
    perf_file.event_attributes().iter().filter_map(AttributeDescription::name).collect();
println!("perf events: {}", event_names.join(", "));

while let Some(record) = record_iter.next_record(&mut perf_file)? {
    match record {
        PerfFileRecord::EventRecord { attr_index, record } => {
            let record_type = record.record_type;
            let parsed_record = record.parse()?;
            println!("{:?} for event {}: {:?}", record_type, attr_index, parsed_record);
        }
        PerfFileRecord::UserRecord(record) => {
            let record_type = record.record_type;
            let parsed_record = record.parse()?;
            println!("{:?}: {:?}", record_type, parsed_record);
        }
    }
}

Jitdump 示例

use linux_perf_data::jitdump::{JitDumpReader, JitDumpRecord};

let file = std::fs::File::open("jit-12345.dump")?;
let mut reader = JitDumpReader::new(file)?;
println!("jitdump header: {:?}", reader.header());

while let Some(raw_record) = reader.next_record()? {
    let timestamp = raw_record.timestamp;
    match raw_record.parse()? {
        JitDumpRecord::CodeLoad(record) => {
            println!("{timestamp:016} LOAD {record:?}");
        }
        JitDumpRecord::CodeMove(record) => {
            println!("{timestamp:016} MOVE {record:?}");
        }
        JitDumpRecord::CodeDebugInfo(record) => {
            println!("{timestamp:016} DEBUG_INFO {record:?}");
        }
        JitDumpRecord::CodeClose => {
            println!("{timestamp:016} CLOSE");
        }
        JitDumpRecord::CodeUnwindingInfo(record) => {
            println!("{timestamp:016} UNWINDING_Info {record:?}");
        }
        JitDumpRecord::Other(record) => {
            println!("{timestamp:016} {} {record:?}", record.record_type.0);
        }
    }
}

许可证

根据以下任一许可证授权:

由你选择。

除非你明确说明,否则任何有意提交给作品并由你定义在 Apache-2.0 许可证中的贡献,都将根据上述许可证双重授权,没有其他条款或条件。

依赖项

~1.5–2.2MB
~44K SLoC