diff options
author | Adrian Prantl <aprantl@apple.com> | 2018-12-17 17:25:57 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2018-12-17 17:25:57 +0000 |
commit | 07a262c5472df913ffe137be7e7fe8c477375123 (patch) | |
tree | e7da339e82f5083d7580f80d87203086bcbf6704 /lldb/examples | |
parent | 6d8d5ed352a8c5d0e02c178ff05ae337e1128c92 (diff) |
Make crashlog.py work when a .dSYM is present, but a binary is missing
Often users have a crash log an d a .dSYM bundle, but not the original
application binary. It turns out that for crash symbolication, we can
safely fall back to using the binary inside the .dSYM bundle.
Differential Revision: https://reviews.llvm.org/D55607
Diffstat (limited to 'lldb/examples')
-rwxr-xr-x | lldb/examples/python/crashlog.py | 52 |
1 files changed, 37 insertions, 15 deletions
diff --git a/lldb/examples/python/crashlog.py b/lldb/examples/python/crashlog.py index 227fce11405..09f22be60d4 100755 --- a/lldb/examples/python/crashlog.py +++ b/lldb/examples/python/crashlog.py @@ -246,6 +246,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 +296,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' |