brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 1457b76 Raw
113 lines · python
1#!/usr/bin/env python2 3# ----------------------------------------------------------------------4# For the shells csh, tcsh:5#   ( setenv PYTHONPATH /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ; ./globals.py <path> [<path> ...])6#7# For the shells sh, bash:8#   PYTHONPATH=/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python ./globals.py <path> [<path> ...]9# ----------------------------------------------------------------------10 11import lldb12import optparse13import os14import shlex15import sys16 17 18def get_globals(raw_path, options):19    error = lldb.SBError()20    # Resolve the path if needed21    path = os.path.expanduser(raw_path)22    # Create a target using path + options23    target = lldb.debugger.CreateTarget(24        path, options.arch, options.platform, False, error25    )26    if target:27        # Get the executable module28        module = target.module[target.executable.basename]29        if module:30            # Keep track of which variables we have already looked up31            global_names = list()32            # Iterate through all symbols in the symbol table and watch for any33            # DATA symbols34            for symbol in module.symbols:35                if symbol.type == lldb.eSymbolTypeData:36                    # The symbol is a DATA symbol, lets try and find all global variables37                    # that match this name and print them38                    global_name = symbol.name39                    # Make sure we don't lookup the same variable twice40                    if global_name not in global_names:41                        global_names.append(global_name)42                        # Find all global variables by name43                        global_variable_list = module.FindGlobalVariables(44                            target, global_name, lldb.UINT32_MAX45                        )46                        if global_variable_list:47                            # Print results for anything that matched48                            for global_variable in global_variable_list:49                                # returns the global variable name as a string50                                print("name = %s" % global_variable.name)51                                # Returns the variable value as a string52                                print("value = %s" % global_variable.value)53                                print(54                                    "type = %s" % global_variable.type55                                )  # Returns an lldb.SBType object56                                # Returns an lldb.SBAddress (section offset57                                # address) for this global58                                print("addr = %s" % global_variable.addr)59                                # Returns the file virtual address for this60                                # global61                                print(62                                    "file_addr = 0x%x" % global_variable.addr.file_addr63                                )64                                # returns the global variable value as a string65                                print("location = %s" % global_variable.location)66                                # Returns the size in bytes of this global67                                # variable68                                print("size = %s" % global_variable.size)69                                print()70 71 72def 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,84    )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.",92    )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".',100    )101    try:102        (options, args) = parser.parse_args(command_args)103    except:104        return105 106    for path in args:107        get_globals(path, options)108 109 110if __name__ == "__main__":111    lldb.debugger = lldb.SBDebugger.Create()112    globals(sys.argv[1:])113