Greg Clayton | 54ce4db | 2012-07-05 20:24:41 +0000 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
| 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 | |
| 11 | import lldb |
| 12 | import commands |
| 13 | import optparse |
| 14 | import os |
| 15 | import shlex |
| 16 | import sys |
| 17 | |
| 18 | def get_globals(raw_path, options): |
| 19 | error = lldb.SBError() |
| 20 | # Resolve the path if needed |
| 21 | path = os.path.expanduser(raw_path) |
| 22 | # Create a target using path + options |
| 23 | target = lldb.debugger.CreateTarget(path, options.arch, options.platform, False, error) |
| 24 | if target: |
| 25 | # Get the executable module |
| 26 | module = target.module[target.executable.basename] |
| 27 | if module: |
| 28 | # Keep track of which variables we have already looked up |
| 29 | global_names = list() |
| 30 | # Iterate through all symbols in the symbol table and watch for any DATA symbols |
| 31 | for symbol in module.symbols: |
| 32 | if symbol.type == lldb.eSymbolTypeData: |
| 33 | # The symbol is a DATA symbol, lets try and find all global variables |
| 34 | # that match this name and print them |
| 35 | global_name = symbol.name |
| 36 | # Make sure we don't lookup the same variable twice |
| 37 | if global_name not in global_names: |
| 38 | global_names.append(global_name) |
| 39 | # Find all global variables by name |
| 40 | global_variable_list = module.FindGlobalVariables (target, global_name, lldb.UINT32_MAX) |
| 41 | if global_variable_list: |
| 42 | # Print results for anything that matched |
| 43 | for global_variable in global_variable_list: |
| 44 | print 'name = %s' % global_variable.name # returns the global variable name as a string |
| 45 | print 'value = %s' % global_variable.value # Returns the variable value as a string |
| 46 | print 'type = %s' % global_variable.type # Returns an lldb.SBType object |
| 47 | print 'addr = %s' % global_variable.addr # Returns an lldb.SBAddress (section offset address) for this global |
| 48 | print 'file_addr = 0x%x' % global_variable.addr.file_addr # Returns the file virtual address for this global |
| 49 | print 'location = %s' % global_variable.location # returns the global variable value as a string |
| 50 | print 'size = %s' % global_variable.size # Returns the size in bytes of this global variable |
| 51 | print |
| 52 | |
| 53 | def globals(command_args): |
| 54 | '''Extract all globals from any arguments which must be paths to object files.''' |
| 55 | usage = "usage: %prog [options] <PATH> [PATH ...]" |
| 56 | description='''This command will find all globals in the specified object file and return an list() of lldb.SBValue objects (which might be empty).''' |
| 57 | parser = optparse.OptionParser(description=description, prog='globals',usage=usage) |
| 58 | parser.add_option('-v', '--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) |
| 59 | parser.add_option('-a', '--arch', type='string', metavar='arch', dest='arch', help='Specify an architecture (or triple) to use when extracting from a file.') |
Greg Clayton | 9bb6d25 | 2013-06-26 22:24:05 +0000 | [diff] [blame] | 60 | parser.add_option('-p', '--platform', type='string', metavar='platform', dest='platform', 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".') |
Greg Clayton | 54ce4db | 2012-07-05 20:24:41 +0000 | [diff] [blame] | 61 | try: |
| 62 | (options, args) = parser.parse_args(command_args) |
| 63 | except: |
| 64 | return |
| 65 | |
| 66 | for path in args: |
| 67 | get_globals (path, options) |
| 68 | |
| 69 | if __name__ == '__main__': |
| 70 | lldb.debugger = lldb.SBDebugger.Create() |
| 71 | globals (sys.argv[1:]) |
| 72 | |