CVS Repository/ srcgnullvmlldbexamplespython/ cmdtemplate.py

Annotated Revision  1.1.1.5  Back
1.1.1.2
 (patrick  17-Dec-21) 
1
: #!/usr/bin/env python
1.1
 (patrick  03-Aug-20) 
2
: 
1.1
 (patrick  03-Aug-20) 
3
: # ---------------------------------------------------------------------
1.1
 (patrick  03-Aug-20) 
4
: # Be sure to add the python path that points to the LLDB shared library.
1.1
 (patrick  03-Aug-20) 
5
: #
1.1
 (patrick  03-Aug-20) 
6
: # # To use this in the embedded python interpreter using "lldb" just
1.1
 (patrick  03-Aug-20) 
7
: # import it with the full path using the "command script import"
1.1
 (patrick  03-Aug-20) 
8
: # command
1.1
 (patrick  03-Aug-20) 
9
: #   (lldb) command script import /path/to/cmdtemplate.py
1.1
 (patrick  03-Aug-20) 
10
: # ---------------------------------------------------------------------
1.1
 (patrick  03-Aug-20) 
11
: 
1.1
 (patrick  03-Aug-20) 
12
: import inspect
1.1
 (patrick  03-Aug-20) 
13
: import lldb
1.1
 (patrick  03-Aug-20) 
14
: import sys
1.1.1.4
 (robert   11-Jun-25) 
15
: from lldb.plugins.parsed_cmd import ParsedCommand
1.1
 (patrick  03-Aug-20) 
16
: 
1.1.1.4
 (robert   11-Jun-25) 
17
: class FrameStatCommand(ParsedCommand):
1.1.1.4
 (robert   11-Jun-25) 
18
:     program = "framestats"
1.1
 (patrick  03-Aug-20) 
19
: 
1.1
 (patrick  03-Aug-20) 
20
:     @classmethod
1.1
 (patrick  03-Aug-20) 
21
:     def register_lldb_command(cls, debugger, module_name):
1.1.1.4
 (robert   11-Jun-25) 
22
:         ParsedCommand.do_register_cmd(cls, debugger, module_name)
1.1.1.4
 (robert   11-Jun-25) 
23
:         print(
1.1.1.4
 (robert   11-Jun-25) 
24
:             'The "{0}" command has been installed, type "help {0}" or "{0} '
1.1.1.4
 (robert   11-Jun-25) 
25
:             '--help" for detailed help.'.format(cls.program)
1.1.1.4
 (robert   11-Jun-25) 
26
:         )
1.1.1.4
 (robert   11-Jun-25) 
27
: 
1.1.1.5
 (robert   29-May-26) 
28
:     def get_flags(self):
1.1.1.5
 (robert   29-May-26) 
29
:         return lldb.eCommandRequiresFrame | lldb.eCommandProcessMustBePaused
1.1.1.4
 (robert   11-Jun-25) 
30
: 
1.1.1.5
 (robert   29-May-26) 
31
:     def setup_command_definition(self):
1.1.1.5
 (robert   29-May-26) 
32
:         ov_parser = self.get_parser()
1.1.1.5
 (robert   29-May-26) 
33
:         ov_parser.add_option(
1.1.1.4
 (robert   11-Jun-25) 
34
:             "i",
1.1.1.4
 (robert   11-Jun-25) 
35
:             "in-scope",
1.1.1.4
 (robert   11-Jun-25) 
36
:             help = "in_scope_only = True",
1.1.1.4
 (robert   11-Jun-25) 
37
:             value_type = lldb.eArgTypeBoolean,
1.1.1.4
 (robert   11-Jun-25) 
38
:             dest = "bool_arg",
1.1.1.4
 (robert   11-Jun-25) 
39
:             default = True,
1.1.1.4
 (robert   11-Jun-25) 
40
:         )
1.1.1.4
 (robert   11-Jun-25) 
41
: 
1.1.1.5
 (robert   29-May-26) 
42
:         ov_parser.add_option(
1.1.1.4
 (robert   11-Jun-25) 
43
:             "i",
1.1.1.4
 (robert   11-Jun-25) 
44
:             "in-scope",
1.1.1.4
 (robert   11-Jun-25) 
45
:             help = "in_scope_only = True",
1.1.1.4
 (robert   11-Jun-25) 
46
:             value_type = lldb.eArgTypeBoolean,
1.1.1.4
 (robert   11-Jun-25) 
47
:             dest = "inscope",
1.1.1.4
 (robert   11-Jun-25) 
48
:             default=True,
1.1.1.4
 (robert   11-Jun-25) 
49
:         )
1.1.1.4
 (robert   11-Jun-25) 
