|
1 | 1 | use anyhow::{anyhow, bail, Context, Result};
|
| 2 | +use blazesym::{BlazeSymbolizer, SymbolSrcCfg, SymbolizedResult}; |
2 | 3 | use core::time::Duration;
|
3 | 4 | use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
|
4 | 5 | use cpal::{Data, Stream};
|
5 | 6 | use libbpf_rs::RingBufferBuilder;
|
6 | 7 | use perf_event_open_sys as perf;
|
7 | 8 | use plain::Plain;
|
8 | 9 | use serde::{de::Error, Deserialize, Deserializer};
|
| 10 | +use std::array::IntoIter; |
9 | 11 | use std::collections::HashMap;
|
10 | 12 | use std::io;
|
11 | 13 | use std::num::ParseIntError;
|
12 | 14 | use std::str::FromStr;
|
13 | 15 | use std::sync::atomic::{AtomicBool, Ordering};
|
14 | 16 | use std::sync::mpsc;
|
| 17 | +use std::sync::mpsc::channel; |
15 | 18 | use std::sync::mpsc::{Receiver, Sender};
|
16 | 19 | use std::sync::Arc;
|
17 | 20 | use std::thread;
|
@@ -160,10 +163,12 @@ where
|
160 | 163 | let base_freq = stack_sample.pid;
|
161 | 164 | let stack_offset = stack_sample.ustack[0];
|
162 | 165 | // let kstack_offset = stack_sample.kstack[0]; // % 10;
|
163 |
| - let res = (base_freq * 1 + stack_offset as u32) as f32; |
| 166 | + //let res = (base_freq * 1 + stack_offset as u32) as f32; |
| 167 | + let res = (base_freq + 1/*stack_offset as u32*/) as f32; |
164 | 168 |
|
165 | 169 | println!(
|
166 |
| - "res {} clock {} rate {} pid {} ustack {}", |
| 170 | + "res {} sin {} clock {} rate {} pid {} ustack {}", |
| 171 | + res, |
167 | 172 | res.sin(),
|
168 | 173 | sample_clock,
|
169 | 174 | sample_rate,
|
@@ -304,7 +309,7 @@ fn play(opt: Opt) -> Result<()> {
|
304 | 309 | break;
|
305 | 310 | }
|
306 | 311 | let stack = bpftune_bss_types::stacktrace_event::from_str(&line.unwrap()).unwrap();
|
307 |
| - for _ in 0..100 { |
| 312 | + for _ in 0..8 { |
308 | 313 | let _ = tx.send(stack);
|
309 | 314 | }
|
310 | 315 | }
|
@@ -370,7 +375,70 @@ fn main() -> Result<()> {
|
370 | 375 |
|
371 | 376 | let mut skel = skel_.load()?;
|
372 | 377 | let mut rbb = RingBufferBuilder::new();
|
373 |
| - rbb.add(skel.maps_mut().events(), handle_event)?; |
| 378 | + |
| 379 | + let (tx, rx): ( |
| 380 | + Sender<bpftune_bss_types::stacktrace_event>, |
| 381 | + Receiver<bpftune_bss_types::stacktrace_event>, |
| 382 | + ) = mpsc::channel(); |
| 383 | + |
| 384 | + if opt.pid != -1 { |
| 385 | + let sym_srcs = [SymbolSrcCfg::Process { |
| 386 | + pid: Some(opt.pid as u32), |
| 387 | + }]; |
| 388 | + rbb.add(skel.maps_mut().events(), move |data: &[u8]| { |
| 389 | + let mut event = bpftune_bss_types::stacktrace_event::default(); |
| 390 | + plain::copy_from_bytes(&mut event, data).expect("Event data buffer was too short"); |
| 391 | + if event.pid == 0 { |
| 392 | + return 0; |
| 393 | + } |
| 394 | + tx.send(event).unwrap(); |
| 395 | + 0 |
| 396 | + })?; |
| 397 | + thread::spawn(move || loop { |
| 398 | + let symbolizer = BlazeSymbolizer::new().unwrap(); |
| 399 | + let stack_sym = rx.recv().unwrap(); |
| 400 | + let symlist = symbolizer.symbolize(&sym_srcs, &stack_sym.ustack.to_vec()); |
| 401 | + for i in 0..stack_sym.ustack.len() { |
| 402 | + let address = stack_sym.ustack[i]; |
| 403 | + if symlist.len() <= i || symlist[i].len() == 0 { |
| 404 | + continue; |
| 405 | + } |
| 406 | + let sym_results = &symlist[i]; |
| 407 | + if sym_results.len() > 1 { |
| 408 | + // One address may get several results (ex, inline code) |
| 409 | + println!("0x{:016x} ({} entries)", address, sym_results.len()); |
| 410 | + |
| 411 | + for result in sym_results { |
| 412 | + let SymbolizedResult { |
| 413 | + symbol, |
| 414 | + start_address, |
| 415 | + path, |
| 416 | + line_no, |
| 417 | + column, |
| 418 | + } = result; |
| 419 | + println!( |
| 420 | + " {}@0x{:016x} {}:{}", |
| 421 | + symbol, start_address, path, line_no |
| 422 | + ); |
| 423 | + } |
| 424 | + } else { |
| 425 | + let SymbolizedResult { |
| 426 | + symbol, |
| 427 | + start_address, |
| 428 | + path, |
| 429 | + line_no, |
| 430 | + column, |
| 431 | + } = &sym_results[0]; |
| 432 | + println!( |
| 433 | + "0x{:016x} {}@0x{:016x} {}:{}", |
| 434 | + address, symbol, start_address, path, line_no |
| 435 | + ); |
| 436 | + } |
| 437 | + } |
| 438 | + }); |
| 439 | + } else { |
| 440 | + rbb.add(skel.maps_mut().events(), handle_event)?; |
| 441 | + } |
374 | 442 | let rb = rbb.build()?;
|
375 | 443 |
|
376 | 444 | let mut perf_fds = HashMap::new();
|
|
0 commit comments