trace_point.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. use std::fs;
  2. use crate::{
  3. generated::bpf_prog_type::BPF_PROG_TYPE_TRACEPOINT, syscalls::perf_event_open_trace_point,
  4. };
  5. use super::{load_program, perf_attach, Link, ProgramData, ProgramError};
  6. #[derive(Debug)]
  7. pub struct TracePoint {
  8. pub(crate) data: ProgramData,
  9. }
  10. impl TracePoint {
  11. pub fn load(&mut self) -> Result<(), ProgramError> {
  12. load_program(BPF_PROG_TYPE_TRACEPOINT, &mut self.data)
  13. }
  14. pub fn attach(&mut self, category: &str, name: &str) -> Result<impl Link, ProgramError> {
  15. let id = read_sys_fs_trace_point_id(category, name)?;
  16. let fd = perf_event_open_trace_point(id)
  17. .map_err(|(_code, io_error)| ProgramError::PerfEventOpenFailed { io_error })?
  18. as i32;
  19. perf_attach(&mut self.data, fd)
  20. }
  21. }
  22. fn read_sys_fs_trace_point_id(category: &str, name: &str) -> Result<u32, ProgramError> {
  23. let file = format!("/sys/kernel/debug/tracing/events/{}/{}/id", category, name);
  24. let id = fs::read_to_string(&file).map_err(|e| ProgramError::Other {
  25. message: format!("error parsing {}: {}", file, e),
  26. })?;
  27. let id = id.trim().parse::<u32>().map_err(|e| ProgramError::Other {
  28. message: format!("error parsing {}: {}", file, e),
  29. })?;
  30. Ok(id)
  31. }