diff options
author | 2020-08-03 14:33:06 +0000 | |
---|---|---|
committer | 2020-08-03 14:33:06 +0000 | |
commit | 061da546b983eb767bad15e67af1174fb0bcf31c (patch) | |
tree | 83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/examples/python/globals.py | |
parent | Import LLVM 10.0.0 release including clang, lld and lldb. (diff) | |
download | wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip |
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom
tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/examples/python/globals.py')
-rwxr-xr-x | gnu/llvm/lldb/examples/python/globals.py | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/examples/python/globals.py b/gnu/llvm/lldb/examples/python/globals.py new file mode 100755 index 00000000000..3e773441642 --- /dev/null +++ b/gnu/llvm/lldb/examples/python/globals.py @@ -0,0 +1,106 @@ +#!/usr/bin/python + +#---------------------------------------------------------------------- +# For the shells csh, tcsh: +# ( setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ; ./globals.py <path> [<path> ...]) +# +# For the shells sh, bash: +# PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ./globals.py <path> [<path> ...] +#---------------------------------------------------------------------- +from __future__ import print_function + +import lldb +import optparse +import os +import shlex +import sys + + +def get_globals(raw_path, options): + error = lldb.SBError() + # Resolve the path if needed + path = os.path.expanduser(raw_path) + # Create a target using path + options + target = lldb.debugger.CreateTarget( + path, options.arch, options.platform, False, error) + if target: + # Get the executable module + module = target.module[target.executable.basename] + if module: + # Keep track of which variables we have already looked up + global_names = list() + # Iterate through all symbols in the symbol table and watch for any + # DATA symbols + for symbol in module.symbols: + if symbol.type == lldb.eSymbolTypeData: + # The symbol is a DATA symbol, lets try and find all global variables + # that match this name and print them + global_name = symbol.name + # Make sure we don't lookup the same variable twice + if global_name not in global_names: + global_names.append(global_name) + # Find all global variables by name + global_variable_list = module.FindGlobalVariables( + target, global_name, lldb.UINT32_MAX) + if global_variable_list: + # Print results for anything that matched + for global_variable in global_variable_list: + # returns the global variable name as a string + print('name = %s' % global_variable.name) + # Returns the variable value as a string + print('value = %s' % global_variable.value) + print('type = %s' % global_variable.type) # Returns an lldb.SBType object + # Returns an lldb.SBAddress (section offset + # address) for this global + print('addr = %s' % global_variable.addr) + # Returns the file virtual address for this + # global + print('file_addr = 0x%x' % global_variable.addr.file_addr) + # returns the global variable value as a string + print('location = %s' % global_variable.location) + # Returns the size in bytes of this global + # variable + print('size = %s' % global_variable.size) + print() + + +def globals(command_args): + '''Extract all globals from any arguments which must be paths to object files.''' + usage = "usage: %prog [options] <PATH> [PATH ...]" + description = '''This command will find all globals in the specified object file and return an list() of lldb.SBValue objects (which might be empty).''' + parser = optparse.OptionParser( + description=description, + prog='globals', + usage=usage) + parser.add_option( + '-v', + '--verbose', + action='store_true', + dest='verbose', + help='display verbose debug info', + default=False) + parser.add_option( + '-a', + '--arch', + type='string', + metavar='arch', + dest='arch', + help='Specify an architecture (or triple) to use when extracting from a file.') + 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".') + try: + (options, args) = parser.parse_args(command_args) + except: + return + + for path in args: + get_globals(path, options) + +if __name__ == '__main__': + lldb.debugger = lldb.SBDebugger.Create() + globals(sys.argv[1:]) |