mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
2238dcc393
This is an ongoing series of commits that are reformatting our Python code. Reformatting is done with `black` (23.1.0). If you end up having problems merging this commit because you have made changes to a python file, the best way to handle that is to run `git checkout --ours <yourfile>` and then reformat it with black. RFC: https://discourse.llvm.org/t/rfc-document-and-standardize-python-code-style Differential revision: https://reviews.llvm.org/D151460
113 lines
4.7 KiB
Python
Executable File
113 lines
4.7 KiB
Python
Executable File
#!/usr/bin/env 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 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:])
|