# #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