初始提交

This commit is contained in:
2025-05-13 22:00:58 +08:00
commit e4c030b0c0
564 changed files with 78858 additions and 0 deletions

View File

@ -0,0 +1,12 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
LOSCFG_BASE_IPC_QUEUE_LIMIT = 30
LOSCFG_BASE_CORE_SWTMR_LIMIT = 50
LOSCFG_BASE_IPC_SEM_LIMIT = 30
LOSCFG_PLATFORM_HWI_LIMIT = 96
configHWI_MAX_VECTOR_CNT = 152
configQUEUE_REGISTRY_SIZE = 8
configMAX_PRIORITIES = 56
configMAX_TASK_NAME_LEN = 16

View File

@ -0,0 +1,303 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
DEFINE_SUCCESS=0
DEFINE_FAIL=1
class Sysmbol:
"""符号表中的符号
"""
def __init__(self):
self.addr=None #符号地址
self.key_name = None #符号名
self.class_type=None #符号类型 'a','t','b','d'...
self.type = None #符号类型 'FUNC','OBJECT','NOTYPE' ...
self.size = None #符号size,不是都有
self.section=None #符号落在哪个段
self.guess_size=None #计算出的符号大小(不准),TBD
class _BasicCtrl:
def __init__(self):
self.temp_memory = bytearray(4096) # 临时空间,用于计算
def uapi_str_to_int(str,num):
"""字符串转数字
Args
str: 字符串
num: 进制
return
int:数值
"""
if num!=None:
return int(str,num)
match1=re.match(r'\s*0x',str)
match2=re.match(r'\s*0X',str)
if match1 or match2:
return int(str,16)
else:
return int(str,10)
def uapi_is_hex_word(word):
"""判断是否是16进制字符串
Args
str: 字符串
return
True:是
False:不是
"""
if word is None:
return False
for char in word:
if char not in string.hexdigits:
return False
return True
_g_ctype_x16_class=[c_byte,c_ubyte,c_short,c_ushort,c_int,c_uint,c_long,c_ulong,c_longlong,c_ulonglong,c_size_t,c_ssize_t]
_g_ctype_float_class=[c_float,c_double,c_longdouble]
_g_ctype_char=[c_char,c_bool]
def _print_ctypes_obj(var_name,obj,t,fd):
if type(obj)==int:
print('%s=0x%x'%(var_name,obj),file=fd)
return
if type(obj)==bytes:
print('%s'%(var_name),obj,file=fd)
return
if type(obj)==bool:
print('%s'%(var_name),obj,file=fd)
return
if type(obj)==float:
print('%s=%f'%(var_name,obj),file=fd)
return
if type(obj) in _g_ctype_x16_class:
print('%s=0x%x'%(var_name,obj.value),file=fd)
return
if type(obj) in _g_ctype_float_class:
print('%s=%f'%(var_name,obj.value),file=fd)
return
if type(obj) in _g_ctype_char:
print('%s'%(var_name),obj.value,file=fd)
return
if hasattr(obj, '_length_'):
if hasattr(obj,'value'):
print('%s='%(var_name),obj.value,file=fd)
else:
i=0
for m in obj:
prefix="%s[%d]"%(var_name,i)
_print_ctypes_obj(prefix,m,getattr(obj,'_type_'),fd)
i=i+1
return
if hasattr(obj, '_fields_'):
for field in obj._fields_:
name = field[0]
val = getattr(obj, field[0])
_print_ctypes_obj(var_name+'.'+name,val,field[1],fd)
return
assert(False)
def uapi_print_ctypes_obj(var_name,obj,fd=sys.stdout):
"""打印ctypes object
Args
var_name: 打印名称
obj: 被打印的obj
fd: 输出目标
return
"""
print(var_name+'{',file=fd)
_print_ctypes_obj(' ',obj,type(obj),fd)
print('}',file=fd)
def ctype_member_offset(c_member,c_class):
"""计算ctype类型的成员相对类的偏移
Args
c_member: 成员名字符串
c_class: ctype类
fd: 输出目标
return
int:偏移
"""
list=c_member.split('.')
obj=c_class.from_buffer(_g_basic_ctrl.temp_memory)
temp_obj=obj
for member in list:
x=getattr(temp_obj,member)
temp_obj=x
return addressof(x)-addressof(obj)
class _ParseBinItem:
def __init__(self):
file_name=None
start_addr=None
size = None
data=None
class _ParseMemoryManager:
def __init__(self):
self.momory_list=[]
def register_memory(self,file_name,start_addr,size):
with open(file_name,'rb') as fp:
item = _ParseBinItem()
data = fp.read()
item.file_name=file_name
item.start_addr = start_addr
item.data=bytearray(data)
item.size=size
self.momory_list.append(item)
def register_bin(bin,start_addr,size):
item = _ParseBinItem()
item.file_name=None
item.start_addr = start_addr
item.data=bytearray(bin)
item.size=size
self.momory_list.append(item)
def memory_get(self,addr,size):
match_item=None
for item in self.momory_list:
if addr >= item.start_addr and addr+size < item.start_addr+item.size:
match_item=item
break
if match_item==None:
return None
addr=addr-match_item.start_addr
return match_item.data[addr:addr+size]
class _HookFunctions:
def __init__(self):
self.get_symbol_info = None
self.get_u32_symbol_val = None
self.get_symbol_addr = None
self.addr_2_function_name = None
self.addr_in_2_function_name = None
def parse_memory_get(addr,size):
"""获取一段空间
Args
addr: 起始地址
size:大小
return
binary:成功返回一段空间
None:这段空间不存在
"""
return _g_parse_memory_manager.memory_get(addr,size)
def parse_memory_2_class(addr,class_type,class_size):
"""将一段空间转换成一个ctype obj
Args
addr: 起始地址
class_type: class 类型
class_size: class size
return
obj:返回一个ctype obj
None:这段空间不存在
"""
bin = parse_memory_get(addr,class_size)
if bin==None:
return None
return class_type.from_buffer(bin)
def parse_memory_2_string(addr,max_len):
obj=parse_memory_2_class(addr,(c_char*max_len),sizeof((c_char*max_len)))
if obj==None:
return None
else:
return obj.value.decode('utf-8')
def parse_memory_register(file_name,start_addr,size):
"""注册一段内存
Args
file_name: 内存来自文件,文件全路径
start_addr: 内存起始地址
size: 内存大小
return
"""
_g_parse_memory_manager.register_memory(file_name,start_addr,size)
def parse_memory_register_bin(bin,start_addr,size):
"""注册一段内存
Args
bin: 内存一段binary
start_addr: 内存起始地址
size: 内存大小
return
"""
_g_parse_memory_manager.register_bin(bin,start_addr,size)
def parse_get_symbol_info(name):
"""获取symbolinfo
Args
name: 符号名
return
obj:成功,Sysmbol类型的obj
None:获取失败
"""
if _g_hook_functions.get_symbol_info==None:
assert(False)
return None
return _g_hook_functions.get_symbol_info(name)
def parse_get_u32_symbol_val(name):
"""获取值
Args
name: 符号名
return
int:成功,获取到的值
None:获取失败
"""
if _g_hook_functions.get_u32_symbol_val==None:
assert(False)
return None
return _g_hook_functions.get_u32_symbol_val(name)
def parse_get_symbol_addr(name):
"""获取符号地址
Args
name: 符号名
return
int:成功,获取到的值
None:获取失败
"""
if _g_hook_functions.get_symbol_addr==None:
assert(False)
return None
return _g_hook_functions.get_symbol_addr(name)
def parse_addr_2_function_name(addr):
if _g_hook_functions.addr_2_function_name==None:
assert(False)
return None
return _g_hook_functions.addr_2_function_name(addr)
def parse_addr_in_2_function_name(addr):
if _g_hook_functions.addr_in_2_function_name==None:
assert(False)
return None
return _g_hook_functions.addr_in_2_function_name(addr)
def uapi_register_function(name,function):
if name=="get_symbol_info":
_g_hook_functions.get_symbol_info = function
elif name=="get_u32_symbol_val":
_g_hook_functions.get_u32_symbol_val = function
elif name=="get_symbol_addr":
_g_hook_functions.get_symbol_addr=function
elif name=="addr_2_function_name":
_g_hook_functions.addr_2_function_name = function
elif name=="addr_in_2_function_name":
_g_hook_functions.addr_in_2_function_name = function
else:
assert(False)
_g_parse_memory_manager = _ParseMemoryManager()
_g_basic_ctrl=_BasicCtrl()
_g_hook_functions =_HookFunctions()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,463 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from parse_basic import *
from auto_class import *
from config import *
OS_TASK_STATUS_UNUSED = 0x0001
OS_TASK_STATUS_SUSPEND = 0x0002
OS_TASK_STATUS_READY = 0x0004
OS_TASK_STATUS_PEND = 0x0008
OS_TASK_STATUS_RUNNING = 0x0010
OS_TASK_STATUS_DELAY = 0x0020
OS_TASK_STATUS_TIMEOUT = 0x0040
OS_TASK_STATUS_PEND_TIME = 0x0080
OS_TASK_FLAG_DETACHED = 0x0001
OS_TASK_FLAG_SYSTEM = 0x0002
OS_SWTMR_STATUS_UNUSED = 0
OS_SWTMR_STATUS_DELETING =1
OS_SWTMR_STATUS_CREATED=2
OS_SWTMR_STATUS_TICKING=3
queueQUEUE_TYPE_BASE=0
queueQUEUE_TYPE_SET=0
queueQUEUE_TYPE_MUTEX=1
queueQUEUE_TYPE_COUNTING_SEMAPHORE=2
queueQUEUE_TYPE_BINARY_SEMAPHORE=3
queueQUEUE_TYPE_RECURSIVE_MUTEX=4
CONTEXT_OFFSET=4 * 4 + 33 * 4
#ctypes.addressof(parameter) - ctypes.addressof(parent_structure)
def _los_List_get_all_node(list_addr):
node_list=[]
node=parse_memory_2_class(list_addr,LOS_DL_LIST,sizeof(LOS_DL_LIST))
while node.pstNext!=list_addr:
node_list.append(node.pstNext)
node = parse_memory_2_class(node.pstNext,LOS_DL_LIST,sizeof(LOS_DL_LIST))
return (DEFINE_SUCCESS,node_list)
def _addr_in_2_function_name(addr):
name=parse_addr_in_2_function_name(addr)
if name==None:
return hex(addr)
else:
return name
class _PhaseFreertosCtrl:
def __init__(self):
self.core=None
self.info_fd = sys.__stdout__
self.task_cnt=None
self.tcb_array = []
self.ext_task_list=[]
self.ext_taskstatus_list=[] ##freertos
self.heap_start = None
self.heap_end = None
self.heap_head = None
self.queue_cnt = configQUEUE_REGISTRY_SIZE
self.queue_array=[]
self.queue_ext_info=[]
self.timer_cnt = 0
self.timer_array=[]
self.timer_ext_info=[]
#self.sem_cnt=LOSCFG_BASE_IPC_SEM_LIMIT
#self.sem_array=[]
self.sem_ext_info=[]
self.excInfo=None
self.isr_ext_info=None
class _ExtPercpu:
def __init__(self):
self.handle_addr = None
self.per_cpu=None
self.g_tickCount=None
self.g_sysClock=None
self.g_tickPerSecond=None
self.g_cycle2NsScale=None
self.task_wait_addr=[]
self.timer_wait_addr=[]
self.g_intCount=None
class _ExtTaskInfo:
def __init__(self):
self.handle_addr=None
self.pend_addr=None
self.name='unknown'
self.buttom=0
self.peek_used=0
self.over=0
self.status_str=None
self.enter_name = 'unknown'
self.task_context = None
self.take_sem = None
class _ExtTaskStatus:
def __init__(self):
self.xHandle=None
self.pcTaskName='unknown'
self.xTaskNumber=0
self.eCurrentState=0
self.uxCurrentPriority=0
self.uxBasePriority=0
self.ulRunTimeCounter=0
self.pxStackBase = None
self.usStackHighWaterMark = 0
class _ExtTimerInfo:
def __init__(self):
self.handle_addr=None
self.func_name=None
class _ExtSemInfo:
def __init__(self):
self.handle_addr=None
self.pend_task_list=[]
class _ExtQueueInfo:
def __init__(self):
self.handle_addr=None
self.pend_read_task_list = []
self.pend_write_task_list =[]
class ExtIsrInfo:
def __init__(self):
self.isr_cnt = configHWI_MAX_VECTOR_CNT
self.pxAddr=None
self.pxHwiHandles_list = []
def make_isr_info(self):
self.isr_ext_info = self.ExtIsrInfo()
addr = parse_get_symbol_addr('pxHwiHandles')
self.isr_ext_info.pxAddr = parse_memory_2_class(addr,(uint32_t)*self.isr_ext_info.isr_cnt,sizeof((uint32_t)*self.isr_ext_info.isr_cnt))
for temp_addr in self.isr_ext_info.pxAddr:
if temp_addr!=0:
pxHwiHandles = parse_memory_2_class(temp_addr, HwiHandle_t, sizeof(HwiHandle_t))
self.isr_ext_info.pxHwiHandles_list.append(pxHwiHandles)
def print_isr_info(self):
print("\r\n---------------------content of 中断信息:---------------------",file=self.info_fd)
for hwi in self.isr_ext_info.pxHwiHandles_list:
if hwi.pxCb!=0 or hwi.xCounts!=0:
print("%s[0x%x][call_cnt=%d]"%(_addr_in_2_function_name(hwi.pxCb),hwi.pxCb,hwi.xCounts),file=self.info_fd)
print("",file=self.info_fd)
def _make_task_info(self,pxList):
pxCurrentTCB = parse_get_symbol_addr('pxCurrentTCB')
if pxList.uxNumberOfItems > 0:
num = 0
while num < pxList.uxNumberOfItems:
next_item = parse_memory_2_class(pxList.pxIndex, ListItem_t, sizeof(ListItem_t))
if not next_item:
break
pxList.pxIndex = next_item.pxNext
pxTCB = parse_memory_2_class(next_item.pvOwner, TCB_t, sizeof(TCB_t))
if pxTCB:
taskstatus = self._ExtTaskStatus()
taskstatus.xHandle = next_item.pvOwner
taskstatus.pcTaskName = pxTCB.pcTaskName
taskstatus.xTaskNumber = pxTCB.uxTCBNumber
if (next_item.pvOwner == pxCurrentTCB):
taskstatus.eCurrentState = 0
else:
taskstatus.eCurrentState = 1
taskstatus.uxCurrentPriority = pxTCB.uxPriority
taskstatus.uxBasePriority = pxTCB.uxBasePriority
#taskstatus.ulRunTimeCounter = pxTCB.ulRunTimeCounter
taskstatus.pxStackBase = pxTCB.pxStack
self.ext_taskstatus_list.append(taskstatus)
self.tcb_array.append(pxTCB)
num = num + 1
def make_all_task_info(self):
addr = parse_get_symbol_addr('uxCurrentNumberOfTasks')
obj=parse_memory_2_class(addr,c_uint,4)
self.task_cnt = obj.value
addr = parse_get_symbol_addr('pxReadyTasksLists')
pxReadyLists=parse_memory_2_class(addr, List_t*configMAX_PRIORITIES, sizeof(List_t)*configMAX_PRIORITIES)
for pxList in pxReadyLists:
self._make_task_info(pxList)
TaskListName = ['xDelayedTaskList1', 'xDelayedTaskList2', 'xPendingReadyList', 'xTasksWaitingTermination', 'xSuspendedTaskList']
for tasklist_name in TaskListName:
addr = parse_get_symbol_addr(tasklist_name)
pxList = parse_memory_2_class(addr, List_t, sizeof(List_t))
self._make_task_info(pxList)
def _task_status_2_string(self,status):
str=''
if (status&OS_TASK_STATUS_UNUSED):
str=str+"unused,"
if (status&OS_TASK_STATUS_RUNNING):
str=str+'runing,'
if (status&OS_TASK_STATUS_READY):
str=str+'ready,'
if (status&OS_TASK_STATUS_SUSPEND):
str=str+'suspend,'
if (status&OS_TASK_STATUS_PEND):
str=str+'pend,'
if (status&OS_TASK_STATUS_DELAY):
str=str+'delay,'
if (status&OS_TASK_STATUS_TIMEOUT):
str=str+'timeout,'
if (status&OS_TASK_STATUS_PEND_TIME):
str=str+'pendtime,'
return str
def _make_task_extra_info(self):
i=0
while i < self.task_cnt:
tcb = self.tcb_array[i]
ext_info=self.ext_task_list[i]
if tcb.taskStatus & OS_TASK_STATUS_UNUSED: #未使用任务返回
i=i+1
continue;
ext_info.buttom = tcb.topOfStack+tcb.stackSize #计算栈buttom
ext_info.status_str = self._task_status_2_string(tcb.taskStatus)
if tcb.taskSem!=0:
ext_info.take_sem = parse_memory_2_class(tcb.taskSem,LosSemCB,sizeof(LosSemCB))
#生成taskname
addr=tcb.taskName
str = parse_memory_2_string(addr,32)
if str!=None:
ext_info.name=str
#判断栈是否溢出
obj = parse_memory_2_class(tcb.topOfStack,c_uint,sizeof(c_uint))
if obj.value==0xCCCCCCCC:
ext_info.over=0
else:
ext_info.over=1
#计算栈峰值
addr = tcb.topOfStack+4
while addr < ext_info.buttom:
obj = parse_memory_2_class(addr,c_uint,sizeof(c_uint))
if obj.value != 0xCACACACA:
break
addr+=4
ext_info.peek_used = ext_info.buttom-addr
enter_name=parse_addr_2_function_name(tcb.taskEntry)
if enter_name!=None:
ext_info.enter_name = enter_name
ext_info.task_context=parse_memory_2_class(tcb.stackPointer,TaskContext,sizeof(TaskContext))
i=i+1
def print_task_short_info(self):
print("\r\n--------------------content of 任务信息摘要:--------------------",file=self.info_fd)
print('%4s|%20s|%4s|%10s|%10s|%s|%10s'%('xHandle','TaskName','xTaskNumber','eCurrentState','CurrentPriority','BasePriority','StackBase'),file=self.info_fd)
for taskstatus in self.ext_taskstatus_list:
print('0x%08x|%20s|%4d|%4d|0x%08x|0x%08x|0x%08x'
%(taskstatus.xHandle,taskstatus.pcTaskName,taskstatus.xTaskNumber,taskstatus.eCurrentState,taskstatus.uxCurrentPriority,taskstatus.uxBasePriority,taskstatus.pxStackBase),file=self.info_fd)
def print_task_detail_info(self):
print("\r\n--------------------content of 任务详细信息:--------------------",file=self.info_fd)
print("说明:tcb任务控制块信息,context:任务上下文的寄存器信息,backtrace 栈回溯",file=self.info_fd)
for tcb in self.tcb_array:
print('',file=self.info_fd)
uapi_print_ctypes_obj('tcb',tcb,self.info_fd)
ext_info = parse_memory_2_class(tcb.pxTopOfStack+CONTEXT_OFFSET,exc_context_freertos_t,sizeof(exc_context_freertos_t))
#打印寄存器信息
print("[TASK]%s 寄存器:"%(tcb.pcTaskName),file=self.info_fd)
uapi_print_ctypes_obj('context',ext_info,self.info_fd)
#打印back_trace
print("[TASK]%s back trace..."%(tcb.pcTaskName))
print("[TASK]%s 栈回溯:"%(tcb.pcTaskName),file=self.info_fd)
sp = tcb.pxTopOfStack+CONTEXT_OFFSET
self.stack_back_trace(tcb.pxStack, sp)
#print("[TASK]%s 其它状态:"%(ext_info.name),file=self.info_fd)
def make_queue_info(self):
addr = parse_get_symbol_addr('xQueueRegistry')
i=0
while i< self.queue_cnt:
obj=parse_memory_2_class(addr,QueueRegistryItem_t,sizeof(QueueRegistryItem_t))
if obj:
queue_item=parse_memory_2_class(obj.xHandle,Queue_t,sizeof(Queue_t))
self.queue_array.append(queue_item)
addr=addr+sizeof(QueueRegistryItem_t)
i=i+1
def print_queue_info(self):
print("\r\n--------------------content of 消息队列信息:--------------------",file=self.info_fd)
print("说明:queueName队列名字,queueHandle队列的内存空间, queueType队列类型, queueLen队列长度, queueItemSize每个节点大小queueUsed已用节点个数, queueAvailable剩余节点个数",file=self.info_fd)
i=0
for queue in self.queue_array:
if queue!=None:
if queue.ucQueueType == queueQUEUE_TYPE_BASE:
uapi_print_ctypes_obj('queue',queue,self.info_fd)
print("",file=self.info_fd)
i=i+1
print("",file=self.info_fd)
def make_timer_info(self):
pxaddr = parse_get_u32_symbol_val('pxCurrentTimerList')
addrList = parse_memory_2_class(pxaddr, uint32_t, sizeof(uint32_t))
if addrList:
pxList=parse_memory_2_class(addrList.value, List_t, sizeof(List_t))
if pxList != None:
if pxList.uxNumberOfItems > 0:
while self.timer_cnt < pxList.uxNumberOfItems:
next_item = parse_memory_2_class(pxList.pxIndex, ListItem_t, sizeof(ListItem_t))
pxList.pxIndex = next_item.pxNext
obj = parse_memory_2_class(next_item.pvOwner, Timer_t, sizeof(Timer_t))
self.timer_array.append(obj)
self.timer_cnt = self.timer_cnt + 1
def print_timer_info(self):
print("---------------------content of 定时器信息:---------------------",file=self.info_fd)
print("说明:SwTmr_Used定时器个数SwTmr_Total定时器个数上限timer_id定时器idpxCallbackFunction回调函数的地址xTimerPeriodInTicks调用周期ucStatus(1:ACTIVE 2:STATICALLY_ALLOCATED 3:AUTORELOAD)",file=self.info_fd)
print("SwTmr_Used=%d, SwTmr_Total=unlimited"%(self.timer_cnt),file=self.info_fd)
i=0
while i< self.timer_cnt:
timer=self.timer_array[i]
print("timer_id=%d %s[0x%x]"%(timer.pvTimerID,_addr_in_2_function_name(timer.pxCallbackFunction),timer.pxCallbackFunction),file=self.info_fd)
uapi_print_ctypes_obj('timer',timer,self.info_fd)
print('',file=self.info_fd)
i=i+1
print("",file=self.info_fd)
def _make_sem_extra_info(self):
i=0
while i< self.sem_cnt:
sem=self.sem_array[i]
ext_info=self.sem_ext_info[i]
if sem.semStat==1: #used
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('semList',LosSemCB))
for node_addr in addr_list:
ext_info.pend_task_list.append(node_addr)
i=i+1
def make_sem_info(self):
addr = parse_get_u32_symbol_val('g_osAllSem')
i=0
while i< self.sem_cnt:
ext_info=self._ExtSemInfo()
obj=parse_memory_2_class(addr,LosSemCB,sizeof(LosSemCB))
ext_info.handle_addr=addr
self.sem_array.append(obj)
self.sem_ext_info.append(ext_info)
addr=addr+sizeof(LosSemCB)
i=i+1
self._make_sem_extra_info()
def get_pending_task(self,addr_list):
list=[]
for addr in addr_list:
i=0
while i < self.task_cnt:
ext_task = self.ext_task_list[i]
tcb = self.tcb_array[i]
if addr== ext_task.pend_addr:
list.append(tcb.taskId)
i=i+1
return list
def print_sem_info(self):
print("--------------------content of 信号量:--------------------",file=self.info_fd)
print("说明:SemName信号量名字,SemHandle信号量的地址, MaxCount信号量最大个数, Count已用个数",file=self.info_fd)
i=0
for queue in self.queue_array:
if queue!=None:
if queue.ucQueueType==queueQUEUE_TYPE_COUNTING_SEMAPHORE or queue.ucQueueType==queueQUEUE_TYPE_BINARY_SEMAPHORE or queue.ucQueueType==queueQUEUE_TYPE_RECURSIVE_MUTEX:
uapi_print_ctypes_obj('Sem',queue,self.info_fd)
print("",file=self.info_fd)
i=i+1
print("",file=self.info_fd)
def make_crash_info(self):
addr = parse_get_symbol_addr('g_exc_buff_addr')
self.excInfo = parse_memory_2_class(addr,exc_context_t,sizeof(exc_context_t))
def print_crash_info(self):
print("--------------------content of 死机信息:--------------------",file=self.info_fd)
uapi_print_ctypes_obj('g_exc_buff_addr',self.excInfo,self.info_fd)
self.stack_back_trace(self.excInfo.task_context.sp+sizeof(task_context_t),self.excInfo.task_context.sp+0x1000)
def stack_back_trace(self,start_addr,end_addr):
sp=start_addr
while sp < end_addr:
obj=parse_memory_2_class(sp,c_uint,sizeof(c_uint))
name = parse_addr_in_2_function_name(obj.value-4)
if name:
print("[BACK Trace][addr=0x%08x][val=0x%08x]%s"%(sp,obj.value,name),file=self.info_fd)
else:
pass
#print("[BACK Trace][addr=0x%08x][val=0x%08x]"%(sp,obj.value),file=self.info_fd)
sp=sp+4
_g_parse_freertos_ctrl=_PhaseFreertosCtrl()
def make_freertos_info():
try:
_g_parse_freertos_ctrl.make_all_task_info()
except:
print("[EXCEPTION]make_all_task_info fail.")
try:
_g_parse_freertos_ctrl.make_queue_info()
except:
print("[EXCEPTION]make_queue_info fail.")
try:
_g_parse_freertos_ctrl.make_timer_info()
except:
print("[EXCEPTION]make_timer_info fail.")
try:
_g_parse_freertos_ctrl.make_crash_info()
except:
print("[EXCEPTION]make_crash_info fail.")
try:
_g_parse_freertos_ctrl.make_isr_info()
except:
print("[EXCEPTION]make_isr_info fail.")
def print_freertos_info():
try:
_g_parse_freertos_ctrl.print_isr_info()
except:
print("[EXCEPTION]print_isr_info fail.")
try:
_g_parse_freertos_ctrl.print_queue_info()
except:
print("[EXCEPTION]print_queue_info fail.")
try:
_g_parse_freertos_ctrl.print_timer_info()
except:
print("[EXCEPTION]print_timer_info fail.")
try:
_g_parse_freertos_ctrl.print_sem_info()
except:
print("[EXCEPTION]print_sem_info fail.")
try:
_g_parse_freertos_ctrl.print_task_short_info()
except:
print("[EXCEPTION]print_task_short_info fail.")
try:
_g_parse_freertos_ctrl.print_task_detail_info()
except:
print("[EXCEPTION]print_task_detail_info fail.")
try:
_g_parse_freertos_ctrl.print_crash_info()
except:
print("[EXCEPTION]print_crash_info fail.")
def parse_freertos_info(log_fp):
_g_parse_freertos_ctrl.info_fd = log_fp
make_freertos_info()
print_freertos_info()
print("parse_freertos_info end!")

