diff options
Diffstat (limited to 'lldb/examples/python/crashlog.py')
-rwxr-xr-x | lldb/examples/python/crashlog.py | 129 |
1 files changed, 67 insertions, 62 deletions
diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py index 540aca6..5d1ff27 100755 --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -26,7 +26,12 @@ # PYTHONPATH=/path/to/LLDB.framework/Resources/Python ./crashlog.py ~/Library/Logs/DiagnosticReports/a.crash #---------------------------------------------------------------------- -import commands +from __future__ import print_function +from builtins import str +from builtins import map +from builtins import range +from builtins import object +import subprocess import cmd import datetime import glob @@ -51,7 +56,7 @@ except ImportError: platform_system = platform.system() if platform_system == 'Darwin': # On Darwin, try the currently selected Xcode directory - xcode_dir = commands.getoutput("xcode-select --print-path") + xcode_dir = subprocess.getoutput("xcode-select --print-path") if xcode_dir: lldb_python_dirs.append( os.path.realpath( @@ -71,11 +76,11 @@ except ImportError: except ImportError: pass else: - print 'imported lldb from: "%s"' % (lldb_python_dir) + 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" + print("error: couldn't locate the 'lldb' module, please set PYTHONPATH correctly") sys.exit(1) from lldb.utils import symbolication @@ -99,7 +104,7 @@ class CrashLog(symbolication.Symbolicator): '(0x[0-9a-fA-F]+)[-\s]+(0x[0-9a-fA-F]+)\s+[+]?(.+?)\s+(\(.+\))?\s?(<([-0-9a-fA-F]+)>)? (.*)') empty_line_regex = re.compile('^$') - class Thread: + class Thread(object): """Class that represents a thread in a darwin crash log""" def __init__(self, index, app_specific_backtrace): @@ -113,17 +118,17 @@ class CrashLog(symbolication.Symbolicator): def dump(self, prefix): if self.app_specific_backtrace: - print "%Application Specific Backtrace[%u] %s" % (prefix, self.index, self.reason) + print("%Application Specific Backtrace[%u] %s" % (prefix, self.index, self.reason)) else: - print "%sThread[%u] %s" % (prefix, self.index, self.reason) + print("%sThread[%u] %s" % (prefix, self.index, self.reason)) if self.frames: - print "%s Frames:" % (prefix) + print("%s Frames:" % (prefix)) for frame in self.frames: frame.dump(prefix + ' ') if self.registers: - print "%s Registers:" % (prefix) - for reg in self.registers.keys(): - print "%s %-5s = %#16.16x" % (prefix, reg, self.registers[reg]) + print("%s Registers:" % (prefix)) + for reg in list(self.registers.keys()): + print("%s %-5s = %#16.16x" % (prefix, reg, self.registers[reg])) def dump_symbolicated(self, crash_log, options): this_thread_crashed = self.app_specific_backtrace @@ -132,7 +137,7 @@ class CrashLog(symbolication.Symbolicator): if options.crashed_only and this_thread_crashed == False: return - print "%s" % self + print("%s" % self) #prev_frame_index = -1 display_frame_idx = -1 for frame_idx, frame in enumerate(self.frames): @@ -151,7 +156,7 @@ class CrashLog(symbolication.Symbolicator): symbolicated_frame_address_idx = 0 for symbolicated_frame_address in symbolicated_frame_addresses: display_frame_idx += 1 - print '[%3u] %s' % (frame_idx, symbolicated_frame_address) + print('[%3u] %s' % (frame_idx, symbolicated_frame_address)) if (options.source_all or self.did_crash( )) and display_frame_idx < options.source_frames and options.source_context: source_context = options.source_context @@ -166,12 +171,12 @@ class CrashLog(symbolication.Symbolicator): # Indent the source a bit indent_str = ' ' join_str = '\n' + indent_str - print '%s%s' % (indent_str, join_str.join(source_text.split('\n'))) + print('%s%s' % (indent_str, join_str.join(source_text.split('\n')))) if symbolicated_frame_address_idx == 0: if disassemble: instructions = symbolicated_frame_address.get_instructions() if instructions: - print + print() symbolication.disassemble_instructions( crash_log.get_target(), instructions, @@ -179,10 +184,10 @@ class CrashLog(symbolication.Symbolicator): options.disassemble_before, options.disassemble_after, frame.index > 0) - print + print() symbolicated_frame_address_idx += 1 else: - print frame + print(frame) def add_ident(self, ident): if ident not in self.idents: @@ -200,7 +205,7 @@ class CrashLog(symbolication.Symbolicator): s += ' %s' % self.reason return s - class Frame: + class Frame(object): """Class that represents a stack frame in a thread in a darwin crash log""" def __init__(self, index, pc, description): @@ -216,13 +221,13 @@ class CrashLog(symbolication.Symbolicator): return "[%3u] 0x%16.16x" % (self.index, self.pc) def dump(self, prefix): - print "%s%s" % (prefix, str(self)) + print("%s%s" % (prefix, str(self))) class DarwinImage(symbolication.Image): """Class that represents a binary images in a darwin crash log""" dsymForUUIDBinary = os.path.expanduser('~rc/bin/dsymForUUID') if not os.path.exists(dsymForUUIDBinary): - dsymForUUIDBinary = commands.getoutput('which dsymForUUID') + dsymForUUIDBinary = subprocess.getoutput('which dsymForUUID') dwarfdump_uuid_regex = re.compile( 'UUID: ([-0-9a-fA-F]+) \(([^\(]+)\) .*') @@ -245,7 +250,7 @@ class CrashLog(symbolication.Symbolicator): self.version = version def find_matching_slice(self): - dwarfdump_cmd_output = commands.getoutput( + dwarfdump_cmd_output = subprocess.getoutput( 'dwarfdump --uuid "%s"' % self.path) self_uuid = self.get_uuid() for line in dwarfdump_cmd_output.splitlines(): @@ -270,16 +275,16 @@ class CrashLog(symbolication.Symbolicator): # Mark this as resolved so we don't keep trying self.resolved = True uuid_str = self.get_normalized_uuid_string() - print 'Getting symbols for %s %s...' % (uuid_str, self.path), + print('Getting symbols for %s %s...' % (uuid_str, self.path), end=' ') if os.path.exists(self.dsymForUUIDBinary): dsym_for_uuid_command = '%s %s' % ( self.dsymForUUIDBinary, uuid_str) - s = commands.getoutput(dsym_for_uuid_command) + s = subprocess.getoutput(dsym_for_uuid_command) if s: try: plist_root = plistlib.readPlistFromString(s) except: - print("Got exception: ", sys.exc_value, " handling dsymForUUID output: \n", s) + print(("Got exception: ", sys.exc_info()[1], " handling dsymForUUID output: \n", s)) raise if plist_root: plist = plist_root[uuid_str] @@ -315,7 +320,7 @@ class CrashLog(symbolication.Symbolicator): pass if (self.resolved_path and os.path.exists(self.resolved_path)) or ( self.path and os.path.exists(self.path)): - print 'ok' + print('ok') # if self.resolved_path: # print ' exe = "%s"' % self.resolved_path # if self.symfile: @@ -471,7 +476,7 @@ class CrashLog(symbolication.Symbolicator): thread.frames.append(CrashLog.Frame(int(frame_match.group(1)), int( frame_match.group(3), 0), frame_match.group(4))) else: - print 'error: frame regex failed for line: "%s"' % line + print('error: frame regex failed for line: "%s"' % line) elif parse_mode == PARSE_MODE_IMAGES: image_match = self.image_regex_uuid.search(line) if image_match: @@ -484,7 +489,7 @@ class CrashLog(symbolication.Symbolicator): uuid.UUID(img_uuid), img_path) self.images.append(image) else: - print "error: image regex failed for: %s" % line + print("error: image regex failed for: %s" % line) elif parse_mode == PARSE_MODE_THREGS: stripped_line = line.strip() @@ -502,15 +507,15 @@ class CrashLog(symbolication.Symbolicator): f.close() def dump(self): - print "Crash Log File: %s" % (self.path) + print("Crash Log File: %s" % (self.path)) if self.backtraces: - print "\nApplication Specific Backtraces:" + print("\nApplication Specific Backtraces:") for thread in self.backtraces: thread.dump(' ') - print "\nThreads:" + print("\nThreads:") for thread in self.threads: thread.dump(' ') - print "\nImages:" + print("\nImages:") for image in self.images: image.dump(' ') @@ -533,7 +538,7 @@ class CrashLog(symbolication.Symbolicator): return self.target # We weren't able to open the main executable as, but we can still # symbolicate - print 'crashlog.create_target()...2' + print('crashlog.create_target()...2') if self.idents: for ident in self.idents: image = self.find_image_with_identifier(ident) @@ -541,13 +546,13 @@ class CrashLog(symbolication.Symbolicator): self.target = image.create_target() if self.target: return self.target # success - print 'crashlog.create_target()...3' + print('crashlog.create_target()...3') for image in self.images: self.target = image.create_target() if self.target: return self.target # success - print 'crashlog.create_target()...4' - print 'error: unable to locate any executables from the crash log' + print('crashlog.create_target()...4') + print('error: unable to locate any executables from the crash log') return self.target def get_target(self): @@ -555,7 +560,7 @@ class CrashLog(symbolication.Symbolicator): def usage(): - print "Usage: lldb-symbolicate.py [-n name] executable-image" + print("Usage: lldb-symbolicate.py [-n name] executable-image") sys.exit(0) @@ -572,7 +577,7 @@ class Interactive(cmd.Cmd): def default(self, line): '''Catch all for unknown command, which will exit the interpreter.''' - print "uknown command: %s" % line + print("uknown command: %s" % line) return True def do_q(self, line): @@ -602,7 +607,7 @@ class Interactive(cmd.Cmd): if idx < len(self.crash_logs): SymbolicateCrashLog(self.crash_logs[idx], options) else: - print 'error: crash log index %u is out of range' % (idx) + print('error: crash log index %u is out of range' % (idx)) else: # No arguments, symbolicate all crash logs using the options # provided @@ -613,9 +618,9 @@ class Interactive(cmd.Cmd): '''Dump a list of all crash logs that are currently loaded. USAGE: list''' - print '%u crash logs are loaded:' % len(self.crash_logs) + print('%u crash logs are loaded:' % len(self.crash_logs)) for (crash_log_idx, crash_log) in enumerate(self.crash_logs): - print '[%u] = %s' % (crash_log_idx, crash_log.path) + print('[%u] = %s' % (crash_log_idx, crash_log.path)) def do_image(self, line): '''Dump information about one or more binary images in the crash log given an image basename, or all images if no arguments are provided.''' @@ -645,22 +650,22 @@ class Interactive(cmd.Cmd): if fullpath_search: if image.get_resolved_path() == image_path: matches_found += 1 - print '[%u] ' % (crash_log_idx), image + print('[%u] ' % (crash_log_idx), image) else: image_basename = image.get_resolved_path_basename() if image_basename == image_path: matches_found += 1 - print '[%u] ' % (crash_log_idx), image + print('[%u] ' % (crash_log_idx), image) if matches_found == 0: for (image_idx, image) in enumerate(crash_log.images): resolved_image_path = image.get_resolved_path() if resolved_image_path and string.find( image.get_resolved_path(), image_path) >= 0: - print '[%u] ' % (crash_log_idx), image + print('[%u] ' % (crash_log_idx), image) else: for crash_log in self.crash_logs: for (image_idx, image) in enumerate(crash_log.images): - print '[%u] %s' % (image_idx, image) + print('[%u] %s' % (image_idx, image)) return False @@ -675,12 +680,12 @@ def interactive_crashlogs(options, args): # print 'crash_log_file = "%s"' % crash_log_file crash_log = CrashLog(crash_log_file) if crash_log.error: - print crash_log.error + print(crash_log.error) continue if options.debug: crash_log.dump() if not crash_log.images: - print 'error: no images in crash log "%s"' % (crash_log) + print('error: no images in crash log "%s"' % (crash_log)) continue else: crash_logs.append(crash_log) @@ -736,7 +741,7 @@ def save_crashlog(debugger, command, exe_ctx, result, dict): (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) out_file.write( 'OS Version: Mac OS X %s (%s)\n' % - (platform.mac_ver()[0], commands.getoutput('sysctl -n kern.osversion'))) + (platform.mac_ver()[0], subprocess.getoutput('sysctl -n kern.osversion'))) out_file.write('Report Version: 9\n') for thread_idx in range(process.num_threads): thread = process.thread[thread_idx] @@ -808,21 +813,21 @@ def Symbolicate(debugger, command, result, dict): def SymbolicateCrashLog(crash_log, options): if crash_log.error: - print crash_log.error + print(crash_log.error) return if options.debug: crash_log.dump() if not crash_log.images: - print 'error: no images in crash log' + print('error: no images in crash log') return if options.dump_image_list: - print "Binary Images:" + print("Binary Images:") for image in crash_log.images: if options.verbose: - print image.debug_dump() + print(image.debug_dump()) else: - print image + print(image) target = crash_log.create_target() if not target: @@ -845,7 +850,7 @@ def SymbolicateCrashLog(crash_log, options): for image in images: images_to_load.append(image) else: - print 'error: can\'t find image for identifier "%s"' % ident + print('error: can\'t find image for identifier "%s"' % ident) else: for ident in crash_log.idents: images = crash_log.find_images_with_identifier(ident) @@ -853,13 +858,13 @@ def SymbolicateCrashLog(crash_log, options): for image in images: images_to_load.append(image) else: - print 'error: can\'t find image for identifier "%s"' % ident + print('error: can\'t find image for identifier "%s"' % ident) for image in images_to_load: if image not in loaded_images: err = image.add_module(target) if err: - print err + print(err) else: # print 'loaded %s' % image loaded_images.append(image) @@ -867,11 +872,11 @@ def SymbolicateCrashLog(crash_log, options): if crash_log.backtraces: for thread in crash_log.backtraces: thread.dump_symbolicated(crash_log, options) - print + print() for thread in crash_log.threads: thread.dump_symbolicated(crash_log, options) - print + print() def CreateSymbolicateCrashLogOptions( @@ -998,12 +1003,12 @@ be disassembled and lookups can be performed using the addresses found in the cr return if options.debug: - print 'command_args = %s' % command_args - print 'options', options - print 'args', args + print('command_args = %s' % command_args) + print('options', options) + print('args', args) if options.debug_delay > 0: - print "Waiting %u seconds for debugger to attach..." % options.debug_delay + print("Waiting %u seconds for debugger to attach..." % options.debug_delay) time.sleep(options.debug_delay) error = lldb.SBError() @@ -1024,4 +1029,4 @@ elif getattr(lldb, 'debugger', None): 'command script add -f lldb.macosx.crashlog.Symbolicate crashlog') lldb.debugger.HandleCommand( 'command script add -f lldb.macosx.crashlog.save_crashlog save_crashlog') - print '"crashlog" and "save_crashlog" command installed, use the "--help" option for detailed help' + print('"crashlog" and "save_crashlog" command installed, use the "--help" option for detailed help') |