stx/gdb/commands.py
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 09 Apr 2015 15:04:14 +0100
changeset 4 ca45a88235bd
parent 2 ef575a931434
permissions -rw-r--r--
Minor fixes in GDB scripts.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
import gdb
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
import stx.support
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     3
import stx.util
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
     4
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
class CFrameDecorator ( stx.support.Decorator ):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
    """An abstract gdb.Frame decorator"""
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
    @staticmethod
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
    def decorate(frame):
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    11
    	function = frame.function()
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    12
    	if function == None:
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    13
	    return CFrameDecorator_jit(frame)
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    14
        if function.name == '__jInterpret':
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    15
            return CFrameDecorator_jInterpret(frame)
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
        else:
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    17
            c , s = stx.util.demangle(frame.name())
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    18
            if (c != None):
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    19
                if (s != None):
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    20
                    return CFrameDecorator_stcMethod(frame, c, s)
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
            return CFrameDecorator(frame)
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    22
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
    def __str__(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
        kind = self.kind()
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
        if kind != None:
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
            kind = "%2s" % kind
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
        else:
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
            kind = '  '
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    29
        return "%3s 0x%8x %s ( %s)" % (
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    30
            kind ,
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    31
            self.pc(),
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    32
            self.name() ,
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
            self.args_string() )
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
    def older(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
        older = self._obj.older()
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    37
        if older == None:
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    38
            return None
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
        # special case, because of longjmp(), parent frame-point might point
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
        # to clean area, filled by 0xa5a5a5a5 (malloc() does this)
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
        if older.pc() != 0xa5a5a5a5:
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
            return CFrameDecorator.decorate(older)
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
        else:
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
            return None
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
    def newer(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
        return CFrameDecorator.decorate(self._obj.newer())
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
    def kind(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
        """Returns 3 char identification of frame kind or None"""
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
        return None # generic frame
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
    def function_block(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
        """Returns a top-level block (i.e., block for the function)"""
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
        b = self._obj.block()
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
        while b.function == None:
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    57
            b = b.superblock
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
        return b
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    59
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
    def args_string(self):
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    61
        """Returns a string representation of arguments"""
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
        s = ''
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
        for sym in self.function_block():
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
            if sym.is_argument:
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
                s = s + self.arg_string(sym) + ' '
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
        return s
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    67
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
    def arg_string(self, sym):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
        """Given an argument symbol, returns its string representation"""
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
        val = self._obj.read_var(sym, self._obj.block())
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
        return "%s=%s" % ( sym.print_name , val )
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
class CFrameDecorator_jInterpret ( CFrameDecorator ):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
    def kind(self):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
        return "J-I"
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    77
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    78
class CFrameDecorator_jit ( CFrameDecorator ):
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    79
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    80
    def kind(self):
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    81
        return "?-J"
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    82
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    83
    def function_block(self):
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    84
    	return []
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    85
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    86
    def name(self):
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    87
    	return "???"
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    88
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    89
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    90
class CFrameDecorator_stcMethod ( CFrameDecorator ):
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    91
    def __init__(self, frame, className = None, selectorValue = None):
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    92
        CFrameDecorator.__init__(self, frame)
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    93
        c = className
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    94
        s = selectorValue
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    95
        if (c == None or s == None):
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    96
            c, s = stx.util.demangle(frame.name())
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    97
        self.klassName = c
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
    98
        self.selectorValue = s
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
    99
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   100
    def name(self):
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   101
        return "%s >> #%s" % ( self.klassName, self.selectorValue )
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   102
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   103
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   104
    def kind(self):
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   105
        return "S-C"
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   106
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   107
class Backtrace ( gdb.Command ):
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   108
    '''
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   109
    Prints a VM backtrace.
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   110
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   111
    Print additional information for well-known VM functions such
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   112
    as __interpret, __jinterpret, etc.
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   113
    '''
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   114
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   115
    def __init__ ( self ):
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   116
        super (Backtrace, self).__init__("btx", gdb.COMMAND_STACK)
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   117
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   118
    def invoke ( self , args , from_tty ):
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   119
        try:
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   120
            argv = gdb.string_to_argv(args)
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   121
            limit = None
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   122
            if len(argv) == 1:
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   123
                limit = int(argv[0])
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   124
            fno = 0
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   125
            frame = CFrameDecorator.decorate(gdb.newest_frame())
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   126
            framesel = gdb.selected_frame()
4
ca45a88235bd Minor fixes in GDB scripts.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   127
            while ( frame != None ) and ( limit == None or fno < limit ):
2
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   128
                if frame.target() == framesel:
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   129
                    star = '*'
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   130
                else:
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   131
                    star = ' '
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   132
                print "%s%3d %s" % (star, fno , frame )
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   133
                frame = frame.older()
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   134
                fno = fno +1
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   135
        except:
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   136
            import traceback
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   137
            import sys
ef575a931434 Improved command `btx` (backtrace)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 0
diff changeset
   138
            traceback.print_exc(file=sys.stdout)
0
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   139
2c329a84bd89 Initial import of GDB support
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   140
Backtrace()