mirror of
https://github.com/eunomia-bpf/bpf-developer-tutorial.git
synced 2026-02-04 18:54:35 +08:00
55 lines
1.4 KiB
Rust
55 lines
1.4 KiB
Rust
extern crate blazesym;
|
|
|
|
use blazesym::{BlazeSymbolizer, SymbolSrcCfg, SymbolizedResult};
|
|
use std::env;
|
|
|
|
fn show_usage() {
|
|
let args: Vec<String> = env::args().collect();
|
|
println!("Usage: {} <pid> <address>", args[0]);
|
|
println!("Resolve an address in the process of the given pid, and");
|
|
println!("print its symbol, the file name of the source, and the line number.");
|
|
}
|
|
|
|
fn main() {
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
if args.len() != 3 {
|
|
show_usage();
|
|
return;
|
|
}
|
|
|
|
let pid = args[1].parse::<u32>().unwrap();
|
|
let mut addr_str = &args[2][..];
|
|
println!("PID: {pid}");
|
|
|
|
if addr_str.len() > 2 && &addr_str[0..2] == "0x" {
|
|
// Remove prefixed 0x
|
|
addr_str = &addr_str[2..];
|
|
}
|
|
let addr = u64::from_str_radix(addr_str, 16).unwrap();
|
|
|
|
let sym_files = [SymbolSrcCfg::Process { pid: Some(pid) }];
|
|
let resolver = BlazeSymbolizer::new().unwrap();
|
|
let symlist = resolver.symbolize(&sym_files, &[addr]);
|
|
if !symlist[0].is_empty() {
|
|
let SymbolizedResult {
|
|
symbol,
|
|
start_address,
|
|
path,
|
|
line_no,
|
|
column: _,
|
|
} = &symlist[0][0];
|
|
println!(
|
|
"0x{:x} {}@0x{:x}+{} {}:{}",
|
|
addr,
|
|
symbol,
|
|
start_address,
|
|
addr - start_address,
|
|
path,
|
|
line_no
|
|
);
|
|
} else {
|
|
println!("0x{addr:x} is not found");
|
|
}
|
|
}
|