479 lines
12 KiB
Batchfile
Executable File
479 lines
12 KiB
Batchfile
Executable File
#
|
|
#Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
#This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
#be copied by any method or incorporated into another program without
|
|
#the express written consent of Aerospace C.Power. This Information or any portion
|
|
#thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
#is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
#liability for its use in any way and conveys no license or title under
|
|
#any patent or copyright and makes no representation or warranty that this
|
|
#Information is free from patent or copyright infringement.
|
|
#
|
|
#
|
|
|
|
#
|
|
# Preface: GDB Script To Parser GDB Core or CoreDump
|
|
# Display Tasks and Their Stacks
|
|
# By Zhihua v1.0.0
|
|
#
|
|
|
|
# History:
|
|
# 2017-06-07 Init version. Add dump OS global statistics variable and task TCB/Stacks
|
|
# 2017-06-08 Dump Heap Usage
|
|
#
|
|
|
|
# turn on logging
|
|
set logging off
|
|
shell rm -f ./rtosdump.txt
|
|
set logging file rtosdump.txt
|
|
set logging on
|
|
|
|
|
|
# 1: dump full 512 DWORD stack space. (note: TIME SRV is 1024 DWORDs)
|
|
# 0: only dump stack from current top to base.
|
|
set $stack_dumpfull = 0
|
|
|
|
|
|
# TCB_t->pxStack
|
|
set $stack_end=0
|
|
|
|
# TCB_t->pxStack+512
|
|
set $stack_top=0
|
|
|
|
# TCB-_t>pxTopOfStack
|
|
set $stack_cur=0
|
|
|
|
# Default HT task size. currently, HT.out use same stack size
|
|
set $stack_size=512
|
|
|
|
# S0 register, used into reverse call stack
|
|
set $stack_s0=0
|
|
|
|
# unused stack size
|
|
set $stack_unused=0
|
|
|
|
# flag to indicate current analysis TCB is TMR SRV
|
|
set $istimersrv=0
|
|
|
|
#
|
|
#
|
|
# Format Marker
|
|
#
|
|
#
|
|
|
|
define Make_FMTMarker
|
|
echo \n
|
|
echo ---------------------------------------------------------------------------------------------\n
|
|
echo \n
|
|
end
|
|
|
|
define Dump_HeapInfo
|
|
echo start to dump heap usage\n
|
|
echo heap start at:\n
|
|
p (int)&ucHeap
|
|
echo heap stop at:\n
|
|
p (int)xStart.pxNextFreeBlock
|
|
echo heap size(K):\n
|
|
p/d sizeof(ucHeap)/1024
|
|
|
|
|
|
echo \n
|
|
set $FreeList_Cur = xStart
|
|
while ($FreeList_Cur.pxNextFreeBlock != 0)
|
|
p $FreeList_Cur
|
|
set $FreeList_Cur = *$FreeList_Cur.pxNextFreeBlock
|
|
end
|
|
|
|
echo \n
|
|
|
|
echo Full Stack Usage:\n
|
|
echo total_mem:(K)\n
|
|
p/d total_mem/1024
|
|
echo cvg_total_mem:(K)\n
|
|
p/d cvg_total_mem/1024
|
|
echo mac_total_mem: (K)\n
|
|
p/d mac_total_mem/1024
|
|
echo misc_total_mem: (K)\n
|
|
p/d misc_total_mem/1024
|
|
|
|
|
|
echo RTOS core Usage:(K)\n
|
|
p/d (sizeof(ucHeap) - xFreeBytesRemaining - total_mem)/1024
|
|
|
|
echo heap free (K):\n
|
|
p/d xFreeBytesRemaining/1024
|
|
echo heap lowest free(K):\n
|
|
p/d xMinimumEverFreeBytesRemaining/1024
|
|
|
|
echo \n
|
|
echo Detail Moudle useage\n
|
|
set $mem_idx = 0
|
|
while ($mem_idx != 0xFF)
|
|
if mid_mem[$mem_idx] > 0
|
|
printf "mid_mem[%d]=0x%x\n",$mem_idx, mid_mem[$mem_idx]
|
|
end
|
|
set $mem_idx = $mem_idx+1
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
#
|
|
#
|
|
# Local Function to trave stacks from up to down
|
|
#
|
|
#
|
|
define travel_stack
|
|
set $is_pxCurTCB = 0
|
|
set $ptr_nextstack=0
|
|
set $ptr_ra=0
|
|
|
|
|
|
|
|
#judge wheter current running TCB
|
|
if $stack_s0 > 0
|
|
set $is_pxCurTCB = 1
|
|
end
|
|
|
|
echo \n
|
|
|
|
|
|
if $is_pxCurTCB > 0
|
|
x $pc
|
|
x $ra
|
|
set $ptr_nextstack= $s0
|
|
|
|
while( $ptr_nextstack < $stack_top )
|
|
set $ptr_ra = *($ptr_nextstack-4)
|
|
set $ptr_nextstack = *($ptr_nextstack-8)
|
|
if $ptr_ra == $ptr_nextstack
|
|
echo -----------------Interrupt context swith\n
|
|
else
|
|
x $ptr_ra
|
|
end
|
|
|
|
if $ptr_nextstack == 0xa5a5a5a5
|
|
set $ptr_nextstack = $stack_top
|
|
end
|
|
end
|
|
else
|
|
set $task_pc = *($stack_cur+124)
|
|
x $task_pc
|
|
|
|
set $task_ra = *$stack_cur
|
|
x $task_ra
|
|
|
|
set $ptr_nextstack= *($stack_cur+28)
|
|
while( $ptr_nextstack < $stack_top )
|
|
set $ptr_ra = *($ptr_nextstack-4)
|
|
set $ptr_nextstack = *($ptr_nextstack-8)
|
|
|
|
if $ptr_ra == $ptr_nextstack
|
|
#echo -----------------Interrupt context swith\n
|
|
else
|
|
x $ptr_ra
|
|
end
|
|
|
|
if $ptr_nextstack == 0xa5a5a5a5
|
|
set $ptr_nextstack = $stack_top
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
|
|
#
|
|
#
|
|
# Dump Stack
|
|
#
|
|
#
|
|
|
|
define dump_stack
|
|
|
|
|
|
set $stact_printcur = 0
|
|
|
|
if (unsigned int)$stack_cur > (unsigned int)$stack_top
|
|
set $istimersrv = 1
|
|
set $stack_top = $stack_top + 512
|
|
#echo TMR SRV\n
|
|
end
|
|
|
|
echo stack_end:\n
|
|
p (unsigned int)$stack_end
|
|
echo stack_cur:\n
|
|
p (unsigned int)$stack_cur
|
|
echo stack_top:\n
|
|
p (unsigned int)$stack_top
|
|
echo stack_s0:\n
|
|
p $stack_s0
|
|
echo \n
|
|
|
|
echo stack_unused:\n
|
|
p $stack_unused = (int)$stack_cur - (int)$stack_end
|
|
echo stack_used:\n
|
|
p $stack_used = (int )$stack_top - (int)$stack_cur
|
|
|
|
if $stack_dumpfull > 0
|
|
if $istimersrv > 0
|
|
x/1024xw (unsigned int)$stack_end
|
|
else
|
|
x/512xw (unsigned int)$stack_end
|
|
end
|
|
else
|
|
set $stact_printcur = $stack_cur
|
|
while($stack_used > 0)
|
|
x/4xw (unsigned int)$stact_printcur
|
|
set $stact_printcur = $stact_printcur + 16
|
|
set $stack_used = $stack_used -16
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
Make_FMTMarker
|
|
Dump_HeapInfo
|
|
Make_FMTMarker
|
|
|
|
|
|
|
|
#
|
|
#
|
|
# Dump Global Task Variable
|
|
#
|
|
#
|
|
Make_FMTMarker
|
|
echo p uxCurrentNumberOfTasks\n
|
|
p uxCurrentNumberOfTasks
|
|
echo p uxTaskNumber\n
|
|
p uxTaskNumber
|
|
echo p xTickCount\n
|
|
p xTickCount
|
|
echo p uxPendedTicks\n
|
|
p uxPendedTicks
|
|
echo p xSchedulerRunning\n
|
|
p xSchedulerRunning
|
|
echo p xNextTaskUnblockTime\n
|
|
p xNextTaskUnblockTime
|
|
echo p uxSchedulerSuspended\n
|
|
p uxSchedulerSuspended
|
|
|
|
|
|
|
|
#
|
|
#
|
|
# Analysis pxCurrentTCB
|
|
#
|
|
#
|
|
|
|
Make_FMTMarker
|
|
#p *pxCurrentTCB
|
|
p (*pxCurrentTCB)->pcTaskName
|
|
p (*pxCurrentTCB)->pxStack
|
|
p (*pxCurrentTCB)->pxTopOfStack
|
|
set $stack_end= (*pxCurrentTCB)->pxStack
|
|
set $stack_cur = $sp
|
|
set $stack_top = $stack_end + $stack_size
|
|
set $stack_s0 = $s0
|
|
#dump_stack
|
|
travel_stack
|
|
Make_FMTMarker
|
|
|
|
#
|
|
#
|
|
# Analysis xSuspendedTaskList
|
|
#
|
|
#
|
|
if xSuspendedTaskList.uxNumberOfItems >0
|
|
echo xSuspendedTaskList.uxNumberOfItems\n
|
|
p xSuspendedTaskList.uxNumberOfItems
|
|
|
|
set $list_end = xSuspendedTaskList->pxIndex
|
|
set $list_start = xSuspendedTaskList->xListEnd.pxNext
|
|
|
|
|
|
while ($list_start != $list_end)
|
|
Make_FMTMarker
|
|
#p $list_start
|
|
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
|
|
set $list_start = $list_start.pxNext
|
|
Make_FMTMarker
|
|
end
|
|
end
|
|
|
|
#
|
|
#
|
|
# Analysis pxReadyTasksLists
|
|
#
|
|
#
|
|
|
|
set $readyTaskList_index = 0
|
|
set $readyTaskList_Max = 7
|
|
while ($readyTaskList_index < $readyTaskList_Max)
|
|
if pxReadyTasksLists[$readyTaskList_index].uxNumberOfItems >0
|
|
echo ready task array index:\n
|
|
p $readyTaskList_index
|
|
echo num\n
|
|
p pxReadyTasksLists[$readyTaskList_index].uxNumberOfItems
|
|
|
|
set $list_end = pxReadyTasksLists[$readyTaskList_index]->pxIndex
|
|
set $list_start = pxReadyTasksLists[$readyTaskList_index]->xListEnd.pxNext
|
|
|
|
while ($list_start != $list_end)
|
|
Make_FMTMarker
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
set $list_start = $list_start.pxNext
|
|
Make_FMTMarker
|
|
end
|
|
|
|
end
|
|
set $readyTaskList_index = $readyTaskList_index+1
|
|
end
|
|
|
|
|
|
if xDelayedTaskList1.uxNumberOfItems >0
|
|
Make_FMTMarker
|
|
echo xDelayedTaskList1.uxNumberOfItems\n
|
|
p xDelayedTaskList1.uxNumberOfItems
|
|
|
|
set $list_end = xDelayedTaskList1->pxIndex
|
|
set $list_start = xDelayedTaskList1->xListEnd.pxNext
|
|
|
|
|
|
while ($list_start != $list_end)
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
set $list_start = $list_start.pxNext
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if xDelayedTaskList2.uxNumberOfItems >0
|
|
Make_FMTMarker
|
|
|
|
echo xDelayedTaskList2.uxNumberOfItems\n
|
|
p xDelayedTaskList2.uxNumberOfItems
|
|
set $list_end = xDelayedTaskList2->pxIndex
|
|
set $list_start = xDelayedTaskList2->xListEnd.pxNext
|
|
|
|
|
|
while ($list_start != $list_end)
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
set $list_start = $list_start.pxNext
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if xPendingReadyList.uxNumberOfItems >0
|
|
Make_FMTMarker
|
|
echo xPendingReadyList.uxNumberOfItems\n
|
|
p xPendingReadyList.uxNumberOfItems
|
|
set $list_end = xPendingReadyList->pxIndex
|
|
set $list_start = xPendingReadyList->xListEnd.pxNext
|
|
|
|
|
|
while ($list_start != $list_end)
|
|
p $list_start
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
set $list_start = $list_start.pxNext
|
|
end
|
|
|
|
end
|
|
|
|
if xTasksWaitingTermination.uxNumberOfItems >0
|
|
Make_FMTMarker
|
|
echo xTasksWaitingTermination.uxNumberOfItems\n
|
|
p xTasksWaitingTermination.uxNumberOfItems
|
|
set $list_end = xTasksWaitingTermination->pxIndex
|
|
set $list_start = xTasksWaitingTermination->xListEnd.pxNext
|
|
|
|
|
|
while ($list_start != $list_end)
|
|
set $tcb = (char*)$list_start - 4
|
|
#p (TCB_t)*$tcb
|
|
p ((TCB_t)*$tcb)->pcTaskName
|
|
p ((TCB_t)*$tcb)->pxStack
|
|
p ((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_end= ((TCB_t)*$tcb)->pxStack
|
|
set $stack_cur = (unsigned int)((TCB_t)*$tcb)->pxTopOfStack
|
|
set $stack_top = $stack_end+$stack_size
|
|
set $stack_s0 = 0
|
|
#dump_stack
|
|
travel_stack
|
|
set $list_start = $list_start.pxNext
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
# Turn off log
|
|
#
|
|
set logging off |