View File

@ -0,0 +1,761 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from parse_basic import *
from auto_class import *
from config import *
OS_TASK_STATUS_UNUSED = 0x0001
OS_TASK_STATUS_SUSPEND = 0x0002
OS_TASK_STATUS_READY = 0x0004
OS_TASK_STATUS_PEND = 0x0008
OS_TASK_STATUS_RUNNING = 0x0010
OS_TASK_STATUS_DELAY = 0x0020
OS_TASK_STATUS_TIMEOUT = 0x0040
OS_TASK_STATUS_PEND_TIME = 0x0080
OS_TASK_FLAG_DETACHED = 0x0001
OS_TASK_FLAG_SYSTEM = 0x0002
OS_SWTMR_STATUS_UNUSED = 0
OS_SWTMR_STATUS_DELETING =1
OS_SWTMR_STATUS_CREATED=2
OS_SWTMR_STATUS_TICKING=3
#ctypes.addressof(parameter) - ctypes.addressof(parent_structure)
def _los_List_get_all_node(list_addr):
node_list=[]
node=parse_memory_2_class(list_addr,LOS_DL_LIST,sizeof(LOS_DL_LIST))
if node:
while node.pstNext!=list_addr:
node_list.append(node.pstNext)
node = parse_memory_2_class(node.pstNext,LOS_DL_LIST,sizeof(LOS_DL_LIST))
return (DEFINE_SUCCESS,node_list)
def _addr_in_2_function_name(addr):
name=parse_addr_in_2_function_name(addr)
if name==None:
return hex(addr)
else:
return name
class _PhaseLiteosCtrl:
def __init__(self):
self.core=None
self.info_fd = sys.__stdout__
self.task_cnt=None
self.tcb_array = []
self.ext_task_list=[]
self.heap_start = None
self.heap_end = None
self.heap_head = None
self.queue_cnt = LOSCFG_BASE_IPC_QUEUE_LIMIT
self.queue_array=[]
self.queue_ext_info=[]
self.timer_cnt = LOSCFG_BASE_CORE_SWTMR_LIMIT
self.timer_array=[]
self.timer_ext_info=[]
self.sem_cnt=LOSCFG_BASE_IPC_SEM_LIMIT
self.sem_array=[]
self.sem_ext_info=[]
self.excInfo=None
self.isr_ext_info=None
self.version=None
class _ExtPercpu:
def __init__(self):
self.handle_addr = None
self.per_cpu=None
self.g_tickCount=None
self.g_sysClock=None
self.g_tickPerSecond=None
self.g_cycle2NsScale=None
self.task_wait_addr=[]
self.timer_wait_addr=[]
self.g_intCount=None
class _ExtTaskInfo:
def __init__(self):
self.handle_addr=None
self.pend_addr=None
self.name='unknown'
self.buttom=0
self.peek_used=0
self.over=0
self.status_str=None
self.enter_name = 'unknown'
self.task_context = None
self.take_sem = None
class _ExtTimerInfo:
def __init__(self):
self.handle_addr=None
self.func_name=None
class _ExtSemInfo:
def __init__(self):
self.handle_addr=None
self.pend_task_list=[]
class _ExtQueueInfo:
def __init__(self):
self.handle_addr=None
self.pend_read_task_list = []
self.pend_write_task_list =[]
class ExtIsrInfo:
def __init__(self):
self.isr_cnt = LOSCFG_PLATFORM_HWI_LIMIT
self.g_hwiForm=None
def make_isr_info(self):
self.isr_ext_info = self.ExtIsrInfo()
addr = parse_get_symbol_addr('g_hwiForm')
if self.version == 207:
self.isr_ext_info.g_hwiForm = parse_memory_2_class(addr,HwiHandleInfo*self.isr_ext_info.isr_cnt,sizeof(HwiHandleInfo*self.isr_ext_info.isr_cnt))
elif self.version == 208:
self.isr_ext_info.g_hwiForm = parse_memory_2_class(addr,HwiHandleInfo*self.isr_ext_info.isr_cnt,sizeof(HwiHandleInfo*self.isr_ext_info.isr_cnt))
def print_isr_info(self):
print("\r\n--------------------content of 中断信息:--------------------",file=self.info_fd)
if self.version == 207:
for hwi in self.isr_ext_info.g_hwiForm:
if hwi.hook!=0 or hwi.respCount!=0:
print("%s[0x%x][call_cnt=%d]"%(_addr_in_2_function_name(hwi.hook),hwi.hook,hwi.respCount),file=self.info_fd)
elif self.version == 208:
for hwi in self.isr_ext_info.g_hwiForm:
if hwi.hook!=0 or hwi.respCount!=0:
print("%s[0x%x][call_cnt=%d]"%(_addr_in_2_function_name(hwi.hook),hwi.hook,hwi.respCount),file=self.info_fd)
def make_per_cpu_info(self):
self.core=self._ExtPercpu()
self.core.handle_addr = parse_get_symbol_addr('g_percpu')
self.core.per_cpu = parse_memory_2_class(self.core.handle_addr,Percpu,sizeof(Percpu))
addr = parse_get_symbol_addr('g_tickCount')
if addr:
obj=parse_memory_2_class(addr,c_ulonglong,sizeof(c_ulonglong))
self.core.g_tickCount=obj.value
addr = parse_get_symbol_addr('g_sysClock')
if addr:
obj=parse_memory_2_class(addr,c_uint,sizeof(c_uint))
self.core.g_sysClock=obj.value
addr = parse_get_symbol_addr('g_intCount')
if addr:
obj=parse_memory_2_class(addr,c_uint,sizeof(c_uint))
self.core.g_intCount=obj.value
addr = parse_get_symbol_addr('g_tickPerSecond')
if addr:
obj=parse_memory_2_class(addr,c_uint,sizeof(c_uint))
self.core.g_tickPerSecond=obj.value
addr = parse_get_symbol_addr('g_cycle2NsScale')
if addr:
obj=parse_memory_2_class(addr,c_double,sizeof(c_double))
self.core.g_cycle2NsScale=obj.value
(ret,self.core.task_wait_addr) = _los_List_get_all_node(self.core.per_cpu.taskSortLink.sortLink)
(ret,self.core.timer_wait_addr) = _los_List_get_all_node(self.core.per_cpu.swtmrSortLink.sortLink)
def print_per_cpu_info(self):
print("\r\n--------------------content of 调度信息汇总:--------------------",file=self.info_fd)
print("说明:taskLockCnt锁任务嵌套次数",file=self.info_fd)
if self.core.g_cycle2NsScale:
print("g_tickCount=%ull,g_sysClock=%u,g_tickPerSecond=%u,g_cycle2NsScale=%f"%(self.core.g_tickCount,self.core.g_sysClock,self.core.g_tickPerSecond,self.core.g_cycle2NsScale),file=self.info_fd)
else:
print("g_tickCount=%ull,g_sysClock=%u,g_tickPerSecond=%u"%(self.core.g_tickCount,self.core.g_sysClock,self.core.g_tickPerSecond),file=self.info_fd)
uapi_print_ctypes_obj('schedule',self.core.per_cpu,self.info_fd)
delay_tick=0
for x in self.core.task_wait_addr:
x = x-ctype_member_offset('sortList.sortLinkNode',LosTaskCB)
i=0
while i< self.task_cnt:
tcb=self.tcb_array[i]
ext_info=self.ext_task_list[i]
if ext_info.handle_addr==x:
delay_tick=delay_tick+tcb.sortList.idxRollNum
print("任务等待剩余时间:%s[%d][剩余时间 delay=%d tick][idxRollNum=%d]"%(ext_info.name,tcb.taskId,delay_tick,tcb.sortList.idxRollNum),file=self.info_fd)
i=i+1
delay_tick=0
for x in self.core.timer_wait_addr:
x = x-ctype_member_offset('sortList.sortLinkNode',LosSwtmrCB)
i=0
while i< self.timer_cnt:
timer=self.timer_array[i]
ext_info=self.timer_ext_info[i]
if ext_info.handle_addr==x:
delay_tick=delay_tick+timer.sortList.idxRollNum
print("定时器到期剩余时间:%s[%d][剩余时间=%d tick][idxRollNum=%d]"%(ext_info.func_name,timer.timerId,delay_tick,timer.sortList.idxRollNum),file=self.info_fd)
i=i+1
def make_task_info(self):
addr = parse_get_symbol_addr('g_taskMaxNum')
obj=parse_memory_2_class(addr,c_uint,4)
self.task_cnt = obj.value
addr = parse_get_symbol_addr('g_osTaskCBArray')
obj=parse_memory_2_class(addr,c_uint,4)
addr=obj.value
i=0
while i < self.task_cnt:
ext_info = self._ExtTaskInfo()
obj=parse_memory_2_class(addr,LosTaskCB,sizeof(LosTaskCB))
self.tcb_array.append(obj)
self.ext_task_list.append(ext_info)
ext_info.handle_addr=addr
ext_info.pend_addr = ext_info.handle_addr+ctype_member_offset('pendList',LosTaskCB)
addr=addr+sizeof(LosTaskCB)
i=i+1
self._make_task_extra_info()
def _task_status_2_string(self,status):
str=''
if (status&OS_TASK_STATUS_UNUSED):
str=str+"unused,"
if (status&OS_TASK_STATUS_RUNNING):
str=str+'runing,'
if (status&OS_TASK_STATUS_READY):
str=str+'ready,'
if (status&OS_TASK_STATUS_SUSPEND):
str=str+'suspend,'
if (status&OS_TASK_STATUS_PEND):
str=str+'pend,'
if (status&OS_TASK_STATUS_DELAY):
str=str+'delay,'
if (status&OS_TASK_STATUS_TIMEOUT):
str=str+'timeout,'
if (status&OS_TASK_STATUS_PEND_TIME):
str=str+'pendtime,'
return str
def _make_task_extra_info(self):
i=0
while i < self.task_cnt:
tcb = self.tcb_array[i]
ext_info=self.ext_task_list[i]
if tcb.taskStatus & OS_TASK_STATUS_UNUSED: #未使用任务返回
i=i+1
continue;
ext_info.buttom = tcb.topOfStack+tcb.stackSize #计算栈buttom
ext_info.status_str = self._task_status_2_string(tcb.taskStatus)
if tcb.taskSem!=0:
ext_info.take_sem = parse_memory_2_class(tcb.taskSem,LosSemCB,sizeof(LosSemCB))
#生成taskname
addr=tcb.taskName
str = parse_memory_2_string(addr,32)
if str!=None:
ext_info.name=str
#判断栈是否溢出
obj = parse_memory_2_class(tcb.topOfStack,c_uint,sizeof(c_uint))
if obj.value==0xCCCCCCCC:
ext_info.over=0
else:
ext_info.over=1
#计算栈峰值
addr = tcb.topOfStack+4
while addr < ext_info.buttom:
obj = parse_memory_2_class(addr,c_uint,sizeof(c_uint))
if obj.value != 0xCACACACA:
break
addr+=4
ext_info.peek_used = ext_info.buttom-addr
enter_name=parse_addr_2_function_name(tcb.taskEntry)
if enter_name!=None:
ext_info.enter_name = enter_name
if self.version == 207:
ext_info.task_context=parse_memory_2_class(tcb.stackPointer,TaskContext,sizeof(TaskContext))
elif self.version == 208:
ext_info.task_context=parse_memory_2_class(tcb.stackPointer,TaskContext,sizeof(TaskContext))
else:
ext_info.task_context=parse_memory_2_class(tcb.stackPointer,td_u32,sizeof(td_u32))
i=i+1
def print_task_short_info(self):
print("\r\n--------------------content of 任务信息摘要:--------------------",file=self.info_fd)
print('%4s|%20s|%4s|%10s|%10s|%s|%10s|%10s|%10s|%4s|%15s|'%('id','task_name','pri','stackSize','topOfStack','ButtomOfStack','sp','cur_used','peak_used','ovf','status'),file=self.info_fd)
i=0
while i < self.task_cnt:
tcb = self.tcb_array[i]
ext_info = self.ext_task_list[i]
if not tcb.taskStatus & OS_TASK_STATUS_UNUSED:
print('%4d|%20s|%4d|0x%08x|0x%08x|0x%08x |0x%08x|0x%08x|0x%08x|%4d|%15s|'
%(i,ext_info.name,tcb.priority,tcb.stackSize,tcb.topOfStack,ext_info.buttom,tcb.stackPointer,0,ext_info.peek_used,ext_info.over,ext_info.status_str),file=self.info_fd)
i=i+1
def print_task_detail_info(self):
print("\r\n--------------------content of 任务详细信息:--------------------",file=self.info_fd)
print("说明:tcb任务控制块信息,context:任务上下文的寄存器信息,backtrace 栈回溯",file=self.info_fd)
i=0
while i < self.task_cnt:
print('',file=self.info_fd)
tcb = self.tcb_array[i]
uapi_print_ctypes_obj('tcb',tcb,self.info_fd)
ext_info = self.ext_task_list[i]
i=i+1
if tcb.taskStatus & OS_TASK_STATUS_UNUSED:
continue
#打印寄存器信息
print("[TASK]%s 寄存器:"%(ext_info.name),file=self.info_fd)
uapi_print_ctypes_obj('context',ext_info.task_context,self.info_fd)
#打印back_trace
print("[TASK]%s 栈回溯:"%(ext_info.name),file=self.info_fd)
if self.version == 207:
sp = tcb.stackPointer+sizeof(TaskContext)
elif self.version == 208:
sp = tcb.stackPointer+sizeof(TaskContext)
else:
sp = tcb.stackPointer
self.stack_back_trace(sp,tcb.topOfStack + tcb.stackSize)
print("[TASK]%s 其它状态:"%(ext_info.name),file=self.info_fd)
if ext_info.take_sem:
print("[waitting_sem][id=0x%08x]"%(ext_info.take_sem.semId),file=self.info_fd)
def make_heap_info(self):
addr = parse_get_symbol_addr('m_aucSysMem0')
obj=parse_memory_2_class(addr,c_uint,4)
self.heap_start=obj.value
if self.version == 207:
self.heap_head=parse_memory_2_class(self.heap_start,LosMemPoolInfo,sizeof(LosMemPoolInfo))
if self.heap_head:
self.heap_end = self.heap_start + self.heap_head.size
elif self.version == 208:
self.heap_head=parse_memory_2_class(self.heap_start,LosMemPoolInfo,sizeof(LosMemPoolInfo))
if self.heap_head:
self.heap_end = self.heap_start + self.heap_head.size
def print_heap_info(self):
print("--------------------content of 内存堆信息:--------------------",file=self.info_fd)
self.print_heap_head_info()
self.print_heap_from_head()
self.print_heap_from_tail()
def print_heap_head_info(self):
pass
def print_heap_from_head(self):
print("从头遍历内存池:",file=self.info_fd)
print("说明:node内存节点地址,usr用户空间地址(申请对齐内存场景不准),size内存大小,used是否占用",file=self.info_fd)
if self.heap_head:
addr = self.heap_head.head
while addr >= self.heap_start and addr <= self.heap_end:
node = parse_memory_2_class(addr,LosHeapNode,sizeof(LosHeapNode))
if(node.size==0):
break;
str="[node=0x%x][usr=0x%x][prev=0x%x][size=0x%x][used=%d]"%(addr,addr+8,node.prev,node.size,node.used)
if hasattr(LosHeapNode,'lr'):
i=0
while i< sizeof(node.lr)/sizeof(c_uint):
str="%s[%s][0x%x]"%(str,_addr_in_2_function_name(node.lr[i]),node.lr[i])
i=i+1
print(str,file=self.info_fd)
addr=addr+sizeof(LosHeapNode)+node.size
def print_heap_from_tail(self):
print("从尾遍历内存池:",file=self.info_fd)
print("说明:node内存节点地址,usr用户空间地址(申请对齐内存场景不准),size内存大小,used是否占用",file=self.info_fd)
if self.heap_head:
addr = self.heap_head.tail
while addr >= self.heap_start and addr <= self.heap_end:
node = parse_memory_2_class(addr,LosHeapNode,sizeof(LosHeapNode))
str="[node][addr=0x%x][usr=0x%x][prev=0x%x][size=0x%x][used=%d]"%(addr,addr+8,node.prev,node.size,node.used)
print(str,file=self.info_fd)
if addr==self.heap_head.head:
break
addr=node.prev
def make_queue_info(self):
addr = parse_get_u32_symbol_val('g_osAllQueue')
i=0
while i< self.queue_cnt:
ext_info=self._ExtQueueInfo()
obj=parse_memory_2_class(addr,LosQueueCB,sizeof(LosQueueCB))
ext_info.handle_addr=addr
self.queue_array.append(obj)
self.queue_ext_info.append(ext_info)
addr=addr+sizeof(LosQueueCB)
i=i+1
self._make_queue_ext_info()
def _make_queue_ext_info(self):
i=0
while i< self.queue_cnt:
queue=self.queue_array[i]
ext_info=self.queue_ext_info[i]
if queue and queue.queueState==1: #used
if self.version == 207:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB))
elif self.version == 208:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB))
else:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB) + 4)
for node_addr in addr_list:
ext_info.pend_read_task_list.append(node_addr)
if self.version == 207:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB)+sizeof(LOS_DL_LIST))
elif self.version == 208:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB)+sizeof(LOS_DL_LIST))
else:
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('readWriteList',LosQueueCB) + 4 + sizeof(LOS_DL_LIST))
for node_addr in addr_list:
ext_info.pend_write_task_list.append(node_addr)
i=i+1
def print_queue_info(self):
print("\r\n--------------------content of 消息队列信息:--------------------",file=self.info_fd)
print("说明:queueHandle队列的内存空间,queueLen队列长度,queueSize单个节点大小,queueId队列id,readWriteableCnt[0]当前队列中有几个数据,readWriteableCnt[1]当前队列中有几个剩余空间",file=self.info_fd)
print("",file=self.info_fd)
i=0
while i< self.queue_cnt:
queue=self.queue_array[i]
ext_info=self.queue_ext_info[i]
if queue.queueState==1:
uapi_print_ctypes_obj('queue',queue,self.info_fd)
list=self.get_pending_task(ext_info.pend_read_task_list)
print("等待读该消息队列的任务ID:",list,file=self.info_fd)
list=self.get_pending_task(ext_info.pend_write_task_list)
print("等待写该消息队列的任务ID:",list,file=self.info_fd)
print("",file=self.info_fd)
i=i+1
def _make_timer_ext_info(self):
i=0
while i< self.timer_cnt:
timer=self.timer_array[i]
ext_info=self.timer_ext_info[i]
if timer.state==OS_SWTMR_STATUS_UNUSED or timer.state==OS_SWTMR_STATUS_DELETING:
i=i+1
continue
ext_info.func_name = parse_addr_2_function_name(timer.handler)
i=i+1
def make_timer_info(self):
addr = parse_get_u32_symbol_val('g_osSwtmrCBArray')
i=0
while i< self.timer_cnt:
obj=parse_memory_2_class(addr,LosSwtmrCB,sizeof(LosSwtmrCB))
ext_info=self._ExtTimerInfo()
self.timer_ext_info.append(ext_info)
self.timer_array.append(obj)
ext_info.handle_addr=addr
addr=addr+sizeof(LosSwtmrCB)
i=i+1
self._make_timer_ext_info()
def print_timer_info(self):
print("--------------------content of 定时器信息:--------------------",file=self.info_fd)
print("说明:timer_id定时器id,handler回调函数的地址(已解析),state(0:未使用 1:删除 2:创建 3:执行中),mode(1:周期 2:单次)",file=self.info_fd)
print("\t overrun周期性定时器执行次数,arg用户参数,inProcess到期已添加到待执行队列",file=self.info_fd)
print('',file=self.info_fd)
i=0
while i< self.timer_cnt:
timer=self.timer_array[i]
ext_info=self.timer_ext_info[i]
if timer.state==OS_SWTMR_STATUS_UNUSED or timer.state==OS_SWTMR_STATUS_DELETING:
i=i+1
continue
print("timer_id=%d %s[0x%x]"%(timer.timerId,ext_info.func_name,timer.handler),file=self.info_fd)
uapi_print_ctypes_obj('timer',timer,self.info_fd)
print('',file=self.info_fd)
i=i+1
def _make_sem_extra_info(self):
i=0
while i< self.sem_cnt:
sem=self.sem_array[i]
ext_info=self.sem_ext_info[i]
if sem.semStat==1: #used
(ret,addr_list)=_los_List_get_all_node(ext_info.handle_addr + ctype_member_offset('semList',LosSemCB))
for node_addr in addr_list:
ext_info.pend_task_list.append(node_addr)
i=i+1
def make_sem_info(self):
addr = parse_get_u32_symbol_val('g_osAllSem')
i=0
while i< self.sem_cnt:
ext_info=self._ExtSemInfo()
obj=parse_memory_2_class(addr,LosSemCB,sizeof(LosSemCB))
ext_info.handle_addr=addr
self.sem_array.append(obj)
self.sem_ext_info.append(ext_info)
addr=addr+sizeof(LosSemCB)
i=i+1
self._make_sem_extra_info()
def get_pending_task(self,addr_list):
list=[]
for addr in addr_list:
i=0
while i < self.task_cnt:
ext_task = self.ext_task_list[i]
tcb = self.tcb_array[i]
if addr== ext_task.pend_addr:
list.append(tcb.taskId)
i=i+1
return list
def print_sem_info(self):
print("--------------------content of 信号量:--------------------",file=self.info_fd)
print("说明:semType(0:计数信号量 1:互斥信号量),semCount剩余信号量个数",file=self.info_fd)
print("",file=self.info_fd)
i=0
while i< self.sem_cnt:
sem=self.sem_array[i]
ext_info=self.sem_ext_info[i]
if sem.semStat:
uapi_print_ctypes_obj('sem',sem,self.info_fd)
list=self.get_pending_task(ext_info.pend_task_list)
print("等待该信号量的任务ID:",list,file=self.info_fd)
print('',file=self.info_fd)
i=i+1
def make_crash_info(self):
addr = parse_get_symbol_addr('g_excInfo')
self.excInfo = parse_memory_2_class(addr,ExcInfo,sizeof(ExcInfo))
def print_crash_info(self):
print("--------------------content of 死机信息:--------------------",file=self.info_fd)
uapi_print_ctypes_obj('g_excInfo',self.excInfo,self.info_fd)
if self.excInfo.context!=0:
obj=parse_memory_2_class(self.excInfo.context,ExcContext,sizeof(ExcContext))
uapi_print_ctypes_obj('context',obj,self.info_fd)
if self.version == 207:
self.stack_back_trace(obj.taskContext.sp+sizeof(TaskContext),obj.taskContext.sp+0x1000)
elif self.version == 208:
self.stack_back_trace(obj.taskContext.sp+sizeof(TaskContext),obj.taskContext.sp+0x1000)
else:
self.stack_back_trace(obj.SP, obj.SP + 0x1000)
def stack_back_trace(self,start_addr,end_addr):
sp=start_addr
while sp < end_addr:
obj=parse_memory_2_class(sp,c_uint,sizeof(c_uint))
if obj:
name = parse_addr_in_2_function_name(obj.value-4)
if name:
print("[BACK Trace][addr=0x%08x][val=0x%08x]%s"%(sp,obj.value,name),file=self.info_fd)
else:
pass
#print("[BACK Trace][addr=0x%08x][val=0x%08x]"%(sp,obj.value),file=self.info_fd)
sp=sp+4
_g_parse_liteos_ctrl=_PhaseLiteosCtrl()
def make_liteos_info():
try:
_g_parse_liteos_ctrl.make_per_cpu_info()
except:
print("[EXCEPTION]make_per_cpu_info fail.")
try:
_g_parse_liteos_ctrl.make_task_info()
except:
print("[EXCEPTION]make_task_info fail.")
if _g_parse_liteos_ctrl.version != 208:
try:
_g_parse_liteos_ctrl.make_queue_info()
except:
print("[EXCEPTION]make_queue_info fail.")
try:
_g_parse_liteos_ctrl.make_heap_info()
except:
print("[EXCEPTION]make_heap_info fail.")
try:
_g_parse_liteos_ctrl.make_timer_info()
except:
print("[EXCEPTION]make_timer_info fail.")
try:
_g_parse_liteos_ctrl.make_sem_info()
except:
print("[EXCEPTION]make_sem_info fail.")
try:
_g_parse_liteos_ctrl.make_crash_info()
except:
print("[EXCEPTION]make_crash_info fail.")
try:
_g_parse_liteos_ctrl.make_isr_info()
except:
print("[EXCEPTION]make_isr_info fail.")
def print_liteos_info():
try:
_g_parse_liteos_ctrl.print_isr_info()
except:
print("[EXCEPTION]print_isr_info fail.")
try:
_g_parse_liteos_ctrl.print_per_cpu_info()
except:
print("[EXCEPTION]print_per_cpu_info fail.")
if _g_parse_liteos_ctrl.version != 208:
try:
_g_parse_liteos_ctrl.print_queue_info()
except:
print("[EXCEPTION]print_queue_info fail.")
try:
_g_parse_liteos_ctrl.print_timer_info()
except:
print("[EXCEPTION]print_timer_info fail.")
try:
_g_parse_liteos_ctrl.print_heap_info()
except:
print("[EXCEPTION]print_heap_info fail.")
try:
_g_parse_liteos_ctrl.print_sem_info()
except:
print("[EXCEPTION]print_sem_info fail.")
try:
_g_parse_liteos_ctrl.print_task_short_info()
except:
print("[EXCEPTION]print_task_short_info fail.")
try:
_g_parse_liteos_ctrl.print_task_detail_info()
except:
print("[EXCEPTION]print_task_detail_info fail.")
try:
_g_parse_liteos_ctrl.print_crash_info()
except:
print("[EXCEPTION]print_crash_info fail.")
def parse_liteos206_info(log_fp):
_g_parse_liteos_ctrl.info_fd = log_fp
_g_parse_liteos_ctrl.version = 206
make_liteos_info()
print_liteos_info()
def parse_liteos207_info(log_fp):
_g_parse_liteos_ctrl.info_fd = log_fp
_g_parse_liteos_ctrl.version = 207
make_liteos_info()
print_liteos_info()
def parse_liteos208_info(log_fp):
_g_parse_liteos_ctrl.info_fd = log_fp
_g_parse_liteos_ctrl.version = 208
make_liteos_info()
print_liteos_info()
'''
context.mstatus(mcause)=0x80207800
context.mepc=0x12530
context.tp=0xcacacaca
context.sp=0xcacacaca
context.s11=0x4040404--未压栈(中断场景)
context.s10=0x5050505--未压栈
context.s9=0x6060606--未压栈
context.s8=0x7070707--未压栈
context.s7=0x8080808--未压栈
context.s6=0x9090909--未压栈
context.s5=0x80206088--未压栈
context.s4=0x20008000--未压栈
context.s3=0x80206080--未压栈
context.s2=0x200079dc--未压栈
context.s1=0x0--未压栈
context.s0=0x20007a74--未压栈
context.t6=0x4040404
context.t5=0x5050505
context.t4=0x6060606
context.t3=0x7070707
context.a7=0x8080808
context.a6=0x9090909
context.a5=0xa0a0a0a
context.a4=0xb0b0b0b
context.a3=0xc0c0c0c
context.a2=0xd0d0d0d
context.a1=0xe0e0e0e
context.a0=0xf0f0f0f
context.t2=0x10101010
context.t1=0x11111111
context.t0=0x12121212
context.ra=0x13131313
context.fs11=0x20202020--(进中断)未压栈
context.fs10=0x21212121--未压栈
context.fs9=0x22222222--未压栈
context.fs8=0x23232323--未压栈
context.fs7=0x24242424--未压栈
context.fs6=0x25252525--未压栈
context.fs5=0x26262626--未压栈
context.fs4=0x27272727--未压栈
context.fs3=0x28282828--未压栈
context.fs2=0x29292929--未压栈
context.fs1=0x2a2a2a2a--未压栈
context.fs0=0x2b2b2b2b--未压栈
context.ft11=0x20202020
context.ft10=0x21212121
context.ft9=0x22222222
context.ft8=0x23232323
context.fa7=0x24242424
context.fa6=0x25252525
context.fa5=0x26262626
context.fa4=0x27272727
context.fa3=0x28282828
context.fa2=0x80206088
context.fa1=0x20008000
context.fa0=0x80206080
context.ft7=0x20009000
context.ft6=0x20007ad4
context.ft5=0x20007ad4
context.ft4=0x11f5a
context.ft3=0x32
context.ft2=0x20007ad4
context.ft1=0x20007a70
context.ft0=0x117a2
context.fcsr=0x0
context.reserved[0]=0x0
context.reserved[1]=0x20007a74
context.reserved[2]=0x12530
typedef struct {
uint32_t ccause;
uint32_t mcause;
uint32_t mtval;
uint32_t gp;
TaskContext taskContext;
} ExcContext;
typedef struct {
uint16_t phase; /**< Exception occurrence phase: 0 indicates that the exception occurs during
* initialization, 1 indicates that the exception occurs during task, 2
* indicates that the exception occurs during interrupt, and 3 indicates that
* the exception occurs during exception.
*/
uint16_t type; /**< Type of exception, refer to no. 1-19 listed above for exceptions */
uint32_t faultAddr; /**< A precise address access error indicates the error access address where
* the exception occurred.
*/
uint32_t thrdPid; /**< An exception occurs in the interrupt, indicating the interrupt number. An
* exception occurs in the task, indicating the task id, or 0xffffffff if it
* occurs during initialization
*/
uint16_t nestCnt; /**< The number of nested exceptions, currently only support the first time the
* exception into the implementation of the registered hook function
*/
uint16_t reserved; /**< Reserved */
ExcContext *context; /**< The hardware context at which an exception to an automatic stack floating point
* register occurs
*/
} ExcInfo;
'''

