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 在 解析器实现 中
每月1,267 次下载
用于 5 个 crate (2 个直接使用)
140KB
2.5K SLoC
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 (
LICENSE-APACHE
或 http://www.apache.org/licenses/LICENSE-2.0) - MIT 许可证 (
LICENSE-MIT
或 http://opensource.org/licenses/MIT)
由你选择。
除非你明确说明,否则任何有意提交给作品并由你定义在 Apache-2.0 许可证中的贡献,都将根据上述许可证双重授权,没有其他条款或条件。
依赖项
~1.5–2.2MB
~44K SLoC