1
0

proj/test-memory: Output well-formatted report

This commit is contained in:
2025-05-06 14:18:34 +02:00
parent ce43c286a3
commit f16a901207
3 changed files with 119 additions and 40 deletions

View File

@@ -23,7 +23,7 @@ StructAddrInfo = TypedDict('StructAddrInfo', {'ai_flags': Flags, 'ai_family': Co
StructMsgHdr = TypedDict('StructMsgHdr', {})
RET_ADDR_RE = re.compile(r': *((0x)?[0-9a-fA-Fx]+) *\((.+?)\+(.+?)(, *(.+?))?\)$')
RET_ADDR_RE = re.compile(r': *((0x)?[0-9a-fA-Fx]+) *\((.+?)\+(.+?)(, *([^:]+?))?(, *(([^:]+?):([0-9]+)))?\)$')
class ThreadedUnixStreamServer(ThreadingMixIn, UnixStreamServer):
@@ -36,11 +36,13 @@ class Parser:
pid: Optional[int]
tid: Optional[int]
path: Optional[str]
stack: list[tuple[int, str, int, Optional[str], str, tuple]]
stack: list[tuple[int, int, str, Optional[str], Optional[str], Optional[int], str, tuple]]
ret_addr: int
dli_file_name: str
rel_ret_addr: int
dli_file_name: str
dli_sym_name: Optional[str]
src_file_name: Optional[str]
src_line_num: Optional[int]
def __init__(self, rfile: BinaryIO, wfile: BinaryIO = None):
self.rfile = rfile
@@ -226,15 +228,21 @@ class Parser:
call = data.decode('utf-8')
#print(f'[{self.pid}][{self.tid}] {call}')
func_name = call[:call.find('(')]
ret = call[call.rfind(':'):]
ret = call[call.rfind(': '):]
m = RET_ADDR_RE.match(ret)
g_ret, _, g_fname, g_rel, _, g_sym = m.groups()
g_ret, _, g_fname, g_rel, _, g_sym, _, _, src_fname, src_line = m.groups()
self.ret_addr = int(g_ret, 0)
self.rel_ret_addr = int(g_rel, 0)
self.dli_file_name = g_fname
self.rel_ret_addr = int(g_ret, 0)
self.dli_sym_name = g_sym
args, _ = Parser.parse_args(call[call.find('(') + 1:call.rfind(':') - 1])
self.stack.append((self.ret_addr, self.dli_file_name, self.rel_ret_addr, self.dli_sym_name, func_name, args))
self.src_file_name = src_fname
self.src_line_num = int(src_line, 0) if src_line else None
args, _ = Parser.parse_args(call[call.find('(') + 1:call.rfind(': ') - 1])
self.stack.append(
(self.ret_addr, self.rel_ret_addr,
self.dli_file_name, self.dli_sym_name,
self.src_file_name, self.src_line_num,
func_name, args))
try:
func = getattr(self, f'before_{func_name}')
if not callable(func):
@@ -262,7 +270,10 @@ class Parser:
other_vals = ret[1].strip() if len(ret) > 1 else ''
if len(other_vals) > 0:
kwargs, _ = Parser.parse_args(other_vals, named=True, ret=True)
(self.ret_addr, self.dli_file_name, self.rel_ret_addr, self.dli_sym_name, func_name, args) = self.stack.pop()
(self.ret_addr, self.rel_ret_addr,
self.dli_file_name, self.dli_sym_name,
self.src_file_name, self.src_line_num,
func_name, args) = self.stack.pop()
try:
func = getattr(self, f'after_{func_name}')
if not callable(func):