use clap::Parser;
use std::process::Command;
use perf_tools::pprof;
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
#[clap(short, long, default_value = "perf.data")]
input: String,
#[clap(short, long, default_value = "cpu.pprof")]
output: String,
}
fn main() {
let args = Args::parse();
let output = Command::new("perf")
.arg("script")
.arg("--header")
.arg("-i")
.arg(&args.input)
.output()
.expect("failed to execute perf");
if !output.status.success() {
panic!("{}", String::from_utf8(output.stderr).unwrap());
}
let mut encoder =
libflate::gzip::Encoder::new(std::fs::File::create(args.output).unwrap()).unwrap();
pprof::PprofConverterBuilder::default()
.build()
.from_reader(
std::io::BufReader::with_capacity(4096, &*output.stdout),
&mut encoder,
)
.unwrap();
encoder
.finish()
.into_result()
.expect("gzip encoding failed");
}