[Lldb-commits] [lldb] r335401 - Update cmdtemplate.py to use best pratices.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Fri Jun 22 16:34:24 PDT 2018
Author: gclayton
Date: Fri Jun 22 16:34:24 2018
New Revision: 335401
URL: http://llvm.org/viewvc/llvm-project?rev=335401&view=rev
Log:
Update cmdtemplate.py to use best pratices.
Fixes include:
- fix all lint errors
- add code that will automatically register and LLDB command classes by detecting the classes and any classes that have a "register_lldb_command" function
- automatically fill in the correct module name when registering commands
- automatically fill in the class name when registering command
Modified:
lldb/trunk/examples/python/cmdtemplate.py
Modified: lldb/trunk/examples/python/cmdtemplate.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/cmdtemplate.py?rev=335401&r1=335400&r2=335401&view=diff
==============================================================================
--- lldb/trunk/examples/python/cmdtemplate.py (original)
+++ lldb/trunk/examples/python/cmdtemplate.py Fri Jun 22 16:34:24 2018
@@ -1,69 +1,91 @@
#!/usr/bin/python
-#----------------------------------------------------------------------
+# ---------------------------------------------------------------------
# Be sure to add the python path that points to the LLDB shared library.
#
# # To use this in the embedded python interpreter using "lldb" just
# import it with the full path using the "command script import"
# command
# (lldb) command script import /path/to/cmdtemplate.py
-#----------------------------------------------------------------------
+# ---------------------------------------------------------------------
+import inspect
import lldb
-import commands
import optparse
import shlex
+import sys
+
class FrameStatCommand:
- def create_options(self):
+ program = 'framestats'
+
+ @classmethod
+ def register_lldb_command(cls, debugger, module_name):
+ parser = cls.create_options()
+ cls.__doc__ = parser.format_help()
+ # Add any commands contained in this module to LLDB
+ command = 'command script add -c %s.%s %s' % (module_name,
+ cls.__name__,
+ cls.program)
+ debugger.HandleCommand(command)
+ print('The "{0}" command has been installed, type "help {0}" or "{0} '
+ '--help" for detailed help.'.format(cls.program))
+
+ @classmethod
+ def create_options(cls):
usage = "usage: %prog [options]"
- description = '''This command is meant to be an example of how to make an LLDB command that
-does something useful, follows best practices, and exploits the SB API.
-Specifically, this command computes the aggregate and average size of the variables in the current frame
-and allows you to tweak exactly which variables are to be accounted in the computation.
-'''
-
- # Pass add_help_option = False, since this keeps the command in line with lldb commands,
- # and we wire up "help command" to work by providing the long & short help methods below.
- self.parser = optparse.OptionParser(
- description = description,
- prog = 'framestats',
- usage = usage,
- add_help_option = False)
+ description = ('This command is meant to be an example of how to make '
+ 'an LLDB command that does something useful, follows '
+ 'best practices, and exploits the SB API. '
+ 'Specifically, this command computes the aggregate '
+ 'and average size of the variables in the current '
+ 'frame and allows you to tweak exactly which variables '
+ 'are to be accounted in the computation.')
+
+ # Pass add_help_option = False, since this keeps the command in line
+ # with lldb commands, and we wire up "help command" to work by
+ # providing the long & short help methods below.
+ parser = optparse.OptionParser(
+ description=description,
+ prog=cls.program,
+ usage=usage,
+ add_help_option=False)
- self.parser.add_option(
+ parser.add_option(
'-i',
'--in-scope',
- action = 'store_true',
- dest = 'inscope',
- help = 'in_scope_only = True',
- default = True)
+ action='store_true',
+ dest='inscope',
+ help='in_scope_only = True',
+ default=True)
- self.parser.add_option(
+ parser.add_option(
'-a',
'--arguments',
- action = 'store_true',
- dest = 'arguments',
- help = 'arguments = True',
- default = True)
+ action='store_true',
+ dest='arguments',
+ help='arguments = True',
+ default=True)
- self.parser.add_option(
+ parser.add_option(
'-l',
'--locals',
- action = 'store_true',
- dest = 'locals',
- help = 'locals = True',
- default = True)
+ action='store_true',
+ dest='locals',
+ help='locals = True',
+ default=True)
- self.parser.add_option(
+ parser.add_option(
'-s',
'--statics',
- action = 'store_true',
- dest = 'statics',
- help = 'statics = True',
- default = True)
-
+ action='store_true',
+ dest='statics',
+ help='statics = True',
+ default=True)
+
+ return parser
+
def get_short_help(self):
return "Example command for use in debugging"
@@ -71,23 +93,25 @@ and allows you to tweak exactly which va
return self.help_string
def __init__(self, debugger, unused):
- self.create_options()
+ self.parser = self.create_options()
self.help_string = self.parser.format_help()
def __call__(self, debugger, command, exe_ctx, result):
# Use the Shell Lexer to properly parse up command options just like a
# shell would
command_args = shlex.split(command)
-
+
try:
(options, args) = self.parser.parse_args(command_args)
except:
- # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit
- # (courtesy of OptParse dealing with argument errors by throwing SystemExit)
+ # if you don't handle exceptions, passing an incorrect argument to
+ # the OptionParser will cause LLDB to exit (courtesy of OptParse
+ # dealing with argument errors by throwing SystemExit)
result.SetError("option parsing failed")
return
- # Always get program state from the SBExecutionContext passed in as exe_ctx
+ # Always get program state from the lldb.SBExecutionContext passed
+ # in as exe_ctx
frame = exe_ctx.GetFrame()
if not frame.IsValid():
result.SetError("invalid frame")
@@ -108,15 +132,16 @@ and allows you to tweak exactly which va
variable_type = variable.GetType()
total_size = total_size + variable_type.GetByteSize()
average_size = float(total_size) / variables_count
- print >>result, "Your frame has %d variables. Their total size is %d bytes. The average size is %f bytes" % (
- variables_count, total_size, average_size)
- # not returning anything is akin to returning success
+ print >>result, ("Your frame has %d variables. Their total size "
+ "is %d bytes. The average size is %f bytes") % (
+ variables_count, total_size, average_size)
+ # not returning anything is akin to returning success
def __lldb_init_module(debugger, dict):
- # This initializer is being run from LLDB in the embedded command interpreter
-
- # Add any commands contained in this module to LLDB
- debugger.HandleCommand(
- 'command script add -c cmdtemplate.FrameStatCommand framestats')
- print 'The "framestats" command has been installed, type "help framestats" for detailed help.'
+ # Register all classes that have a register_lldb_command method
+ for _name, cls in inspect.getmembers(sys.modules[__name__]):
+ if inspect.isclass(cls) and callable(getattr(cls,
+ "register_lldb_command",
+ None)):
+ cls.register_lldb_command(debugger, __name__)
More information about the lldb-commits
mailing list