Debug: freertos gdb plugin.
This commit is contained in:
107
debug/FreeRTOS/FreeRTOS.py
Normal file
107
debug/FreeRTOS/FreeRTOS.py
Normal file
@@ -0,0 +1,107 @@
|
||||
# File: FreeRTOS.py
|
||||
# Author: Carl Allendorph
|
||||
# Date: 05NOV2014
|
||||
#
|
||||
# Description:
|
||||
# This file contains some python code that utilizes the GDB API
|
||||
# to inspect information about the FreeRTOS internal state. The
|
||||
# idea is to provide the user with the ability to inspect information
|
||||
# about the tasks, queues, mutexs, etc.
|
||||
#
|
||||
|
||||
from os import path
|
||||
import sys
|
||||
|
||||
directory, file = path.split(__file__)
|
||||
directory = path.expanduser(directory)
|
||||
directory = path.abspath(directory)
|
||||
|
||||
sys.path.append(directory)
|
||||
|
||||
import gdb
|
||||
import pprint
|
||||
|
||||
from FreeRTOSgdb.Types import StdTypes
|
||||
from FreeRTOSgdb.List import ListInspector
|
||||
from FreeRTOSgdb.GDBCommands import ShowHandleName, ShowRegistry, ShowList
|
||||
from FreeRTOSgdb.GDBCommands import ShowQueueInfo
|
||||
|
||||
|
||||
class Scheduler:
|
||||
def __init__(self):
|
||||
|
||||
self._blocked = ListInspector("xSuspendedTaskList")
|
||||
self._delayed1 = ListInspector("xDelayedTaskList1")
|
||||
self._delayed2 = ListInspector("xDelayedTaskList2")
|
||||
self._readyLists = []
|
||||
readyTasksListsStr = "pxReadyTasksLists"
|
||||
readyListsSym, methodType = gdb.lookup_symbol(readyTasksListsStr)
|
||||
if readyListsSym != None:
|
||||
readyLists = readyListsSym.value()
|
||||
minIndex, maxIndex = readyLists.type.range()
|
||||
for i in range(minIndex, maxIndex + 1):
|
||||
readyList = readyLists[i]
|
||||
FRReadyList = ListInspector(readyList)
|
||||
self._readyLists.append(FRReadyList)
|
||||
else:
|
||||
print("Failed to Find Symbol: %s" % readyTasksListsStr)
|
||||
raise ValueError("Invalid Symbol!")
|
||||
|
||||
def ShowTaskList(self):
|
||||
self.PrintTableHeader()
|
||||
for i, rlist in enumerate(self._readyLists):
|
||||
if i == 0:
|
||||
items = rlist.GetElements("TCB_t", 0)
|
||||
else:
|
||||
items = rlist.GetElements("TCB_t", 1)
|
||||
if len(items) > 0:
|
||||
print("Ready List {%d}: Num Tasks: %d" % (i, len(items)))
|
||||
for tcb, val in items:
|
||||
self.PrintTaskFormatted(tcb)
|
||||
|
||||
items = self._blocked.GetElements("TCB_t")
|
||||
print("Blocked List: Num Tasks: %d" % len(items))
|
||||
for tcb, val in items:
|
||||
self.PrintTaskFormatted(tcb)
|
||||
|
||||
items = self._delayed1.GetElements("TCB_t")
|
||||
print("Delayed {1}: Num Tasks: %d" % len(items))
|
||||
for tcb, val in items:
|
||||
self.PrintTaskFormatted(tcb, val)
|
||||
|
||||
items = self._delayed2.GetElements("TCB_t")
|
||||
print("Delayed {2}: Num Tasks: %d" % len(items))
|
||||
for tcb, val in items:
|
||||
self.PrintTaskFormatted(tcb, val)
|
||||
|
||||
def PrintTableHeader(self):
|
||||
print("%16s %3s %4s" % ("Name", "PRI", "STCK"))
|
||||
|
||||
def PrintTaskFormatted(self, task, itemVal=None):
|
||||
topStack = task["pxTopOfStack"]
|
||||
stackBase = task["pxStack"]
|
||||
highWater = topStack - stackBase
|
||||
taskName = task["pcTaskName"].string()
|
||||
taskPriority = task["uxPriority"]
|
||||
if itemVal != None:
|
||||
print("%16s %3s %4s %5s" % (taskName, taskPriority, highWater, itemVal))
|
||||
else:
|
||||
print("%16s %3s %4s" % (taskName, taskPriority, highWater))
|
||||
|
||||
|
||||
class ShowTaskList(gdb.Command):
|
||||
"""Generate a print out of the current tasks and their states."""
|
||||
|
||||
def __init__(self):
|
||||
super(ShowTaskList, self).__init__("show Task-List", gdb.COMMAND_SUPPORT)
|
||||
|
||||
def invoke(self, arg, from_tty):
|
||||
sched = Scheduler()
|
||||
sched.ShowTaskList()
|
||||
|
||||
|
||||
ShowRegistry()
|
||||
ShowList()
|
||||
ShowTaskList()
|
||||
ShowHandleName()
|
||||
ShowQueueInfo()
|
Reference in New Issue
Block a user