View File

@ -0,0 +1,52 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from parse_elf import *
from parse_freertos import *
from parse_module_diag import *
from auto_class import *
from parse_basic import *
from parse_print_global_var import *
import json
import argparse
if __name__ == '__main__':
print("Running python at", sys.executable,
" version:%d.%d.%d " % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))
argp = argparse.ArgumentParser(description='Parse entry step2:')
argp.add_argument('--nm_file', type=str, help='nm file path.')
argp.add_argument('--bin_list', type=str, help='-bin_list:"name1|addr1|size1|name2|addr2|size2".')
argp.add_argument('--result', type=str, help='memory result file')
argp.add_argument('--global_file', type=str, help='global file path')
args = argp.parse_args()
print("args:")
print(args)
bin_list = args.bin_list.split("|")
key_list = ["name", "addr", "size"]
bin_dict = {}
temp_list = []
for i in range(len(bin_list)):
bin_dict[key_list[i%3]] = bin_list[i]
if (i%3 == 2):
temp_list.append(bin_dict)
bin_dict = {}
parse_elf_step_2(args.nm_file)
for item in temp_list:
addr = int(item["addr"])
size = int(item["size"])
parse_memory_register(item["name"], addr, size)
with open(args.result,'w+') as log_fp:
parse_freertos_info(log_fp)
try:
parse_print_global_var(args.global_file, log_fp)
except:
print("[EXCEPTION]parse_print_global_var fail.")

