summaryrefslogtreecommitdiff
path: root/examples/python/lldb_module_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/python/lldb_module_utils.py')
-rw-r--r--examples/python/lldb_module_utils.py191
1 files changed, 0 insertions, 191 deletions
diff --git a/examples/python/lldb_module_utils.py b/examples/python/lldb_module_utils.py
deleted file mode 100644
index 006f232681f8..000000000000
--- a/examples/python/lldb_module_utils.py
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/python
-
-import lldb
-import optparse
-import shlex
-import string
-import sys
-
-
-class DumpLineTables:
- command_name = "dump-line-tables"
- short_decription = "Dumps full paths to compile unit files and optionally all line table files."
- description = 'Dumps all line tables from all compile units for any modules specified as arguments. Specifying the --verbose flag will output address ranges for each line entry.'
- usage = "usage: %prog [options] MODULE1 [MODULE2 ...]"
- def create_options(self):
- self.parser = optparse.OptionParser(
- description=self.description,
- prog=self.command_name,
- usage=self.usage)
-
- self.parser.add_option(
- '-v',
- '--verbose',
- action='store_true',
- dest='verbose',
- help='Display verbose output.',
- default=False)
-
- def get_short_help(self):
- return self.short_decription
-
- def get_long_help(self):
- return self.help_string
-
- def __init__(self, debugger, unused):
- 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)
- result.SetError("option parsing failed")
- return
-
- # Always get program state from the SBExecutionContext passed in as exe_ctx
- target = exe_ctx.GetTarget()
- if not target.IsValid():
- result.SetError("invalid target")
- return
-
- for module_path in args:
- module = target.module[module_path]
- if not module:
- result.SetError('no module found that matches "%s".' % (module_path))
- return
- num_cus = module.GetNumCompileUnits()
- print >>result, 'Module: "%s"' % (module.file.fullpath),
- if num_cus == 0:
- print >>result, 'no debug info.'
- continue
- print >>result, 'has %u compile units:' % (num_cus)
- for cu_idx in range(num_cus):
- cu = module.GetCompileUnitAtIndex(cu_idx)
- print >>result, ' Compile Unit: %s' % (cu.file.fullpath)
- for line_idx in range(cu.GetNumLineEntries()):
- line_entry = cu.GetLineEntryAtIndex(line_idx)
- start_file_addr = line_entry.addr.file_addr
- end_file_addr = line_entry.end_addr.file_addr
- # If the two addresses are equal, this line table entry
- # is a termination entry
- if options.verbose:
- if start_file_addr != end_file_addr:
- result.PutCString(
- ' [%#x - %#x): %s' %
- (start_file_addr, end_file_addr, line_entry))
- else:
- if start_file_addr == end_file_addr:
- result.PutCString(' %#x: END' %
- (start_file_addr))
- else:
- result.PutCString(
- ' %#x: %s' %
- (start_file_addr, line_entry))
- if start_file_addr == end_file_addr:
- result.PutCString("\n")
-
-
-class DumpFiles:
- command_name = "dump-files"
- short_description = "Dumps full paths to compile unit files and optionally all line table files."
- usage = "usage: %prog [options] MODULE1 [MODULE2 ...]"
- description = '''This class adds a dump-files command to the LLDB interpreter.
-
-This command will dump all compile unit file paths found for each source file
-for the binaries specified as arguments in the current target. Specify the
---support-files or -s option to see all file paths that a compile unit uses in
-its lines tables. This is handy for troubleshooting why breakpoints aren't
-working in IDEs that specify full paths to source files when setting file and
-line breakpoints. Sometimes symlinks cause the debug info to contain the symlink
-path and an IDE will resolve the path to the actual file and use the resolved
-path when setting breakpoints.
-'''
- def create_options(self):
- # 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 = self.description,
- prog = self.command_name,
- usage = self.usage,
- add_help_option = False)
-
- self.parser.add_option(
- '-s',
- '--support-files',
- action = 'store_true',
- dest = 'support_files',
- help = 'Dumps full paths to all files used in a compile unit.',
- default = False)
-
- def get_short_help(self):
- return self.short_description
-
- def get_long_help(self):
- return self.help_string
-
- def __init__(self, debugger, unused):
- 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)
- result.SetError("option parsing failed")
- return
-
- # Always get program state from the SBExecutionContext passed in as exe_ctx
- target = exe_ctx.GetTarget()
- if not target.IsValid():
- result.SetError("invalid target")
- return
-
- if len(args) == 0:
- result.SetError("one or more executable paths must be specified")
- return
-
- for module_path in args:
- module = target.module[module_path]
- if not module:
- result.SetError('no module found that matches "%s".' % (module_path))
- return
- num_cus = module.GetNumCompileUnits()
- print >>result, 'Module: "%s"' % (module.file.fullpath),
- if num_cus == 0:
- print >>result, 'no debug info.'
- continue
- print >>result, 'has %u compile units:' % (num_cus)
- for i in range(num_cus):
- cu = module.GetCompileUnitAtIndex(i)
- print >>result, ' Compile Unit: %s' % (cu.file.fullpath)
- if options.support_files:
- num_support_files = cu.GetNumSupportFiles()
- for j in range(num_support_files):
- path = cu.GetSupportFileAtIndex(j).fullpath
- print >>result, ' file[%u]: %s' % (j, path)
-
-
-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 %s.DumpLineTables %s' % (__name__,
- DumpLineTables.command_name))
- debugger.HandleCommand(
- 'command script add -c %s.DumpFiles %s' % (__name__, DumpFiles.command_name))
- print 'The "%s" and "%s" commands have been installed.' % (DumpLineTables.command_name,
- DumpFiles.command_name)