初始提交
This commit is contained in:
12
build/script/parse_tool/config.py
Executable file
12
build/script/parse_tool/config.py
Executable 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
|
303
build/script/parse_tool/parse_basic.py
Executable file
303
build/script/parse_tool/parse_basic.py
Executable 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()
|
1133
build/script/parse_tool/parse_elf.py
Executable file
1133
build/script/parse_tool/parse_elf.py
Executable file
File diff suppressed because it is too large
Load Diff
463
build/script/parse_tool/parse_freertos.py
Executable file
463
build/script/parse_tool/parse_freertos.py
Executable 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定时器id;pxCallbackFunction回调函数的地址;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!")
|
761
build/script/parse_tool/parse_liteos.py
Executable file
761
build/script/parse_tool/parse_liteos.py
Executable 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;
|
||||
'''
|
52
build/script/parse_tool/parse_main_freertos_phase2.py
Executable file
52
build/script/parse_tool/parse_main_freertos_phase2.py
Executable 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.")
|
||||
|
||||
|
||||
|
||||
|
52
build/script/parse_tool/parse_main_liteos206_phase2.py
Executable file
52
build/script/parse_tool/parse_main_liteos206_phase2.py
Executable 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.")
|
||||
|
||||
|
||||
|
||||
|
52
build/script/parse_tool/parse_main_liteos207_phase2.py
Executable file
52
build/script/parse_tool/parse_main_liteos207_phase2.py
Executable 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.")
|
||||
|
||||
|
||||
|
||||
|
54
build/script/parse_tool/parse_main_liteos208_phase2.py
Executable file
54
build/script/parse_tool/parse_main_liteos208_phase2.py
Executable 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.")
|
||||
|
||||
|
||||
|
||||
|
29
build/script/parse_tool/parse_main_phase1.py
Executable file
29
build/script/parse_tool/parse_main_phase1.py
Executable 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.")
|
25
build/script/parse_tool/parse_module_diag.py
Executable file
25
build/script/parse_tool/parse_module_diag.py
Executable 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()
|
69
build/script/parse_tool/parse_print_global_var.py
Executable file
69
build/script/parse_tool/parse_print_global_var.py
Executable 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!")
|
||||
|
||||
|
57
build/script/parse_tool/xml_main.py
Executable file
57
build/script/parse_tool/xml_main.py
Executable 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
|
Reference in New Issue
Block a user