From feb2babee53083a54b7f9812a0c7a2181eca5f60 Mon Sep 17 00:00:00 2001 From: Yiwei Lin Date: Sun, 8 Dec 2024 22:21:53 +0800 Subject: [PATCH] Disaply codeinfo for frame print if enabled --- src/msg/stack.rs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/msg/stack.rs b/src/msg/stack.rs index 1278e09..6c742c1 100644 --- a/src/msg/stack.rs +++ b/src/msg/stack.rs @@ -3,7 +3,7 @@ use crate::utils::cast; use std::mem::size_of; use blazesym::symbolize::Sym; -use blazesym::symbolize::{Input, Kernel, Source, Symbolized, Symbolizer}; +use blazesym::symbolize::{CodeInfo, Input, Kernel, Source, Symbolized, Symbolizer}; use blazesym::Addr; use plain::Plain; @@ -20,14 +20,34 @@ unsafe impl Plain for StackMsg {} const ADDR_WIDTH: usize = 16; -fn print_frame(name: &str, addr_info: Option<(Addr, Addr, usize)>) { +fn print_frame(name: &str, addr_info: Option<(Addr, Addr, usize)>, code_info: &Option) { + let code_info = code_info.as_ref().map(|code_info| { + let path = code_info.to_path(); + let path = path.display(); + + match (code_info.line, code_info.column) { + (Some(line), Some(col)) => format!(" {path}:{line}:{col}"), + (Some(line), None) => format!(" {path}:{line}"), + (None, _) => format!(" {path}"), + } + }); + if let Some((input_addr, addr, offset)) = addr_info { println!( - "{input_addr:#0width$x}: {name} @ {addr:#x}+{offset:#x}", - width = ADDR_WIDTH + "{input_addr:#0width$x}: {name} @ {addr:#x}+{offset:#x}{code_info}", + width = ADDR_WIDTH, + code_info = code_info.as_deref().unwrap_or(""), ) } else { - println!("{:width$} {name} [inlined]", " ", width = ADDR_WIDTH) + println!( + "{:width$} {name}{code_info} [inlined]", + " ", + width = ADDR_WIDTH, + code_info = code_info + .map(|info| format!(" @{info}")) + .as_deref() + .unwrap_or(""), + ) } } @@ -50,9 +70,9 @@ pub fn stack_msg_handler(bytes: &[u8]) -> i32 { inlined, .. }) => { - print_frame(&name, Some((input_addr, addr, offset))); + print_frame(&name, Some((input_addr, addr, offset)), &code_info); for frame in inlined.iter() { - print_frame(&frame.name, None); + print_frame(&frame.name, None, &frame.code_info); } } Symbolized::Unknown(..) => {