use bcc::perf_event::{Event, SoftwareEvent}; use bcc::{BccError, Instructions}; use bcc::{PerfEvent, PerfEventArray, BPF}; use clap::{App, Arg}; use core::sync::atomic::{AtomicBool, Ordering}; use std::collections::HashMap; use std::ffi::CString; use std::sync::Arc; use std::{thread, time}; const CONTENT: &str = r#" #include #include #include int trace_entry(struct pt_regs* ctx, int dfd, const char __user* filename) { bpf_trace_printk("hello from rust\\n"); return 0; } "#; fn do_main(runnable: Arc) -> Result<(), BccError> { let cpus = bcc::cpuonline::get()?.len() as u32; let code = format!("{}\n{}", format!("#define NUM_CPU {}", cpus), CONTENT); let bpf = BPF::new(&code)?; let func_name = CString::new("trace_entry").unwrap(); let dump = bpf.dump_func(func_name).unwrap(); let instructions = Instructions::from_vec(dump); for ins in instructions.inner() { println!("{:?}", ins); } Ok(()) } fn main() { let runnable = Arc::new(AtomicBool::new(true)); let r = runnable.clone(); ctrlc::set_handler(move || { r.store(false, Ordering::SeqCst); }) .expect("Failed to set handler for SIGINT / SIGTERM"); if let Err(x) = do_main(runnable) { eprintln!("Error: {}", x); std::process::exit(1); } }