View File

@ -0,0 +1,52 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from parse_elf import *
from parse_liteos import *
from parse_module_diag import *
from auto_class import *
from parse_basic import *
from parse_print_global_var import *
import json
import argparse
if __name__ == '__main__':
print("Running python at", sys.executable,
" version:%d.%d.%d " % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))
argp = argparse.ArgumentParser(description='Parse entry step2:')
argp.add_argument('--nm_file', type=str, help='nm file path.')
argp.add_argument('--bin_list', type=str, help='-bin_list:"name1|addr1|size1|name2|addr2|size2".')
argp.add_argument('--result', type=str, help='memory result file')
argp.add_argument('--global_file', type=str, help='global file path')
args = argp.parse_args()
print("args:")
print(args)
bin_list = args.bin_list.split("|")
key_list = ["name", "addr", "size"]
bin_dict = {}
temp_list = []
for i in range(len(bin_list)):
bin_dict[key_list[i%3]] = bin_list[i]
if (i%3 == 2):
temp_list.append(bin_dict)
bin_dict = {}
parse_elf_step_2(args.nm_file)
for item in temp_list:
addr = int(item["addr"])
size = int(item["size"])
parse_memory_register(item["name"], addr, size)
with open(args.result,'w+') as log_fp:
parse_liteos206_info(log_fp)
try:
parse_print_global_var(args.global_file, log_fp)
except:
print("[EXCEPTION]parse_print_global_var fail.")

