proj/test-interrupts: Output well-formatted report
This commit is contained in:
@@ -26,6 +26,40 @@ StructMsgHdr = TypedDict('StructMsgHdr', {})
|
||||
RET_ADDR_RE = re.compile(r': *((0x)?[0-9a-fA-Fx]+) *\((.+?)\+(.+?)(, *([^:]+?))?(, *(([^:]+?):([0-9]+)))?\)$')
|
||||
|
||||
|
||||
class FunctionCallId:
|
||||
func_name: str
|
||||
ret_addr: int
|
||||
obj_path: str
|
||||
rel_ret_addr: int
|
||||
sym_name: Optional[str]
|
||||
src_file_name: Optional[str]
|
||||
src_line_num: Optional[int]
|
||||
|
||||
@property
|
||||
def obj_name(self) -> str:
|
||||
return self.obj_path.split('/')[-1]
|
||||
|
||||
@property
|
||||
def discriminator(self) -> str:
|
||||
discr = [f'{self.obj_name}+0x{self.rel_ret_addr:x}']
|
||||
if self.sym_name:
|
||||
discr.append(self.sym_name)
|
||||
if self.src_file_name and self.src_line_num:
|
||||
discr.append(f'{self.src_file_name}:{self.src_line_num}')
|
||||
return ', '.join(discr)
|
||||
|
||||
def __eq__(self, other) -> bool:
|
||||
if not isinstance(other, FunctionCallId):
|
||||
return False
|
||||
return (self.func_name, self.obj_path, self.rel_ret_addr) == (other.func_name, other.obj_path, other.rel_ret_addr)
|
||||
|
||||
def __hash__(self) -> int:
|
||||
return hash((self.func_name, self.obj_path, self.rel_ret_addr))
|
||||
|
||||
def __str__(self) -> str:
|
||||
return self.func_name + ', ' + self.discriminator
|
||||
|
||||
|
||||
class ThreadedUnixStreamServer(ThreadingMixIn, UnixStreamServer):
|
||||
pass
|
||||
|
||||
@@ -51,6 +85,17 @@ class Parser:
|
||||
self.pid = None
|
||||
self.path = None
|
||||
|
||||
def get_call_id(self, func_name: str) -> FunctionCallId:
|
||||
call_id = FunctionCallId()
|
||||
call_id.func_name = func_name
|
||||
call_id.ret_addr = self.ret_addr
|
||||
call_id.obj_path = self.dli_file_name
|
||||
call_id.rel_ret_addr = self.rel_ret_addr
|
||||
call_id.sym_name = self.dli_sym_name
|
||||
call_id.src_file_name = self.src_file_name
|
||||
call_id.src_line_num = self.src_line_num
|
||||
return call_id
|
||||
|
||||
def before(self) -> None: pass
|
||||
def after(self) -> None: pass
|
||||
def before_fallback(self, func_name: str, *args) -> str: pass
|
||||
|
||||
Reference in New Issue
Block a user