From 51b1d858d3ed532e99a1cf6883ab2eb99c386513 Mon Sep 17 00:00:00 2001 From: Dan Liew Date: Wed, 31 Jul 2019 00:59:10 +0000 Subject: [PATCH] [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 --- compiler-rt/lib/asan/scripts/asan_symbolize.py | 36 +++++++++++++++++++------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/compiler-rt/lib/asan/scripts/asan_symbolize.py b/compiler-rt/lib/asan/scripts/asan_symbolize.py index 37defae..3d81fb9 100755 --- a/compiler-rt/lib/asan/scripts/asan_symbolize.py +++ b/compiler-rt/lib/asan/scripts/asan_symbolize.py @@ -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', -- 2.7.4