Debug: freertos gdb plugin.
This commit is contained in:
103
debug/FreeRTOS/FreeRTOSgdb/List.py
Normal file
103
debug/FreeRTOS/FreeRTOSgdb/List.py
Normal file
@@ -0,0 +1,103 @@
|
||||
# File: List.py
|
||||
# Author: Carl Allendorph
|
||||
# Date: 05NOV2014
|
||||
#
|
||||
# Description:
|
||||
# This file contains the class for inspecting
|
||||
# a FreeRTOS List Object
|
||||
#
|
||||
|
||||
|
||||
import gdb
|
||||
|
||||
from .Types import StdTypes
|
||||
|
||||
|
||||
class ListInspector:
|
||||
"""FreeRTOS List Inspector Object"""
|
||||
|
||||
ListType = gdb.lookup_type("List_t")
|
||||
|
||||
def __init__(self, handle):
|
||||
""""""
|
||||
self._list = None
|
||||
# print("List: Handle: %s" % handle)
|
||||
self.Assign(handle)
|
||||
|
||||
def Assign(self, listObj):
|
||||
try:
|
||||
if listObj.type == ListInspector.ListType:
|
||||
self._list = listObj
|
||||
return
|
||||
else:
|
||||
raise TypeError("Invalid List Object Type!")
|
||||
except Exception as exc:
|
||||
# print(" Failed to assign from List object: %s" % str(exc))
|
||||
pass
|
||||
|
||||
symbol, methodObj = gdb.lookup_symbol(listObj)
|
||||
if symbol != None:
|
||||
self._list = symbol.value()
|
||||
else:
|
||||
addrInt = int(listObj, 0)
|
||||
listObjPtr = gdb.Value(addrInt).cast(ListInspector.ListType.pointer())
|
||||
self._list = listObjPtr.dereference()
|
||||
|
||||
def GetElements(self, CastTypeStr=None, startElem=1):
|
||||
"""Get the Elements of the list as an array of
|
||||
gdb.Value type objects.
|
||||
@param CastTypeStr string name of the type of object that
|
||||
we will cast the void *pvOwner elements of the list to.
|
||||
User can also pass a L{gdb.Type} object as the type
|
||||
If None, we will simply cast to uint32_t and print these
|
||||
as hex values.
|
||||
@param startElem This is a flag to indicate whether
|
||||
we will start getting elements starting at 0 or 1. Note
|
||||
that this is to deal with some non-consistent behavior
|
||||
of some of the TCB Task lists.
|
||||
"""
|
||||
if self._list != None:
|
||||
|
||||
CastType = None
|
||||
if CastTypeStr != None:
|
||||
if type(CastTypeStr) == str:
|
||||
try:
|
||||
CastType = gdb.lookup_type(CastTypeStr).pointer()
|
||||
except:
|
||||
print("Failed to find type: %s" % CastTypeStr)
|
||||
elif type(CastTypeStr) == gdb.Type:
|
||||
CastType = CastTypeStr.pointer()
|
||||
|
||||
resp = []
|
||||
numElems = self._list["uxNumberOfItems"]
|
||||
# print("List Elements: %d" % numElems)
|
||||
index = self._list["pxIndex"]
|
||||
|
||||
if numElems > 0 and numElems < 200:
|
||||
|
||||
if startElem == 0:
|
||||
curr = index
|
||||
else:
|
||||
curr = index["pxPrevious"]
|
||||
|
||||
for i in range(0, numElems):
|
||||
owner = curr["pvOwner"]
|
||||
|
||||
ownerObj = None
|
||||
if CastType != None:
|
||||
castObjPtr = owner.cast(CastType)
|
||||
castObj = castObjPtr.dereference()
|
||||
ownerObj = castObj
|
||||
else:
|
||||
ownerUInt = owner.cast(StdTypes.uint32_t)
|
||||
ownerObj = ownerUInt
|
||||
|
||||
itemVal = curr["xItemValue"]
|
||||
resp.append((ownerObj, itemVal.cast(StdTypes.uint32_t)))
|
||||
|
||||
curr = curr["pxPrevious"]
|
||||
|
||||
return resp
|
||||
|
||||
else:
|
||||
raise ValueError("Invalid List Object - Possibly Failed to Initialize!")
|
Reference in New Issue
Block a user