3 # ----------------------------------------------------------------------
4 # For the shells csh, tcsh:
5 # ( setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ; ./globals.py <path> [<path> ...])
7 # For the shells sh, bash:
8 # PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ./globals.py <path> [<path> ...]
9 # ----------------------------------------------------------------------
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(
24 path
, options
.arch
, options
.platform
, False, error
27 # Get the executable module
28 module
= target
.module
[target
.executable
.basename
]
30 # Keep track of which variables we have already looked up
32 # Iterate through all symbols in the symbol table and watch for any
34 for symbol
in module
.symbols
:
35 if symbol
.type == lldb
.eSymbolTypeData
:
36 # The symbol is a DATA symbol, lets try and find all global variables
37 # that match this name and print them
38 global_name
= symbol
.name
39 # Make sure we don't lookup the same variable twice
40 if global_name
not in global_names
:
41 global_names
.append(global_name
)
42 # Find all global variables by name
43 global_variable_list
= module
.FindGlobalVariables(
44 target
, global_name
, lldb
.UINT32_MAX
46 if global_variable_list
:
47 # Print results for anything that matched
48 for global_variable
in global_variable_list
:
49 # returns the global variable name as a string
50 print("name = %s" % global_variable
.name
)
51 # Returns the variable value as a string
52 print("value = %s" % global_variable
.value
)
54 "type = %s" % global_variable
.type
55 ) # Returns an lldb.SBType object
56 # Returns an lldb.SBAddress (section offset
57 # address) for this global
58 print("addr = %s" % global_variable
.addr
)
59 # Returns the file virtual address for this
62 "file_addr = 0x%x" % global_variable
.addr
.file_addr
64 # returns the global variable value as a string
65 print("location = %s" % global_variable
.location
)
66 # Returns the size in bytes of this global
68 print("size = %s" % global_variable
.size
)
72 def 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
)
82 help="display verbose debug info",
91 help="Specify an architecture (or triple) to use when extracting from a file.",
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".',
102 (options
, args
) = parser
.parse_args(command_args
)
107 get_globals(path
, options
)
110 if __name__
== "__main__":
111 lldb
.debugger
= lldb
.SBDebugger
.Create()
112 globals(sys
.argv
[1:])