140 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# File: GDBCommands.py
 | 
						|
# Author: Carl Allendorph
 | 
						|
# Date: 05NOV2014
 | 
						|
#
 | 
						|
# Description:
 | 
						|
#   This file contains the implementation of some custom
 | 
						|
# GDB commands for Inspecting the FreeRTOS state
 | 
						|
 | 
						|
 | 
						|
import gdb
 | 
						|
from .List import ListInspector
 | 
						|
from .Task import TaskInspector
 | 
						|
from .HandleRegistry import HandleRegistry
 | 
						|
from .QueueTools import *
 | 
						|
 | 
						|
 | 
						|
class ShowQueueInfo(gdb.Command):
 | 
						|
    """Generate a print out of info about a particular
 | 
						|
    set of queues.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        super(ShowQueueInfo, self).__init__("show Queue-Info", gdb.COMMAND_SUPPORT)
 | 
						|
 | 
						|
    def invoke(self, arg, from_tty):
 | 
						|
        argv = gdb.string_to_argv(arg)
 | 
						|
 | 
						|
        qTypes = []
 | 
						|
        if len(argv) > 0:
 | 
						|
            for a in argv:
 | 
						|
                try:
 | 
						|
                    qType = QueueMode.Map[a]
 | 
						|
                    qTypes.append(qType)
 | 
						|
                except KeyError:
 | 
						|
                    print("Arg %s does not map to a Queue Type!" % a)
 | 
						|
 | 
						|
        reg = HandleRegistry()
 | 
						|
        qToShow = []
 | 
						|
        if len(qTypes) > 0:
 | 
						|
            # We will only print info about queues
 | 
						|
            for qType in qTypes:
 | 
						|
                qObjs = reg.FilterBy(qType)
 | 
						|
                qToShow.extend(qObjs)
 | 
						|
        else:
 | 
						|
            qToShow = reg.FilterBy(None)
 | 
						|
 | 
						|
        print("Num Queues: %d" % len(qToShow))
 | 
						|
        print("%20s %4s %16s %16s" % ("NAME", "CNT", "SEND", "RECEIVE"))
 | 
						|
        for q in qToShow:
 | 
						|
            self.PrintQueueInfo(q)
 | 
						|
 | 
						|
    def PrintQueueInfo(self, q):
 | 
						|
        """Print Info about the Queue"""
 | 
						|
        sendList = q.GetTasksWaitingToSend()
 | 
						|
        rxList = q.GetTasksWaitingToReceive()
 | 
						|
 | 
						|
        # print("TxLen: %d, RxLen: %d" % (len(sendList), len(rxList)))
 | 
						|
 | 
						|
        maxCount = max(len(sendList), len(rxList))
 | 
						|
        outputFmt = "%20s %4s %16s %16s"
 | 
						|
        if maxCount == 0:
 | 
						|
            print(outputFmt % (q.GetName(), q.GetQueueMessagesWaiting(), "", ""))
 | 
						|
        else:
 | 
						|
 | 
						|
            for i in range(0, maxCount):
 | 
						|
                txName = ""
 | 
						|
                if i < len(sendList):
 | 
						|
                    tcbRef, val = sendList[i]
 | 
						|
                    tcb = TaskInspector(tcbRef)
 | 
						|
                    txName = tcb.GetName()
 | 
						|
                rxName = ""
 | 
						|
                if i < len(rxList):
 | 
						|
                    tcbRef, val = rxList[i]
 | 
						|
                    tcb = TaskInspector(tcbRef)
 | 
						|
                    rxName = tcb.GetName()
 | 
						|
 | 
						|
                if i == 0:
 | 
						|
                    print(
 | 
						|
                        outputFmt
 | 
						|
                        % (q.GetName(), q.GetQueueMessagesWaiting(), txName, rxName)
 | 
						|
                    )
 | 
						|
                else:
 | 
						|
                    print(outputFmt % ("", "", txName, rxName))
 | 
						|
 | 
						|
 | 
						|
class ShowHandleName(gdb.Command):
 | 
						|
    """Generate a print out of the handle by name"""
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        super(ShowHandleName, self).__init__("show Handle-Name", gdb.COMMAND_SUPPORT)
 | 
						|
 | 
						|
    def invoke(self, arg, from_tty):
 | 
						|
        argv = gdb.string_to_argv(arg)
 | 
						|
        if len(argv) != 1:
 | 
						|
            print("Invalid Argument: Requires one handle arg")
 | 
						|
        handle = int(argv[0], 0)
 | 
						|
        reg = HandleRegistry()
 | 
						|
        name = reg.GetName(handle)
 | 
						|
        print("Handle 0x%08x: %s" % (handle, name))
 | 
						|
 | 
						|
 | 
						|
class ShowRegistry(gdb.Command):
 | 
						|
    """Generate a print out of the queue handle registry"""
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        super(ShowRegistry, self).__init__("show Handle-Registry", gdb.COMMAND_SUPPORT)
 | 
						|
 | 
						|
    def invoke(self, arg, from_tty):
 | 
						|
        reg = HandleRegistry()
 | 
						|
        reg.PrintRegistry()
 | 
						|
 | 
						|
 | 
						|
class ShowList(gdb.Command):
 | 
						|
    """Generate a print out of the elements in a list
 | 
						|
    passed to this command. User must pass a symbol that
 | 
						|
    will be looked up.
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        super(ShowList, self).__init__(
 | 
						|
            "show List-Handle", gdb.COMMAND_SUPPORT, gdb.COMPLETE_SYMBOL
 | 
						|
        )
 | 
						|
 | 
						|
    def invoke(self, arg, from_tty):
 | 
						|
        argv = gdb.string_to_argv(arg)
 | 
						|
 | 
						|
        CastTypeStr = None
 | 
						|
        if len(argv) > 0:
 | 
						|
            symbolArg = argv[0]
 | 
						|
 | 
						|
        if len(argv) > 1:
 | 
						|
            CastTypeStr = argv[1]
 | 
						|
 | 
						|
        listVal = ListInspector(symbolArg)
 | 
						|
 | 
						|
        elems = listVal.GetElements(CastTypeStr)
 | 
						|
 | 
						|
        for elem in elems:
 | 
						|
            print("Elem: %s" % str(elem))
 |