summaryrefslogtreecommitdiff
path: root/lldb/examples
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2018-12-17 17:25:57 +0000
committerAdrian Prantl <aprantl@apple.com>2018-12-17 17:25:57 +0000
commit07a262c5472df913ffe137be7e7fe8c477375123 (patch)
treee7da339e82f5083d7580f80d87203086bcbf6704 /lldb/examples
parent6d8d5ed352a8c5d0e02c178ff05ae337e1128c92 (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-xlldb/examples/python/crashlog.py52
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'