59 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/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' |