proj/test-memory: Output well-formatted report
This commit is contained in:
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user