50
:         
1.1.1.5
 (robert   29-May-26) 
51
:         ov_parser.add_option(
1.1.1.4
 (robert   11-Jun-25) 
52
:             "a",
1.1.1.4
 (robert   11-Jun-25) 
53
:             "arguments",
1.1.1.4
 (robert   11-Jun-25) 
54
:             help = "arguments = True",
1.1.1.4
 (robert   11-Jun-25) 
55
:             value_type = lldb.eArgTypeBoolean,
1.1.1.4
 (robert   11-Jun-25) 
56
:             dest = "arguments",
1.1.1.4
 (robert   11-Jun-25) 
57
:             default = True,
1.1.1.4
 (robert   11-Jun-25) 
58
:         )
1.1.1.4
 (robert   11-Jun-25) 
59
: 
1.1.1.5
 (robert   29-May-26) 
60
:         ov_parser.add_option(
1.1.1.4
 (robert   11-Jun-25) 
61
:             "l",
1.1.1.4
 (robert   11-Jun-25) 
62
:             "locals",
1.1.1.4
 (robert   11-Jun-25) 
63
:             help = "locals = True",
1.1.1.4
 (robert   11-Jun-25) 
64
:             value_type = lldb.eArgTypeBoolean,
1.1.1.4
 (robert   11-Jun-25) 
65
:             dest = "locals",
1.1.1.4
 (robert   11-Jun-25) 
66
:             default = True,
1.1.1.4
 (robert   11-Jun-25) 
67
:         )
1.1.1.4
 (robert   11-Jun-25) 
68
: 
1.1.1.5
 (robert   29-May-26) 
69
:         ov_parser.add_option(
1.1.1.4
 (robert   11-Jun-25) 
70
:             "s",
1.1.1.4
 (robert   11-Jun-25) 
71
:             "statics",
1.1.1.4
 (robert   11-Jun-25) 
72
:             help = "statics = True",
1.1.1.4
 (robert   11-Jun-25) 
73
:             value_type = lldb.eArgTypeBoolean,
1.1.1.4
 (robert   11-Jun-25) 
74
:             dest = "statics",
1.1.1.4
 (robert   11-Jun-25) 
75
:             default = True,
1.1.1.4
 (robert   11-Jun-25) 
76
:         )
1.1.1.5
 (robert   29-May-26) 
77
:         ov_parser.add_option(
1.1.1.5
 (robert   29-May-26) 
78
:             "t",
1.1.1.5
 (robert   29-May-26) 
79
:             "test-flag",
1.1.1.5
 (robert   29-May-26) 
80
:             help="test a flag value.",
1.1.1.5
 (robert   29-May-26) 
81
:         )
1.1.1.4
 (robert   11-Jun-25) 
82
: 
1.1.1.4
 (robert   11-Jun-25) 
83
:     def get_repeat_command(self, args):
1.1.1.4
 (robert   11-Jun-25) 
84
:         """As an example, make the command not auto-repeat:"""
1.1.1.4
 (robert   11-Jun-25) 
85
:         return ""
1.1
 (patrick  03-Aug-20) 
86
: 
1.1
 (patrick  03-Aug-20) 
87
:     def get_short_help(self):
1.1
 (patrick  03-Aug-20) 
88
:         return "Example command for use in debugging"
1.1
 (patrick  03-Aug-20) 
89
: 
1.1
 (patrick  03-Aug-20) 
90
:     def get_long_help(self):
1.1.1.4
 (robert   11-Jun-25) 
91
:         return ("This command is meant to be an example of how to make "
1.1.1.4
 (robert   11-Jun-25) 
92
:             "an LLDB command that does something useful, follows "
1.1.1.4
 (robert   11-Jun-25) 
93
:             "best practices, and exploits the SB API. "
1.1.1.4
 (robert   11-Jun-25) 
94
:             "Specifically, this command computes the aggregate "
1.1.1.4
 (robert   11-Jun-25) 
95
:             "and average size of the variables in the current "
1.1.1.4
 (robert   11-Jun-25) 
96
:             "frame and allows you to tweak exactly which variables "
1.1.1.4
 (robert   11-Jun-25) 
97
:             "are to be accounted in the computation.")
1.1.1.4
 (robert   11-Jun-25) 
