diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:06:29 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:06:29 +0000 |
commit | 94994d372d014ce4c8758b9605d63fae651bd8aa (patch) | |
tree | 51c0b708bd59f205d6b35cb2a8c24d62f0c33d77 /examples/python/crashlog.py | |
parent | 39be7ce23363d12ae3e49aeb1fdb2bfeb892e836 (diff) |
Notes
Diffstat (limited to 'examples/python/crashlog.py')
-rwxr-xr-x | examples/python/crashlog.py | 83 |
1 files changed, 47 insertions, 36 deletions
diff --git a/examples/python/crashlog.py b/examples/python/crashlog.py index 227fce114052..7eb86db7ce09 100755 --- a/examples/python/crashlog.py +++ b/examples/python/crashlog.py @@ -94,11 +94,9 @@ class CrashLog(symbolication.Symbolicator): thread_regex = re.compile('^Thread ([0-9]+)([^:]*):(.*)') app_backtrace_regex = re.compile( '^Application Specific Backtrace ([0-9]+)([^:]*):(.*)') - frame_regex = re.compile('^([0-9]+)\s+([^ ]+)\s+(0x[0-9a-fA-F]+) +(.*)') + frame_regex = re.compile('^([0-9]+)\s+(.+?)\s+(0x[0-9a-fA-F]{7}[0-9a-fA-F]+) +(.*)') image_regex_uuid = re.compile( - '(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^<]+)<([-0-9a-fA-F]+)> (.*)') - image_regex_no_uuid = re.compile( - '(0x[0-9a-fA-F]+)[- ]+(0x[0-9a-fA-F]+) +[+]?([^ ]+) +([^/]+)/(.*)') + '(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: @@ -246,6 +244,25 @@ class CrashLog(symbolication.Symbolicator): self.identifier = identifier self.version = version + def find_matching_slice(self): + dwarfdump_cmd_output = commands.getoutput( + 'dwarfdump --uuid "%s"' % self.path) + self_uuid = self.get_uuid() + for line in dwarfdump_cmd_output.splitlines(): + match = self.dwarfdump_uuid_regex.search(line) + if match: + dwarf_uuid_str = match.group(1) + dwarf_uuid = uuid.UUID(dwarf_uuid_str) + if self_uuid == dwarf_uuid: + self.resolved_path = self.path + self.arch = match.group(2) + return True + if not self.resolved_path: + self.unavailable = True + print("error\n error: unable to locate '%s' with UUID %s" + % (self.path, uuid_str)) + return False + def locate_module_and_debug_symbols(self): # Don't load a module twice... if self.resolved: @@ -277,22 +294,25 @@ class CrashLog(symbolication.Symbolicator): plist['DBGSymbolRichExecutable']) self.resolved_path = self.path if not self.resolved_path and os.path.exists(self.path): - dwarfdump_cmd_output = commands.getoutput( - 'dwarfdump --uuid "%s"' % self.path) - self_uuid = self.get_uuid() - for line in dwarfdump_cmd_output.splitlines(): - match = self.dwarfdump_uuid_regex.search(line) - if match: - dwarf_uuid_str = match.group(1) - dwarf_uuid = uuid.UUID(dwarf_uuid_str) - if self_uuid == dwarf_uuid: - self.resolved_path = self.path - self.arch = match.group(2) - break - if not self.resolved_path: - self.unavailable = True - print "error\n error: unable to locate '%s' with UUID %s" % (self.path, uuid_str) + if not self.find_matching_slice(): return False + if not self.resolved_path and not os.path.exists(self.path): + try: + import subprocess + dsym = subprocess.check_output( + ["/usr/bin/mdfind", + "com_apple_xcode_dsym_uuids == %s"%uuid_str])[:-1] + if dsym and os.path.exists(dsym): + print('falling back to binary inside "%s"'%dsym) + self.symfile = dsym + dwarf_dir = os.path.join(dsym, 'Contents/Resources/DWARF') + for filename in os.listdir(dwarf_dir): + self.path = os.path.join(dwarf_dir, filename) + if not self.find_matching_slice(): + return False + break + except: + pass if (self.resolved_path and os.path.exists(self.resolved_path)) or ( self.path and os.path.exists(self.path)): print 'ok' @@ -455,25 +475,16 @@ class CrashLog(symbolication.Symbolicator): elif parse_mode == PARSE_MODE_IMAGES: image_match = self.image_regex_uuid.search(line) if image_match: - image = CrashLog.DarwinImage(int(image_match.group(1), 0), - int(image_match.group(2), 0), - image_match.group(3).strip(), - image_match.group(4).strip(), - uuid.UUID(image_match.group(5)), - image_match.group(6)) + (img_lo, img_hi, img_name, img_version, + _, img_uuid, img_path) = image_match.groups() + image = CrashLog.DarwinImage(int(img_lo, 0), int(img_hi, 0), + img_name.strip(), + img_version.strip() + if img_version else "", + uuid.UUID(img_uuid), img_path) self.images.append(image) else: - image_match = self.image_regex_no_uuid.search(line) - if image_match: - image = CrashLog.DarwinImage(int(image_match.group(1), 0), - int(image_match.group(2), 0), - image_match.group(3).strip(), - image_match.group(4).strip(), - None, - image_match.group(5)) - 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() |