[ELF] Reorder SectionBase/InputSectionBase members
[llvm-project.git] / lldb / examples / python / globals.py
blob1457b7612e2839175e590d24a745ad5e33763d37
1 #!/usr/bin/env python
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 # ----------------------------------------------------------------------
11 import lldb
12 import optparse
13 import os
14 import shlex
15 import sys
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
26 if target:
27 # Get the executable module
28 module = target.module[target.executable.basename]
29 if module:
30 # Keep track of which variables we have already looked up
31 global_names = list()
32 # Iterate through all symbols in the symbol table and watch for any
33 # DATA symbols
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)
53 print(
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
60 # global
61 print(
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
67 # variable
68 print("size = %s" % global_variable.size)
69 print()
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)
77 parser.add_option(
78 "-v",
79 "--verbose",
80 action="store_true",
81 dest="verbose",
82 help="display verbose debug info",
83 default=False,
85 parser.add_option(
86 "-a",
87 "--arch",
88 type="string",
89 metavar="arch",
90 dest="arch",
91 help="Specify an architecture (or triple) to use when extracting from a file.",
93 parser.add_option(
94 "-p",
95 "--platform",
96 type="string",
97 metavar="platform",
98 dest="platform",
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".',
101 try:
102 (options, args) = parser.parse_args(command_args)
103 except:
104 return
106 for path in args:
107 get_globals(path, options)
110 if __name__ == "__main__":
111 lldb.debugger = lldb.SBDebugger.Create()
112 globals(sys.argv[1:])