98
: 
1.1
 (patrick  03-Aug-20) 
99
: 
1.1
 (patrick  03-Aug-20) 
100
:     def __init__(self, debugger, unused):
1.1.1.4
 (robert   11-Jun-25) 
101
:         super().__init__(debugger, unused)
1.1
 (patrick  03-Aug-20) 
102
: 
1.1
 (patrick  03-Aug-20) 
103
:     def __call__(self, debugger, command, exe_ctx, result):
1.1
 (patrick  03-Aug-20) 
104
:         # Always get program state from the lldb.SBExecutionContext passed
1.1
 (patrick  03-Aug-20) 
105
:         # in as exe_ctx
1.1
 (patrick  03-Aug-20) 
106
:         frame = exe_ctx.GetFrame()
1.1
 (patrick  03-Aug-20) 
107
:         if not frame.IsValid():
1.1
 (patrick  03-Aug-20) 
108
:             result.SetError("invalid frame")
1.1
 (patrick  03-Aug-20) 
109
:             return
1.1
 (patrick  03-Aug-20) 
110
: 
1.1.1.5
 (robert   29-May-26) 
111
:         ov_parser = self.get_parser()
1.1
 (patrick  03-Aug-20) 
112
:         variables_list = frame.GetVariables(
1.1.1.5
 (robert   29-May-26) 
113
:             ov_parser.arguments, ov_parser.locals, ov_parser.statics, ov_parser.inscope
1.1.1.4
 (robert   11-Jun-25) 
114
:         )
1.1
 (patrick  03-Aug-20) 
115
:         variables_count = variables_list.GetSize()
1.1
 (patrick  03-Aug-20) 
116
:         if variables_count == 0:
1.1
 (patrick  03-Aug-20) 
117
:             print("no variables here", file=result)
1.1
 (patrick  03-Aug-20) 
118
:             return
1.1
 (patrick  03-Aug-20) 
119
:         total_size = 0
1.1
 (patrick  03-Aug-20) 
120
:         for i in range(0, variables_count):
1.1
 (patrick  03-Aug-20) 
121
:             variable = variables_list.GetValueAtIndex(i)
1.1
 (patrick  03-Aug-20) 
122
:             variable_type = variable.GetType()
1.1
 (patrick  03-Aug-20) 
123
:             total_size = total_size + variable_type.GetByteSize()
1.1
 (patrick  03-Aug-20) 
124
:             average_size = float(total_size) / variables_count
1.1.1.4
 (robert   11-Jun-25) 
125
:             print(
1.1.1.4
 (robert   11-Jun-25) 
126
:                 "Your frame has %d variables. Their total size "
1.1.1.4
 (robert   11-Jun-25) 
127
:                 "is %d bytes. The average size is %f bytes"
1.1.1.4
 (robert   11-Jun-25) 
128
:                 % (variables_count, total_size, average_size),
1.1.1.4
 (robert   11-Jun-25) 
129
:                 file=result,
1.1.1.4
 (robert   11-Jun-25) 
130
:             )
1.1.1.5
 (robert   29-May-26) 
131
:         if ov_parser.was_set("test-flag"):
1.1.1.5
 (robert   29-May-26) 
132
:             print("Got the test flag")
1.1.1.5
 (robert   29-May-26) 
133
:         else:
1.1.1.5
 (robert   29-May-26) 
134
:             print("Got no test flag")
1.1.1.5
 (robert   29-May-26) 
135
: 
1.1
 (patrick  03-Aug-20) 
136
:         # not returning anything is akin to returning success
1.1
 (patrick  03-Aug-20) 
137
: 
1.1
 (patrick  03-Aug-20) 
138
: 
1.1
 (patrick  03-Aug-20) 
139
: def __lldb_init_module(debugger, dict):
1.1
 (patrick  03-Aug-20) 
140
:     # Register all classes that have a register_lldb_command method
1.1
 (patrick  03-Aug-20) 
141
:     for _name, cls in inspect.getmembers(sys.modules[__name__]):
1.1.1.4
 (robert   11-Jun-25) 
142
:         if inspect.isclass(cls) and callable(
1.1.1.4
 (robert   11-Jun-25) 
143
:             getattr(cls, "register_lldb_command", None)
1.1.1.4
 (robert   11-Jun-25) 
144
:         ):
1.1
 (patrick  03-Aug-20) 
145
:             cls.register_lldb_command(debugger, __name__)