Home | History | Annotate | Download | only in python
      1 #!/usr/bin/python
      2 
      3 import lldb
      4 import optparse
      5 import shlex
      6 import string
      7 import sys
      8 
      9 def create_dump_module_line_tables_options ():
     10     usage = "usage: dump_module_line_tables [options] MODULE1 [MODULE2 ...]"
     11     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.'''
     12     parser = optparse.OptionParser(description=description, prog='start_gdb_log',usage=usage)
     13     parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='Display verbose output.', default=False)
     14     return parser
     15     
     16 def dump_module_line_tables(debugger, command, result, dict):
     17     '''Dumps all line tables from all compile units for any modules specified as arguments.'''
     18     command_args = shlex.split(command)
     19     
     20     parser = create_dump_module_line_tables_options ()
     21     try:
     22         (options, args) = parser.parse_args(command_args)
     23     except:
     24         return
     25     if command_args:
     26         target = debugger.GetSelectedTarget()
     27         lldb.target = target
     28         for module_name in command_args:
     29             result.PutCString('Searching for module "%s"' % (module_name,))
     30             module_fspec = lldb.SBFileSpec (module_name, False)
     31             module = target.FindModule (module_fspec);
     32             if module:
     33                 for cu_idx in range (module.GetNumCompileUnits()):
     34                     cu = module.GetCompileUnitAtIndex(cu_idx)
     35                     result.PutCString("\n%s:" % (cu.file))
     36                     for line_idx in range(cu.GetNumLineEntries()):
     37                         line_entry = cu.GetLineEntryAtIndex(line_idx)
     38                         start_file_addr = line_entry.addr.file_addr
     39                         end_file_addr = line_entry.end_addr.file_addr
     40                         # If the two addresses are equal, this line table entry is a termination entry
     41                         if options.verbose:
     42                             if start_file_addr != end_file_addr:
     43                                 result.PutCString('[%#x - %#x): %s' % (start_file_addr, end_file_addr, line_entry))
     44                         else:
     45                             if start_file_addr == end_file_addr:
     46                                 result.PutCString('%#x: END' % (start_file_addr))
     47                             else:
     48                                 result.PutCString('%#x: %s' % (start_file_addr, line_entry))
     49                         if start_file_addr == end_file_addr:
     50                             result.Printf("\n")
     51             else:
     52                 result.PutCString ("no module for '%s'" % module)
     53     else:
     54         result.PutCString ("error: invalid target")
     55 
     56 parser = create_dump_module_line_tables_options ()
     57 dump_module_line_tables.__doc__ = parser.format_help()
     58 lldb.debugger.HandleCommand('command script add -f %s.dump_module_line_tables dump_module_line_tables' % __name__)
     59 print 'Installed "dump_module_line_tables" command'