View File

@ -0,0 +1,52 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from parse_elf import *
from parse_liteos import *
from parse_module_diag import *
from auto_class import *
from parse_basic import *
from parse_print_global_var import *
import json
import argparse
if __name__ == '__main__':
print("Running python at", sys.executable,
" version:%d.%d.%d " % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))
argp = argparse.ArgumentParser(description='Parse entry step2:')
argp.add_argument('--nm_file', type=str, help='nm file path.')
argp.add_argument('--bin_list', type=str, help='-bin_list:"name1|addr1|size1|name2|addr2|size2".')
argp.add_argument('--result', type=str, help='memory result file')
argp.add_argument('--global_file', type=str, help='global file path')
args = argp.parse_args()
print("args:")
print(args)
bin_list = args.bin_list.split("|")
key_list = ["name", "addr", "size"]
bin_dict = {}
temp_list = []
for i in range(len(bin_list)):
bin_dict[key_list[i%3]] = bin_list[i]
if (i%3 == 2):
temp_list.append(bin_dict)
bin_dict = {}
parse_elf_step_2(args.nm_file)
for item in temp_list:
addr = int(item["addr"])
size = int(item["size"])
parse_memory_register(item["name"], addr, size)
with open(args.result,'w+') as log_fp:
parse_liteos207_info(log_fp)
try:
parse_print_global_var(args.global_file, log_fp)
except:
print("[EXCEPTION]parse_print_global_var fail.")

