summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lldb/examples/python/globals.py
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lldb/examples/python/globals.py')
-rwxr-xr-xgnu/llvm/lldb/examples/python/globals.py106
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:])