aboutsummaryrefslogtreecommitdiff
path: root/kernel/util/debug.py
blob: 7d1ce0d44e4a67f0739289a59a2b1bc52a324d23 (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import gdb

import weenix
import weenix.info


class InfoCommand(weenix.Command):
    """usage: info <infofunc> [<data>]
    <infofunc> the info function to be called
    <data>     the first argument to <infofunc>, if unspecified NULL is used
    Prints the string generated by one of the kernel's info functions."""

    def __init__(self):
        weenix.Command.__init__(self, "info", gdb.COMMAND_DATA, gdb.COMPLETE_SYMBOL)

    def invoke(self, arg, tty):
        args = gdb.string_to_argv(arg)
        if len(args) < 1 or len(args) > 2:
            gdb.write("{0}\n".format(self.__doc__))
            raise gdb.GdbError("invalid arguments")
        gdb.write(weenix.info.string(args[0], args[1] if (len(args) > 1) else None))


InfoCommand()


class DbgCommand(weenix.Command):
    """usage: dbg [<modes>]
    <modes>  any number of whitespace seperated debug modes
    When no arguments are given prints a list of all active debug
    modes. If any debug modes are listed they are added to the
    current debug modes. If a listed mode is prefixed with a
    '-' it is removed instead of added."""

    def __init__(self):
        weenix.Command.__init__(self, "dbg", gdb.COMMAND_DATA)

    def _modes(self):
        i = 0
        l = list()
        while gdb.parse_and_eval("dbg_tab[{0}]".format(i))["d_name"] != 0:
            mode = gdb.parse_and_eval("dbg_tab[{0}]".format(i))
            i += 1
            l.append(mode["d_name"].string())
        return l

    def invoke(self, arg, tty):
        if len(arg.strip()) == 0:
            info = weenix.info.string("dbg_modes_info")
            if len(info) == 0:
                gdb.write("No active modes.\n")
            else:
                gdb.write("{0}\n".format(weenix.info.string("dbg_modes_info")))
        else:
            modes = self._modes()
            for mode in arg.split():
                name = mode[1:] if (mode.startswith("-")) else mode
                if not name in modes:
                    gdb.write(
                        'warning: skipping non-existant mode "{0}"\n'.format(name)
                    )
                else:
                    weenix.eval_func("dbg_add_mode", '"{0}"'.format(mode))

    def complete(self, line, word):
        l = self._modes()
        l = filter(lambda x: x.startswith(word), l)
        for used in line.split():
            if used.startswith("-"):
                used = used[1:]
            l = filter(lambda x: x != used, l)
        l.sort()

        return l


DbgCommand()