| #!/usr/bin/python |
| |
| import lldb |
| import optparse |
| import shlex |
| import string |
| import sys |
| |
| |
| def create_dump_module_line_tables_options(): |
| usage = "usage: dump_module_line_tables [options] MODULE1 [MODULE2 ...]" |
| 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.''' |
| parser = optparse.OptionParser( |
| description=description, |
| prog='start_gdb_log', |
| usage=usage) |
| parser.add_option( |
| '-v', |
| '--verbose', |
| action='store_true', |
| dest='verbose', |
| help='Display verbose output.', |
| default=False) |
| return parser |
| |
| |
| def dump_module_line_tables(debugger, command, result, dict): |
| '''Dumps all line tables from all compile units for any modules specified as arguments.''' |
| command_args = shlex.split(command) |
| |
| parser = create_dump_module_line_tables_options() |
| try: |
| (options, args) = parser.parse_args(command_args) |
| except: |
| return |
| if command_args: |
| target = debugger.GetSelectedTarget() |
| lldb.target = target |
| for module_name in command_args: |
| result.PutCString('Searching for module "%s"' % (module_name,)) |
| module_fspec = lldb.SBFileSpec(module_name, False) |
| module = target.FindModule(module_fspec) |
| if module: |
| for cu_idx in range(module.GetNumCompileUnits()): |
| cu = module.GetCompileUnitAtIndex(cu_idx) |
| result.PutCString("\n%s:" % (cu.file)) |
| 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.Printf("\n") |
| else: |
| result.PutCString("no module for '%s'" % module) |
| else: |
| result.PutCString("error: invalid target") |
| |
| parser = create_dump_module_line_tables_options() |
| dump_module_line_tables.__doc__ = parser.format_help() |
| lldb.debugger.HandleCommand( |
| 'command script add -f %s.dump_module_line_tables dump_module_line_tables' % |
| __name__) |
| print 'Installed "dump_module_line_tables" command' |