[asan_symbolize] Add `--skip-uuid-validation` option to `ModuleMapPlugIn`.

This option disables the validation of binary UUIDs. This is useful
in environments where the `otool` binary is not available.

rdar://problem/49476995

llvm-svn: 367379
This commit is contained in:
Dan Liew 2019-07-31 00:59:10 +00:00
parent 23fd828d4e
commit 51b1d858d3
1 changed files with 26 additions and 10 deletions

View File

@ -790,7 +790,7 @@ class ModuleMap(object):
def modules(self):
return set(self._module_name_to_description_map.values())
def get_module_path_for_symbolication(self, module_name, proxy):
def get_module_path_for_symbolication(self, module_name, proxy, validate_uuid):
module_desc = self.find_module_by_name(module_name)
if module_desc is None:
return None
@ -799,15 +799,19 @@ class ModuleMap(object):
module_desc = proxy.filter_module_desc(module_desc)
if module_desc is None:
return None
try:
uuid = get_uuid_from_binary(module_desc.module_path_for_symbolization, arch = module_desc.arch)
if uuid != module_desc.uuid:
logging.warning("Detected UUID mismatch {} != {}".format(uuid, module_desc.uuid))
# UUIDs don't match. Tell client to not symbolize this.
if validate_uuid:
logging.debug('Validating UUID of {}'.format(module_desc.module_path_for_symbolization))
try:
uuid = get_uuid_from_binary(module_desc.module_path_for_symbolization, arch = module_desc.arch)
if uuid != module_desc.uuid:
logging.warning("Detected UUID mismatch {} != {}".format(uuid, module_desc.uuid))
# UUIDs don't match. Tell client to not symbolize this.
return None
except GetUUIDFromBinaryException as e:
logging.error('Failed to get binary from UUID: %s', str(e))
return None
except GetUUIDFromBinaryException as e:
logging.error('Failed to binary from UUID: %s', str(e))
return None
else:
logging.warning('Skipping validation of UUID of {}'.format(module_desc.module_path_for_symbolization))
return module_desc.module_path_for_symbolization
@staticmethod
@ -890,10 +894,16 @@ class SysRootFilterPlugIn(AsanSymbolizerPlugIn):
class ModuleMapPlugIn(AsanSymbolizerPlugIn):
def __init__(self):
self._module_map = None
self._uuid_validation = True
def register_cmdline_args(self, parser):
parser.add_argument('--module-map',
help='Path to text file containing module map'
'output. See print_module_map ASan option.')
parser.add_argument('--skip-uuid-validation',
default=False,
action='store_true',
help='Skips validating UUID of modules using otool.')
def process_cmdline_args(self, pargs):
if not pargs.module_map:
return False
@ -902,7 +912,9 @@ class ModuleMapPlugIn(AsanSymbolizerPlugIn):
msg = 'Failed to find module map'
logging.error(msg)
raise Exception(msg)
self._uuid_validation = not pargs.skip_uuid_validation
return True
def filter_binary_path(self, binary_path):
if os.path.isabs(binary_path):
# This is a binary path so transform into
@ -910,7 +922,11 @@ class ModuleMapPlugIn(AsanSymbolizerPlugIn):
module_name = os.path.basename(binary_path)
else:
module_name = binary_path
return self._module_map.get_module_path_for_symbolication(module_name, self.proxy)
return self._module_map.get_module_path_for_symbolication(
module_name,
self.proxy,
self._uuid_validation
)
def add_logging_args(parser):
parser.add_argument('--log-dest',