113 lines · python
1#!/usr/bin/env python2 3# ----------------------------------------------------------------------4# For the shells csh, tcsh:5# ( setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ; ./globals.py <path> [<path> ...])6#7# For the shells sh, bash:8# PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ./globals.py <path> [<path> ...]9# ----------------------------------------------------------------------10 11import lldb12import optparse13import os14import shlex15import sys16 17 18def get_globals(raw_path, options):19 error = lldb.SBError()20 # Resolve the path if needed21 path = os.path.expanduser(raw_path)22 # Create a target using path + options23 target = lldb.debugger.CreateTarget(24 path, options.arch, options.platform, False, error25 )26 if target:27 # Get the executable module28 module = target.module[target.executable.basename]29 if module:30 # Keep track of which variables we have already looked up31 global_names = list()32 # Iterate through all symbols in the symbol table and watch for any33 # DATA symbols34 for symbol in module.symbols:35 if symbol.type == lldb.eSymbolTypeData:36 # The symbol is a DATA symbol, lets try and find all global variables37 # that match this name and print them38 global_name = symbol.name39 # Make sure we don't lookup the same variable twice40 if global_name not in global_names:41 global_names.append(global_name)42 # Find all global variables by name43 global_variable_list = module.FindGlobalVariables(44 target, global_name, lldb.UINT32_MAX45 )46 if global_variable_list:47 # Print results for anything that matched48 for global_variable in global_variable_list:49 # returns the global variable name as a string50 print("name = %s" % global_variable.name)51 # Returns the variable value as a string52 print("value = %s" % global_variable.value)53 print(54 "type = %s" % global_variable.type55 ) # Returns an lldb.SBType object56 # Returns an lldb.SBAddress (section offset57 # address) for this global58 print("addr = %s" % global_variable.addr)59 # Returns the file virtual address for this60 # global61 print(62 "file_addr = 0x%x" % global_variable.addr.file_addr63 )64 # returns the global variable value as a string65 print("location = %s" % global_variable.location)66 # Returns the size in bytes of this global67 # variable68 print("size = %s" % global_variable.size)69 print()70 71 72def globals(command_args):73 """Extract all globals from any arguments which must be paths to object files."""74 usage = "usage: %prog [options] <PATH> [PATH ...]"75 description = """This command will find all globals in the specified object file and return an list() of lldb.SBValue objects (which might be empty)."""76 parser = optparse.OptionParser(description=description, prog="globals", usage=usage)77 parser.add_option(78 "-v",79 "--verbose",80 action="store_true",81 dest="verbose",82 help="display verbose debug info",83 default=False,84 )85 parser.add_option(86 "-a",87 "--arch",88 type="string",89 metavar="arch",90 dest="arch",91 help="Specify an architecture (or triple) to use when extracting from a file.",92 )93 parser.add_option(94 "-p",95 "--platform",96 type="string",97 metavar="platform",98 dest="platform",99 help='Specify the platform to use when creating the debug target. Valid values include "localhost", "darwin-kernel", "ios-simulator", "remote-freebsd", "remote-macosx", "remote-ios", "remote-linux".',100 )101 try:102 (options, args) = parser.parse_args(command_args)103 except:104 return105 106 for path in args:107 get_globals(path, options)108 109 110if __name__ == "__main__":111 lldb.debugger = lldb.SBDebugger.Create()112 globals(sys.argv[1:])113