crashlog.py revision cd793121caadf8eac0b13283bc2caa4cd467aebf
101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton#!/usr/bin/python 201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton#---------------------------------------------------------------------- 401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton# Be sure to add the python path that points to the LLDB shared library. 501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton# On MacOSX csh, tcsh: 601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton# setenv PYTHONPATH /Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python 701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton# On MacOSX sh, bash: 801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton# export PYTHONPATH=/Developer/Library/PrivateFrameworks/LLDB.framework/Resources/Python 901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton#---------------------------------------------------------------------- 1001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 1101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport lldb 1201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport commands # commands.getoutput ('/bin/ls /tmp') 1301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport optparse 1401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport os 1501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport plistlib 1601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport pprint 1701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport re 1801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport sys 1901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonimport time 20cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Claytonimport uuid 21cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton 2201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 2301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg ClaytonPARSE_MODE_NORMAL = 0 2401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg ClaytonPARSE_MODE_THREAD = 1 2501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg ClaytonPARSE_MODE_IMAGES = 2 2601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg ClaytonPARSE_MODE_THREGS = 3 2701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg ClaytonPARSE_MODE_SYSTEM = 4 2801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 2901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonclass CrashLog: 3001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton """Class that does parses darwin crash logs""" 3101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_state_regex = re.compile('^Thread ([0-9]+) crashed with') 3201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_regex = re.compile('^Thread ([0-9]+)([^:]*):(.*)') 338077a5334dc4daef3a145d07307a970d00563055Greg Clayton frame_regex = re.compile('^([0-9]+) +([^ ]+) *\t(0x[0-9a-fA-F]+) +(.*)') 348077a5334dc4daef3a145d07307a970d00563055Greg Clayton image_regex_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^<]+)<([-0-9a-fA-F]+)> (.*)'); 358077a5334dc4daef3a145d07307a970d00563055Greg Clayton image_regex_no_uuid = re.compile('(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^/]+)/(.*)'); 3601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton empty_line_regex = re.compile('^$') 3701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 3801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton class Thread: 3901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton """Class that represents a thread in a darwin crash log""" 4001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __init__(self, index): 4101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.index = index 4201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.frames = list() 4301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.registers = dict() 4401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.reason = None 4501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.queue = None 4601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 4701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def dump(self, prefix): 4801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%sThread[%u] %s" % (prefix, self.index, self.reason) 4901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.frames: 5001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s Frames:" % (prefix) 5101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for frame in self.frames: 5201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton frame.dump(prefix + ' ') 5301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.registers: 5401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s Registers:" % (prefix) 5501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for reg in self.registers.keys(): 5601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s %-5s = %#16.16x" % (prefix, reg, self.registers[reg]) 5701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 5801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def did_crash(self): 5901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return self.reason != None 6001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 6101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __str__(self): 6201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton s = "Thread[%u]" % self.index 6301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.reason: 6401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton s += ' %s' % self.reason 6501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return s 6601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 6701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 6801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton class Frame: 6901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton """Class that represents a stack frame in a thread in a darwin crash log""" 7001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __init__(self, index, pc, details): 7101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.index = index 7201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.pc = pc 7301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.sym_ctx = None 7401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.details = details 7501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 7601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __str__(self): 7701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return "[%2u] %#16.16x %s" % (self.index, self.pc, self.details) 7801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 7901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def dump(self, prefix): 8001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s%s" % (prefix, self) 8101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 8201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 8301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton class Image: 8401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton """Class that represents a binary images in a darwin crash log""" 858077a5334dc4daef3a145d07307a970d00563055Greg Clayton dsymForUUIDBinary = os.path.expanduser('~rc/bin/dsymForUUID') 86cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if not os.path.exists(dsymForUUIDBinary): 87cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton dsymForUUIDBinary = commands.getoutput('which dsymForUUID') 88cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton 89cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton dwarfdump_uuid_regex = re.compile('UUID: ([-0-9a-fA-F]+) \(([^\(]+)\) .*') 908077a5334dc4daef3a145d07307a970d00563055Greg Clayton 9101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __init__(self, text_addr_lo, text_addr_hi, ident, version, uuid, path): 9201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.text_addr_lo = text_addr_lo 9301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.text_addr_hi = text_addr_hi 9401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.ident = ident 9501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.version = version 96cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.arch = None 9701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.uuid = uuid 9801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.path = path 99cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.resolved_path = None 100cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.dsym = None 10101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.target = None 10201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.module = None 10301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 10401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def dump(self, prefix): 10501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s%s" % (prefix, self) 10601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 10701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __str__(self): 108cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return "%#16.16x %s %s" % (self.text_addr_lo, self.uuid, self.get_resolved_path()) 10901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 110cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton def get_resolved_path(self): 111cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self.resolved_path: 112cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return self.resolved_path 113cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton elif self.path: 114cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return self.path 115cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return None 116cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton 117cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton def get_resolved_path_basename(self): 118cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton path = self.get_resolved_path() 119cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if path: 120cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return os.path.basename(path) 121cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return None 122cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton 123cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton def dsym_basename(self): 124cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self.dsym: 125cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return os.path.basename(self.dsym) 12601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return None 12701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 12801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def fetch_symboled_executable_and_dsym(self): 129cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self.resolved_path: 130cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton # Don't load a module twice... 131cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 0 132cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton print 'Locating %s %s...' % (self.uuid, self.path), 1338077a5334dc4daef3a145d07307a970d00563055Greg Clayton if os.path.exists(self.dsymForUUIDBinary): 1348077a5334dc4daef3a145d07307a970d00563055Greg Clayton dsym_for_uuid_command = '%s %s' % (self.dsymForUUIDBinary, self.uuid) 1358077a5334dc4daef3a145d07307a970d00563055Greg Clayton s = commands.getoutput(dsym_for_uuid_command) 1368077a5334dc4daef3a145d07307a970d00563055Greg Clayton if s: 1378077a5334dc4daef3a145d07307a970d00563055Greg Clayton plist_root = plistlib.readPlistFromString (s) 1388077a5334dc4daef3a145d07307a970d00563055Greg Clayton if plist_root: 1398077a5334dc4daef3a145d07307a970d00563055Greg Clayton # pp = pprint.PrettyPrinter(indent=4) 1408077a5334dc4daef3a145d07307a970d00563055Greg Clayton # pp.pprint(plist_root) 141cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton plist = plist_root[self.uuid] 142cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if plist: 143cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if 'DBGArchitecture' in plist: 144cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.arch = plist['DBGArchitecture'] 145cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if 'DBGDSYMPath' in plist: 146cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.dsym = os.path.realpath(plist['DBGDSYMPath']) 147cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if 'DBGSymbolRichExecutable' in plist: 148cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.resolved_path = os.path.expanduser (plist['DBGSymbolRichExecutable']) 149cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if not self.resolved_path and os.path.exists(self.path): 150cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton dwarfdump_cmd_output = commands.getoutput('dwarfdump --uuid "%s"' % self.path) 151cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self_uuid = uuid.UUID(self.uuid) 152cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton for line in dwarfdump_cmd_output.splitlines(): 153cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton match = self.dwarfdump_uuid_regex.search (line) 154cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if match: 155cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton dwarf_uuid_str = match.group(1) 156cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton dwarf_uuid = uuid.UUID(dwarf_uuid_str) 157cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self_uuid == dwarf_uuid: 158cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.resolved_path = self.path 159cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.arch = match.group(2) 160cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton break; 161cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if not self.resolved_path: 162cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton print "error: file %s '%s' doesn't match the UUID in the installed file" % (self.uuid, self.path) 163cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 0 164cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if (self.resolved_path and os.path.exists(self.resolved_path)) or (self.path and os.path.exists(self.path)): 165cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton print 'ok' 166cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self.path != self.resolved_path: 167cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton print ' exe = "%s"' % self.resolved_path 168cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton if self.dsym: 169cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton print ' dsym = "%s"' % self.dsym 170cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 1 17101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 172cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 0 17301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 17401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def load_module(self): 17501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.module: 17601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton text_section = self.module.FindSection ("__TEXT") 17701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if text_section: 17801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton error = self.target.SetSectionLoadAddress (text_section, self.text_addr_lo) 17901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if error.Success(): 1808077a5334dc4daef3a145d07307a970d00563055Greg Clayton #print 'Success: loaded %s.__TEXT = 0x%x' % (self.basename(), self.text_addr_lo) 18101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return None 18201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 18301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return 'error: %s' % error.GetCString() 18401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 185cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 'error: unable to find "__TEXT" section in "%s"' % self.get_resolved_path() 18601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 18701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return 'error: invalid module' 18801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 18901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def create_target(self, debugger): 19001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.fetch_symboled_executable_and_dsym (): 191cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton resolved_path = self.get_resolved_path(); 192cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton path_spec = lldb.SBFileSpec (resolved_path) 19301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton #result.PutCString ('plist[%s] = %s' % (uuid, self.plist)) 19401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton error = lldb.SBError() 195cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.target = debugger.CreateTarget (resolved_path, self.arch, None, False, error); 19601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.target: 19701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.module = self.target.FindModule (path_spec) 19801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.module: 19901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton err = self.load_module() 20001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if err: 20101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print err 20201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 20301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return None 20401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 205cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 'error: unable to get module for (%s) "%s"' % (self.arch, resolved_path) 20601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 207cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 'error: unable to create target for (%s) "%s"' % (self.arch, resolved_path) 20801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 20901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def add_target_module(self, target): 21001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if target: 21101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.target = target 21201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.fetch_symboled_executable_and_dsym (): 213cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton resolved_path = self.get_resolved_path(); 214cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton path_spec = lldb.SBFileSpec (resolved_path) 215cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton #print 'target.AddModule (path="%s", arch="%s", uuid=%s)' % (resolved_path, self.arch, self.uuid) 216cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton self.module = target.AddModule (resolved_path, self.arch, self.uuid) 21701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.module: 21801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton err = self.load_module() 21901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if err: 22001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print err; 22101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 22201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return None 22301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 224cd793121caadf8eac0b13283bc2caa4cd467aebfGreg Clayton return 'error: unable to get module for (%s) "%s"' % (self.arch, resolved_path) 22501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 22601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return 'error: invalid target' 22701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 22801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def __init__(self, path): 22901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton """CrashLog constructor that take a path to a darwin crash log file""" 23001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.path = path; 23101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.info_lines = list() 23201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.system_profile = list() 23301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.threads = list() 23401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.images = list() 23501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.idents = list() # A list of the required identifiers for doing all stack backtraces 23601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.crashed_thread_idx = -1 23701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.version = -1 23801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # With possible initial component of ~ or ~user replaced by that user's home directory. 23901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton f = open(os.path.expanduser(self.path)) 24001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.file_lines = f.read().splitlines() 24101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_NORMAL 24201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread = None 24301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for line in self.file_lines: 24401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # print line 24501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line_len = len(line) 24601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if line_len == 0: 24701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if thread: 24801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if parse_mode == PARSE_MODE_THREAD: 24901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if thread.index == self.crashed_thread_idx: 25001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.reason = '' 25101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.thread_exception: 25201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.reason += self.thread_exception 25301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if self.thread_exception_data: 25401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.reason += " (%s)" % self.thread_exception_data 25501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.threads.append(thread) 25601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread = None 25701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 25801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # only append an extra empty line if the previous line 25901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # in the info_lines wasn't empty 26001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if len(self.info_lines) > 0 and len(self.info_lines[-1]): 26101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.info_lines.append(line) 26201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_NORMAL 26301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # print 'PARSE_MODE_NORMAL' 26401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif parse_mode == PARSE_MODE_NORMAL: 26501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if line.startswith ('Process:'): 26601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton (self.process_name, pid_with_brackets) = line[8:].strip().split() 26701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.process_id = pid_with_brackets.strip('[]') 26801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Path:'): 26901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.process_path = line[5:].strip() 27001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Identifier:'): 27101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.process_identifier = line[11:].strip() 27201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Version:'): 27301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton (self.process_version, compatability_version) = line[8:].strip().split() 27401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.process_compatability_version = compatability_version.strip('()') 27501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Parent Process:'): 27601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton (self.parent_process_name, pid_with_brackets) = line[15:].strip().split() 27701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.parent_process_id = pid_with_brackets.strip('[]') 27801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Exception Type:'): 27901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.thread_exception = line[15:].strip() 28001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 28101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Exception Codes:'): 28201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.thread_exception_data = line[16:].strip() 28301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 28401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Crashed Thread:'): 28501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.crashed_thread_idx = int(line[15:].strip().split()[0]) 28601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 28701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Report Version:'): 28801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.version = int(line[15:].strip()) 28901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 29001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('System Profile:'): 29101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_SYSTEM 29201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 29301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif (line.startswith ('Interval Since Last Report:') or 29401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line.startswith ('Crashes Since Last Report:') or 29501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line.startswith ('Per-App Interval Since Last Report:') or 29601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line.startswith ('Per-App Crashes Since Last Report:') or 29701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line.startswith ('Sleep/Wake UUID:') or 29801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line.startswith ('Anonymous UUID:')): 29901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # ignore these 30001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 30101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Thread'): 30201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_state_match = self.thread_state_regex.search (line) 30301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if thread_state_match: 30401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_state_match = self.thread_regex.search (line) 30501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_idx = int(thread_state_match.group(1)) 30601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_THREGS 30701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread = self.threads[thread_idx] 30801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 30901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_match = self.thread_regex.search (line) 31001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if thread_match: 31101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # print 'PARSE_MODE_THREAD' 31201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_THREAD 31301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread_idx = int(thread_match.group(1)) 31401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread = CrashLog.Thread(thread_idx) 31501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 31601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif line.startswith ('Binary Images:'): 31701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parse_mode = PARSE_MODE_IMAGES 31801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 31901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.info_lines.append(line.strip()) 32001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif parse_mode == PARSE_MODE_THREAD: 32101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton frame_match = self.frame_regex.search(line) 32201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if frame_match: 32301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton ident = frame_match.group(2) 32401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if not ident in self.idents: 32501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.idents.append(ident) 32601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.frames.append (CrashLog.Frame(int(frame_match.group(1)), int(frame_match.group(3), 0), frame_match.group(4))) 32701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 3288077a5334dc4daef3a145d07307a970d00563055Greg Clayton print 'error: frame regex failed for line: "%s"' % line 32901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif parse_mode == PARSE_MODE_IMAGES: 33001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match = self.image_regex_uuid.search (line) 33101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if image_match: 33201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image = CrashLog.Image (int(image_match.group(1),0), 33301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton int(image_match.group(2),0), 33401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(3).strip(), 33501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(4).strip(), 33601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(5), 33701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(6)) 33801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.images.append (image) 33901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 34001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match = self.image_regex_no_uuid.search (line) 34101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if image_match: 34201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image = CrashLog.Image (int(image_match.group(1),0), 34301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton int(image_match.group(2),0), 34401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(3).strip(), 34501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(4).strip(), 34601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton None, 34701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_match.group(5)) 34801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.images.append (image) 34901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 35001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "error: image regex failed for: %s" % line 35101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 35201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif parse_mode == PARSE_MODE_THREGS: 35301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton stripped_line = line.strip() 35401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton reg_values = stripped_line.split(' ') 35501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for reg_value in reg_values: 35601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton (reg, value) = reg_value.split(': ') 35701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.registers[reg.strip()] = int(value, 0) 35801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif parse_mode == PARSE_MODE_SYSTEM: 35901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton self.system_profile.append(line) 36001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton f.close() 36101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 36201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def dump(self): 36301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "Crash Log File: %s" % (self.path) 36401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "\nThreads:" 36501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for thread in self.threads: 36601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.dump(' ') 36701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "\nImages:" 36801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for image in self.images: 36901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image.dump(' ') 37001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 37101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton def find_image_with_identifier(self, ident): 37201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for image in self.images: 37301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if image.ident == ident: 37401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return image 37501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton return None 37601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 37701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef disassemble_instructions (target, instructions, pc, insts_before_pc, insts_after_pc): 37801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton lines = list() 37901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton pc_index = -1 38001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton comment_column = 50 38101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for inst_idx, inst in enumerate(instructions): 38201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton inst_pc = inst.GetAddress().GetLoadAddress(target); 38301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if pc == inst_pc: 38401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton pc_index = inst_idx 38501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton mnemonic = inst.GetMnemonic (target) 38601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton operands = inst.GetOperands (target) 38701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton comment = inst.GetComment (target) 38801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton #data = inst.GetData (target) 38901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton lines.append ("%#16.16x: %8s %s" % (inst_pc, mnemonic, operands)) 39001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if comment: 39101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line_len = len(lines[-1]) 39201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if line_len < comment_column: 39301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton lines[-1] += ' ' * (comment_column - line_len) 39401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton lines[-1] += "; %s" % comment 39501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 39601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if pc_index >= 0: 39701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if pc_index >= insts_before_pc: 39801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton start_idx = pc_index - insts_before_pc 39901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 40001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton start_idx = 0 40101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton end_idx = pc_index + insts_after_pc 40201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if end_idx > inst_idx: 40301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton end_idx = inst_idx 40401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for i in range(start_idx, end_idx+1): 40501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if i == pc_index: 40601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print ' -> ', lines[i] 40701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 40801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print ' ', lines[i] 40901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 41001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef print_module_section_data (section): 41101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print section 41201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton section_data = section.GetSectionData() 41301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if section_data: 41401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton ostream = lldb.SBStream() 41501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton section_data.GetDescription (ostream, section.GetFileAddress()) 41601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print ostream.GetData() 41701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 41801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef print_module_section (section, depth): 41901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print section 42001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 42101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if depth > 0: 42201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton num_sub_sections = section.GetNumSubSections() 42301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for sect_idx in range(num_sub_sections): 42401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print_module_section (section.GetSubSectionAtIndex(sect_idx), depth - 1) 42501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 42601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef print_module_sections (module, depth): 42701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for sect in module.section_iter(): 42801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print_module_section (sect, depth) 42901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 43001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef print_module_symbols (module): 43101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for sym in module: 43201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print sym 43301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 43401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef usage(): 43501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "Usage: lldb-symbolicate.py [-n name] executable-image" 43601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton sys.exit(0) 43701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 43801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef Symbolicate(debugger, command, result, dict): 43901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton SymbolicateCrashLog (command.split()) 44001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 44101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytondef SymbolicateCrashLog(command_args): 44201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 44301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser = optparse.OptionParser(description='A script that parses skinny and universal mach-o files.') 44401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--arch', type='string', metavar='arch', dest='triple', help='specify one architecture or target triple') 44501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--platform', type='string', metavar='platform', dest='platform', help='specify one platform by name') 44601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--verbose', action='store_true', dest='verbose', help='display verbose debug info', default=False) 44701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--interactive', action='store_true', dest='interactive', help='enable interactive mode', default=False) 44801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--no-images', action='store_false', dest='show_images', help='don\'t show images in stack frames', default=True) 44901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--no-dependents', action='store_false', dest='dependents', help='skip loading dependent modules', default=True) 45001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--sections', action='store_true', dest='dump_sections', help='show module sections', default=False) 45101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--symbols', action='store_true', dest='dump_symbols', help='show module symbols', default=False) 45201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--image-list', action='store_true', dest='dump_image_list', help='show image list', default=False) 45301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--debug-delay', type='int', dest='debug_delay', metavar='NSEC', help='pause for NSEC seconds for debugger', default=0) 45401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--section-depth', type='int', dest='section_depth', help='set the section depth to use when showing sections', default=0) 45501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--section-data', type='string', action='append', dest='sect_data_names', help='specify sections by name to display data for') 45601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--address', type='int', action='append', dest='addresses', help='specify addresses to lookup') 45701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--crash-log', type='string', action='append', dest='crash_log_files', help='specify crash log files to symbolicate') 45801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parser.add_option('--crashed-only', action='store_true', dest='crashed_only', help='only show the crashed thread', default=False) 45901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton loaded_addresses = False 46001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton (options, args) = parser.parse_args(command_args) 46101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.verbose: 46201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 'options', options 46301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 46401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.debug_delay > 0: 46501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "Waiting %u seconds for debugger to attach..." % options.debug_delay 46601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton time.sleep(options.debug_delay) 46701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 46801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Create a new debugger instance 46901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton debugger = lldb.SBDebugger.Create() 47001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 47101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton error = lldb.SBError() 47201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 47301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 47401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.crash_log_files: 47501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton options.dependents = False 47601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for crash_log_file in options.crash_log_files: 47701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton crash_log = CrashLog(crash_log_file) 4788077a5334dc4daef3a145d07307a970d00563055Greg Clayton if options.verbose: 4798077a5334dc4daef3a145d07307a970d00563055Greg Clayton crash_log.dump() 48001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if crash_log.images: 48101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton err = crash_log.images[0].create_target (debugger) 48201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if err: 48301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print err 48401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 48501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton target = crash_log.images[0].target 48601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton exe_module = target.GetModuleAtIndex(0) 48701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_paths = list() 48801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # for i in range (1, len(crash_log.images)): 48901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # image = crash_log.images[i] 49001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for ident in crash_log.idents: 49101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image = crash_log.find_image_with_identifier (ident) 49201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if image: 49301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if image.path in image_paths: 49401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "warning: skipping %s loaded at %#16.16x duplicate entry (probably commpage)" % (image.path, image.text_addr_lo) 49501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 49601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton err = image.add_target_module (target) 49701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if err: 49801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print err 49901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 50001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton image_paths.append(image.path) 50101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 50201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 'error: can\'t find image for identifier "%s"' % ident 50301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 50401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for line in crash_log.info_lines: 50501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print line 50601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 50701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Reconstruct inlined frames for all threads for anything that has debug info 50801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for thread in crash_log.threads: 50901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.crashed_only and thread.did_crash() == False: 51001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 51101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # start a new frame list that we will fixup for each thread 51201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_thread_frames = list() 51301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Iterate through all concrete frames for a thread and resolve 51401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # any parent frames of inlined functions 51501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for frame_idx, frame in enumerate(thread.frames): 51601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Resolve the frame's pc into a section + offset address 'pc_addr' 51701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton pc_addr = target.ResolveLoadAddress (frame.pc) 51801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Check to see if we were able to resolve the address 51901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if pc_addr: 52001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # We were able to resolve the frame's PC into a section offset 52101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # address. 52201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 52301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Resolve the frame's PC value into a symbol context. A symbol 52401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # context can resolve a module, compile unit, function, block, 52501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # line table entry and/or symbol. If the frame has a block, then 52601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # we can look for inlined frames, which are represented by blocks 52701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # that have inlined information in them 52801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton frame.sym_ctx = target.ResolveSymbolContextForAddress (pc_addr, lldb.eSymbolContextEverything); 52901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 53001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # dump if the verbose option was specified 53101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.verbose: 53201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "frame.pc = %#16.16x (file_addr = %#16.16x)" % (frame.pc, pc_addr.GetFileAddress()) 53301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "frame.pc_addr = ", pc_addr 53401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "frame.sym_ctx = " 53501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print frame.sym_ctx 53601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 53701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 53801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Append the frame we already had from the crash log to the new 53901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # frames list 54001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_thread_frames.append(frame) 54101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 54201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_frame = CrashLog.Frame (frame.index, -1, None) 54301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 54401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Try and use the current frame's symbol context to calculate a 54501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # parent frame for an inlined function. If the curent frame is 54601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # inlined, it will return a valid symbol context for the parent 54701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # frame of the current inlined function 54801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton parent_pc_addr = lldb.SBAddress() 54901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_frame.sym_ctx = frame.sym_ctx.GetParentOfInlinedScope (pc_addr, parent_pc_addr) 55001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 55101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # See if we were able to reconstruct anything? 55201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton while new_frame.sym_ctx: 55301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # We have a parent frame of an inlined frame, create a new frame 55401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Convert the section + offset 'parent_pc_addr' to a load address 55501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_frame.pc = parent_pc_addr.GetLoadAddress(target) 55601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # push the new frame onto the new frame stack 55701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_thread_frames.append (new_frame) 55801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # dump if the verbose option was specified 55901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.verbose: 56001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "new_frame.pc = %#16.16x (%s)" % (new_frame.pc, parent_pc_addr) 56101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "new_frame.sym_ctx = " 56201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print new_frame.sym_ctx 56301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 56401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Create another new frame in case we have multiple inlined frames 56501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton prev_new_frame = new_frame 56601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_frame = CrashLog.Frame (frame.index, -1, None) 56701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Swap the addresses so we can try another inlined lookup 56801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton pc_addr = parent_pc_addr; 56901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton new_frame.sym_ctx = prev_new_frame.sym_ctx.GetParentOfInlinedScope (pc_addr, parent_pc_addr) 57001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Replace our thread frames with our new list that includes parent 57101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # frames for inlined functions 57201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton thread.frames = new_thread_frames 57301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Now iterate through all threads and display our richer stack backtraces 57401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for thread in crash_log.threads: 57501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton this_thread_crashed = thread.did_crash() 57601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.crashed_only and this_thread_crashed == False: 57701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton continue 57801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "%s" % thread 57901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton prev_frame_index = -1 58001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for frame_idx, frame in enumerate(thread.frames): 58101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details = ' %s' % frame.details 58201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton module = frame.sym_ctx.GetModule() 58301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton instructions = None 58401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if module: 58501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton module_basename = module.GetFileSpec().GetFilename(); 58601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_start_load_addr = -1 58701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_name = None 58801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function = frame.sym_ctx.GetFunction() 58901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton block = frame.sym_ctx.GetBlock() 59001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton line_entry = frame.sym_ctx.GetLineEntry() 59101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton symbol = frame.sym_ctx.GetSymbol() 59201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton inlined_block = block.GetContainingInlinedBlock(); 59301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if inlined_block: 59401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_name = inlined_block.GetInlinedName(); 59501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton block_range_idx = inlined_block.GetRangeIndexForBlockAddress (target.ResolveLoadAddress (frame.pc)) 59601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if block_range_idx < lldb.UINT32_MAX: 59701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton block_range_start_addr = inlined_block.GetRangeStartAddress (block_range_idx) 59801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_start_load_addr = block_range_start_addr.GetLoadAddress (target) 59901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 60001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_start_load_addr = frame.pc 60101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if this_thread_crashed and frame_idx == 0: 60201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton instructions = function.GetInstructions(target) 60301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif function: 60401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_name = function.GetName() 60501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_start_load_addr = function.GetStartAddress().GetLoadAddress (target) 60601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if this_thread_crashed and frame_idx == 0: 60701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton instructions = function.GetInstructions(target) 60801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif symbol: 60901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_name = symbol.GetName() 61001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_start_load_addr = symbol.GetStartAddress().GetLoadAddress (target) 61101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if this_thread_crashed and frame_idx == 0: 61201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton instructions = symbol.GetInstructions(target) 61301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 61401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if function_name: 61501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Print the function or symbol name and annotate if it was inlined 61601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton inline_suffix = '' 61701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if inlined_block: 61801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton inline_suffix = '[inlined] ' 61901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 62001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton inline_suffix = ' ' 62101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.show_images: 62201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details = "%s%s`%s" % (inline_suffix, module_basename, function_name) 62301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton else: 62401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details = "%s" % (function_name) 62501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Dump the offset from the current function or symbol if it is non zero 62601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton function_offset = frame.pc - function_start_load_addr 62701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if function_offset > 0: 62801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details += " + %u" % (function_offset) 62901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton elif function_offset < 0: 63001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton defaults += " %i (invalid negative offset, file a bug) " % function_offset 63101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Print out any line information if any is available 63201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if line_entry.GetFileSpec(): 63301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details += ' at %s' % line_entry.GetFileSpec().GetFilename() 63401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details += ':%u' % line_entry.GetLine () 63501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton column = line_entry.GetColumn() 63601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if column > 0: 63701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton details += ':%u' % column 63801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 63901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 64001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # Only print out the concrete frame index if it changes. 64101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # if prev_frame_index != frame.index: 64201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # print "[%2u] %#16.16x %s" % (frame.index, frame.pc, details) 64301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # else: 64401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton # print " %#16.16x %s" % (frame.pc, details) 64501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "[%2u] %#16.16x %s" % (frame.index, frame.pc, details) 64601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton prev_frame_index = frame.index 64701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if instructions: 64801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 64901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton disassemble_instructions (target, instructions, frame.pc, 4, 4) 65001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 65101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 65201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print 65301f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 65401f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton if options.dump_image_list: 65501f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print "Binary Images:" 65601f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton for image in crash_log.images: 65701f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton print image 65801f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 65901f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 66001f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Claytonif __name__ == '__main__': 66101f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton SymbolicateCrashLog (args) 66201f7c96144d4604d1d120fb27643f9a29d6d1ba7Greg Clayton 663