View File

@ -0,0 +1,54 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
import sys,string,re,os
sys.path.append('.')
from ctypes import *
from parse_elf import *
from parse_liteos import *
from parse_module_diag import *
from auto_class import *
from parse_basic import *
from parse_print_global_var import *
import json
import argparse
if __name__ == '__main__':
print("Running python at", sys.executable,
" version:%d.%d.%d " % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))
argp = argparse.ArgumentParser(description='Parse entry step2:')
argp.add_argument('--nm_file', type=str, help='nm file path.')
argp.add_argument('--bin_list', type=str, help='-bin_list:"name1|addr1|size1|name2|addr2|size2".')
argp.add_argument('--result', type=str, help='memory result file')
argp.add_argument('--global_file', type=str, help='global file path')
args = argp.parse_args()
print("args:")
print(args)
bin_list = args.bin_list.split("|")
key_list = ["name", "addr", "size"]
bin_dict = {}
temp_list = []
for i in range(len(bin_list)):
bin_dict[key_list[i%3]] = bin_list[i]
if (i%3 == 2):
temp_list.append(bin_dict)
bin_dict = {}
parse_elf_step_2(args.nm_file)
for item in temp_list:
addr = int(item["addr"])
size = int(item["size"])
parse_memory_register(item["name"], addr, size)
with open(args.result,'w+') as log_fp:
parse_liteos208_info(log_fp)
try:
parse_print_global_var(args.global_file, log_fp)
except:
print("[EXCEPTION]parse_print_global_var fail.")

