diff options
Diffstat (limited to 'examples/python/memory.py')
-rwxr-xr-x | examples/python/memory.py | 276 |
1 files changed, 0 insertions, 276 deletions
diff --git a/examples/python/memory.py b/examples/python/memory.py deleted file mode 100755 index 5e2f636dc3e6..000000000000 --- a/examples/python/memory.py +++ /dev/null @@ -1,276 +0,0 @@ -#!/usr/bin/python - -#---------------------------------------------------------------------- -# Be sure to add the python path that points to the LLDB shared library. -# -# # To use this in the embedded python interpreter using "lldb" just -# import it with the full path using the "command script import" -# command -# (lldb) command script import /path/to/cmdtemplate.py -#---------------------------------------------------------------------- - -import commands -import platform -import os -import re -import sys - -try: - # Just try for LLDB in case PYTHONPATH is already correctly setup - import lldb -except ImportError: - lldb_python_dirs = list() - # lldb is not in the PYTHONPATH, try some defaults for the current platform - platform_system = platform.system() - if platform_system == 'Darwin': - # On Darwin, try the currently selected Xcode directory - xcode_dir = commands.getoutput("xcode-select --print-path") - if xcode_dir: - lldb_python_dirs.append( - os.path.realpath( - xcode_dir + - '/../SharedFrameworks/LLDB.framework/Resources/Python')) - lldb_python_dirs.append( - xcode_dir + '/Library/PrivateFrameworks/LLDB.framework/Resources/Python') - lldb_python_dirs.append( - '/System/Library/PrivateFrameworks/LLDB.framework/Resources/Python') - success = False - for lldb_python_dir in lldb_python_dirs: - if os.path.exists(lldb_python_dir): - if not (sys.path.__contains__(lldb_python_dir)): - sys.path.append(lldb_python_dir) - try: - import lldb - except ImportError: - pass - else: - print 'imported lldb from: "%s"' % (lldb_python_dir) - success = True - break - if not success: - print "error: couldn't locate the 'lldb' module, please set PYTHONPATH correctly" - sys.exit(1) - -import commands -import optparse -import shlex -import string -import struct -import time - - -def append_data_callback(option, opt_str, value, parser): - if opt_str == "--uint8": - int8 = int(value, 0) - parser.values.data += struct.pack('1B', int8) - if opt_str == "--uint16": - int16 = int(value, 0) - parser.values.data += struct.pack('1H', int16) - if opt_str == "--uint32": - int32 = int(value, 0) - parser.values.data += struct.pack('1I', int32) - if opt_str == "--uint64": - int64 = int(value, 0) - parser.values.data += struct.pack('1Q', int64) - if opt_str == "--int8": - int8 = int(value, 0) - parser.values.data += struct.pack('1b', int8) - if opt_str == "--int16": - int16 = int(value, 0) - parser.values.data += struct.pack('1h', int16) - if opt_str == "--int32": - int32 = int(value, 0) - parser.values.data += struct.pack('1i', int32) - if opt_str == "--int64": - int64 = int(value, 0) - parser.values.data += struct.pack('1q', int64) - - -def create_memfind_options(): - usage = "usage: %prog [options] STARTADDR [ENDADDR]" - description = '''This command can find data in a specified address range. -Options are used to specify the data that is to be looked for and the options -can be specified multiple times to look for longer streams of data. -''' - parser = optparse.OptionParser( - description=description, - prog='memfind', - usage=usage) - parser.add_option( - '-s', - '--size', - type='int', - metavar='BYTESIZE', - dest='size', - help='Specify the byte size to search.', - default=0) - parser.add_option( - '--int8', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 8 bit signed integer value to search for in memory.', - default='') - parser.add_option( - '--int16', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 16 bit signed integer value to search for in memory.', - default='') - parser.add_option( - '--int32', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 32 bit signed integer value to search for in memory.', - default='') - parser.add_option( - '--int64', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 64 bit signed integer value to search for in memory.', - default='') - parser.add_option( - '--uint8', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 8 bit unsigned integer value to search for in memory.', - default='') - parser.add_option( - '--uint16', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 16 bit unsigned integer value to search for in memory.', - default='') - parser.add_option( - '--uint32', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 32 bit unsigned integer value to search for in memory.', - default='') - parser.add_option( - '--uint64', - action="callback", - callback=append_data_callback, - type='string', - metavar='INT', - dest='data', - help='Specify a 64 bit unsigned integer value to search for in memory.', - default='') - return parser - - -def memfind_command(debugger, command, result, dict): - # Use the Shell Lexer to properly parse up command options just like a - # shell would - command_args = shlex.split(command) - parser = create_memfind_options() - (options, args) = parser.parse_args(command_args) - # try: - # (options, args) = parser.parse_args(command_args) - # except: - # # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit - # # (courtesy of OptParse dealing with argument errors by throwing SystemExit) - # result.SetStatus (lldb.eReturnStatusFailed) - # print >>result, "error: option parsing failed" # returning a string is the same as returning an error whose description is the string - # return - memfind(debugger.GetSelectedTarget(), options, args, result) - - -def print_error(str, show_usage, result): - print >>result, str - if show_usage: - print >>result, create_memfind_options().format_help() - - -def memfind(target, options, args, result): - num_args = len(args) - start_addr = 0 - if num_args == 1: - if options.size > 0: - print_error( - "error: --size must be specified if there is no ENDADDR argument", - True, - result) - return - start_addr = int(args[0], 0) - elif num_args == 2: - if options.size != 0: - print_error( - "error: --size can't be specified with an ENDADDR argument", - True, - result) - return - start_addr = int(args[0], 0) - end_addr = int(args[1], 0) - if start_addr >= end_addr: - print_error( - "error: inavlid memory range [%#x - %#x)" % - (start_addr, end_addr), True, result) - return - options.size = end_addr - start_addr - else: - print_error("error: memfind takes 1 or 2 arguments", True, result) - return - - if not options.data: - print >>result, 'error: no data specified to search for' - return - - if not target: - print >>result, 'error: invalid target' - return - process = target.process - if not process: - print >>result, 'error: invalid process' - return - - error = lldb.SBError() - bytes = process.ReadMemory(start_addr, options.size, error) - if error.Success(): - num_matches = 0 - print >>result, "Searching memory range [%#x - %#x) for" % ( - start_addr, end_addr), - for byte in options.data: - print >>result, '%2.2x' % ord(byte), - print >>result - - match_index = string.find(bytes, options.data) - while match_index != -1: - num_matches = num_matches + 1 - print >>result, '%#x: %#x + %u' % (start_addr + - match_index, start_addr, match_index) - match_index = string.find(bytes, options.data, match_index + 1) - - if num_matches == 0: - print >>result, "error: no matches found" - else: - print >>result, 'error: %s' % (error.GetCString()) - - -if __name__ == '__main__': - print 'error: this script is designed to be used within the embedded script interpreter in LLDB' -elif getattr(lldb, 'debugger', None): - memfind_command.__doc__ = create_memfind_options().format_help() - lldb.debugger.HandleCommand( - 'command script add -f memory.memfind_command memfind') - print '"memfind" command installed, use the "--help" option for detailed help' |