Skip to content

Commit

Permalink
Make crashlog.py work when a .dSYM is present, but a binary is missing
Browse files Browse the repository at this point in the history
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

llvm-svn: 349366
  • Loading branch information
adrian-prantl committed Dec 17, 2018
1 parent 256a16d commit fb5aa93
Showing 1 changed file with 37 additions and 15 deletions.
52 changes: 37 additions & 15 deletions lldb/examples/python/crashlog.py
Expand Up @@ -246,6 +246,25 @@ def __init__(
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:
Expand Down Expand Up @@ -277,22 +296,25 @@ def locate_module_and_debug_symbols(self):
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'
Expand Down

0 comments on commit fb5aa93

Please sign in to comment.