[Lldb-commits] [lldb] r159775 - /lldb/trunk/examples/python/globals.py

Greg Clayton gclayton at apple.com
Thu Jul 5 13:24:41 PDT 2012


Author: gclayton
Date: Thu Jul  5 15:24:41 2012
New Revision: 159775

URL: http://llvm.org/viewvc/llvm-project?rev=159775&view=rev
Log:
Added a new example that extracts all global variables from an object file and prints any available info.


Added:
    lldb/trunk/examples/python/globals.py   (with props)

Added: lldb/trunk/examples/python/globals.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/examples/python/globals.py?rev=159775&view=auto
==============================================================================
--- lldb/trunk/examples/python/globals.py (added)
+++ lldb/trunk/examples/python/globals.py Thu Jul  5 15:24:41 2012
@@ -0,0 +1,72 @@
+#!/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> ...]
+#----------------------------------------------------------------------
+
+import lldb
+import commands
+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:
+                                print 'name = %s' % global_variable.name    # returns the global variable name as a string
+                                print 'value = %s' % global_variable.value  # Returns the variable value as a string
+                                print 'type = %s' % global_variable.type    # Returns an lldb.SBType object
+                                print 'addr = %s' % global_variable.addr    # Returns an lldb.SBAddress (section offset address) for this global
+                                print 'file_addr = 0x%x' % global_variable.addr.file_addr    # Returns the file virtual address for this global
+                                print 'location = %s' % global_variable.location    # returns the global variable value as a string
+                                print 'size = %s' % global_variable.size    # Returns the size in bytes of this global variable
+                                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 one platform by name')
+    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:])
+

Propchange: lldb/trunk/examples/python/globals.py
------------------------------------------------------------------------------
    svn:executable = *





More information about the lldb-commits mailing list