View File

@ -0,0 +1,29 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
sys.path.append(os.path.split(os.path.realpath(__file__))[0])
from ctypes import *
from parse_elf import *
import json
if __name__ == '__main__':
print("Running parse step1 at", sys.executable,
" version:%d.%d.%d " % (sys.version_info[0], sys.version_info[1], sys.version_info[2]))
out_dir = sys.argv[1]
debug_file = sys.argv[2]
nm_file = sys.argv[3]
xml_file = sys.argv[4]
if not os.path.isdir(out_dir):
os.makedirs(out_dir)
parse_elf_step_1(debug_file,
os.path.join(out_dir, 'auto_class.py'),
os.path.join(out_dir, 'auto_struct.txt'),
nm_file,
os.path.join(out_dir, 'global.txt'),
out_dir,
xml_file
)
print("Build parse tool success.")

View File

@ -0,0 +1,25 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
from auto_class import *
from config import *
class _PhaseCtrl:
def __init__(self):
self.dfx_stat=None
def make_diag_info(self):
addr = parse_get_symbol_addr('g_zdiag_dfx_stat')
obj=parse_memory_2_class(addr,zdiag_dfx_stat,sizeof(zdiag_dfx_stat))
self.dfx_stat=obj
def print_diag_info(self):
uapi_print_ctypes_obj('diag_dfx_stat',self.dfx_stat)
_g_parse_ctrl=_PhaseCtrl()
def parase_diag_info():
_g_parse_ctrl.make_diag_info()
_g_parse_ctrl.print_diag_info()

