forked from OSchip/llvm-project
79 lines
3.2 KiB
Python
79 lines
3.2 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'
|