Skip to content

Commit 7df1871

Browse files
committed
add blazesym support
1 parent f21f996 commit 7df1871

File tree

3 files changed

+104
-4
lines changed

3 files changed

+104
-4
lines changed

Cargo.lock

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ num_cpus = "1.0"
1515
cpal = "0.14.0"
1616
serde = "1.0.0"
1717
perf-event-open-sys = "1.0.1"
18+
blazesym = "0.1.0"
1819

1920
[build-dependencies]
2021
libbpf-cargo = "0.12"

src/main.rs

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
use anyhow::{anyhow, bail, Context, Result};
2+
use blazesym::{BlazeSymbolizer, SymbolSrcCfg, SymbolizedResult};
23
use core::time::Duration;
34
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
45
use cpal::{Data, Stream};
56
use libbpf_rs::RingBufferBuilder;
67
use perf_event_open_sys as perf;
78
use plain::Plain;
89
use serde::{de::Error, Deserialize, Deserializer};
10+
use std::array::IntoIter;
911
use std::collections::HashMap;
1012
use std::io;
1113
use std::num::ParseIntError;
1214
use std::str::FromStr;
1315
use std::sync::atomic::{AtomicBool, Ordering};
1416
use std::sync::mpsc;
17+
use std::sync::mpsc::channel;
1518
use std::sync::mpsc::{Receiver, Sender};
1619
use std::sync::Arc;
1720
use std::thread;
@@ -160,10 +163,12 @@ where
160163
let base_freq = stack_sample.pid;
161164
let stack_offset = stack_sample.ustack[0];
162165
// 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;
164168

165169
println!(
166-
"res {} clock {} rate {} pid {} ustack {}",
170+
"res {} sin {} clock {} rate {} pid {} ustack {}",
171+
res,
167172
res.sin(),
168173
sample_clock,
169174
sample_rate,
@@ -304,7 +309,7 @@ fn play(opt: Opt) -> Result<()> {
304309
break;
305310
}
306311
let stack = bpftune_bss_types::stacktrace_event::from_str(&line.unwrap()).unwrap();
307-
for _ in 0..100 {
312+
for _ in 0..8 {
308313
let _ = tx.send(stack);
309314
}
310315
}
@@ -370,7 +375,70 @@ fn main() -> Result<()> {
370375

371376
let mut skel = skel_.load()?;
372377
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+
}
374442
let rb = rbb.build()?;
375443

376444
let mut perf_fds = HashMap::new();

0 commit comments

Comments
 (0)