View File

@ -0,0 +1,69 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
import auto_class as auto_class
from parse_basic import *
import json
def _process_g_var(list,result_fp):
name=list[0].strip()
addr=int(list[1],16)
size=list[2]
type_name=list[3].strip()
if hasattr(auto_class, type_name):
class_obj=getattr(auto_class, type_name)
if class_obj==None:
return
#if sizeof(class_obj)!=size:
# return
obj = parse_memory_2_class(addr,class_obj,sizeof(class_obj))
if(obj):
uapi_print_ctypes_obj(name,obj,fd=result_fp)
print('',file=result_fp)
def _process_g_array_item(name,addr,class_obj,result_fp):
pass
def _process_g_array(list,result_fp):
name=list[0].strip()
addr=int(list[1],16)
size=list[2]
type_name=list[3].strip()
str=list[4].strip()
array_list=json.loads(str)
if hasattr(auto_class, type_name):
class_obj=getattr(auto_class, type_name)
if class_obj==None:
return
for n in array_list[::-1]:
class_obj=class_obj*n
if sizeof(class_obj)!=size:
return
obj = parse_memory_2_class(addr,class_obj,sizeof(class_obj))
if(obj):
uapi_print_ctypes_obj(name,obj,fd=result_fp)
print('',file=result_fp)
def _process_lines(lines,result_fp):
print("----------------------content of 全局变量:----------------------",file=result_fp)
for line in lines:
line=line.strip()
list=line.split('|')
if len(list)==4:
_process_g_var(list,result_fp)
elif len(list)==5:
_process_g_array(list,result_fp)
def parse_print_global_var(var_file,result_fp):
with open(var_file,'r') as fp:
lines=fp.readlines()
_process_lines(lines,result_fp)
print("parse_print_global_var end!")

View File

@ -0,0 +1,57 @@
#!/usr/bin/env python
# coding:utf-8
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2023. All rights reserved.
import sys,string,re,os
from ctypes import *
import json
from xml.etree import ElementTree as ET
def _xml_parse_tree(file):
tree = ET.parse(file)
root = tree.getroot()
return (tree,root)
def _xml_find_son_by_tag(parent,tag_name):
match_list=[]
for child in parent:
if(child.tag==tag_name):
match_list.append(child)
return match_list
def _xml_find_child_by_tag(match_list,parent,tag_name):
for child in parent:
if(child.tag==tag_name):
match_list.append(child)
_xml_find_child_by_tag(match_list,child,tag_name)
def _parse_create_struct_file(struct_list,debug_info_file,out_file):
#print(struct_list)
#print(out_file)
with open(out_file,'w+') as fp:
print(struct_list,file=fp)
def parse_tools_xml(xml_file,debug_info_file,out_idr):
(tree,root)=_xml_parse_tree(xml_file)
list=_xml_find_son_by_tag(root,'GROUP')
item_list=[]
for item in list:
if 'AUTO_STRUCT' in item.attrib and item.attrib['AUTO_STRUCT']=="YES":
item_list.append(item)
result_list = []
for item in item_list:
req_list=[]
ind_list=[]
struct_list=[]
_xml_find_child_by_tag(req_list,item,'REQ')
_xml_find_child_by_tag(ind_list,item,'IND')
for req in req_list:
struct_list.append(req.attrib['STRUCTURE'])
for ind in ind_list:
struct_list.append(ind.attrib['STRUCTURE'])
#_parse_create_struct_file(struct_list,debug_info_file,os.path.join(out_idr,item.attrib['DATA_STRUCT_FILE']))
result_list.extend(struct_list)
return result_list