summaryrefslogtreecommitdiffhomepage
path: root/digital/ucoolib/ucoolib/utils/dtrace.py
blob: f836a363dd3379c92a215050c5a3f8c0e0f1e1a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
"""GDB plugin to dump trace from a Trace object."""

class DTrace(gdb.Command):
    def __init__(self):
        gdb.Command.__init__(self, "dtrace", gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL, True)
    
    def invoke(self, arg, from_tty):
        args = gdb.string_to_argv(arg)
        if len(args) != 1:
            print 'Usage: dtrace <object>'
            return

        trace = gdb.parse_and_eval(args[0])
        args_nb = trace['args_nb'];
        entries_nb = trace['entries_nb'];
        index = trace['index'];
        entries = trace['entries'];
        
        if entries[index]['str']:
            r = range(index, entries_nb) + range(index)
        else:
            r = range(index)
        
        for i in r:
            entry = entries[i]
            if not entry['str']:
                break
            s = entry['str'].string()
            sargs = s.count('%') - 2 * s.count('%%')
            args = tuple(entry['args'][i] for i in xrange(sargs))
            try:
                s = s % args
            except:
                pass
            print s

DTrace()