stack.py: Fixing --symbols-zip argument Bug: 1284954 Change-Id: I2043f5609356c068e7d0deb945828a0b5b9e1b7e Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3812375 Reviewed-by: Mohamed Heikal <mheikal@chromium.org> Commit-Queue: Sam Maier <smaier@chromium.org> Cr-Commit-Position: refs/heads/main@{#1032103} NOKEYCHECK=True GitOrigin-RevId: 5c6cdcd5494e3a60fffa67ffd873c156385f32c9
diff --git a/development/scripts/stack.py b/development/scripts/stack.py index 53664b1..276bf1b 100755 --- a/development/scripts/stack.py +++ b/development/scripts/stack.py
@@ -28,6 +28,7 @@ import subprocess import symbol import sys +import zipfile sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir, @@ -102,6 +103,7 @@ print(" symbolization") sys.exit(1) + def UnzipSymbols(symbolfile, symdir=None): """Unzips a file to DEFAULT_SYMROOT and returns the unzipped location. @@ -123,33 +125,28 @@ os.makedirs(symdir) logging.info('extracting %s...', symbolfile) - saveddir = os.getcwd() - os.chdir(symdir) - try: - unzipcode = subprocess.call(["unzip", "-qq", "-o", symbolfile]) - if unzipcode > 0: - os.remove(symbolfile) - raise SymbolDownloadException("failed to extract symbol files (%s)." - % symbolfile) - finally: - os.chdir(saveddir) + with zipfile.ZipFile(symbolfile, 'r') as zip_ref: + zip_ref.extractall(symdir) - android_symbols = glob.glob("%s/out/target/product/*/symbols" % symdir) - if android_symbols: - return (symdir, android_symbols[0]) - - # This is a zip of Chrome symbols, so symbol.CHROME_SYMBOLS_DIR needs to be - # updated to point here. - symbol.CHROME_SYMBOLS_DIR = symdir - return (symdir, symdir) + return symdir def main(argv, test_symbolizer=None): try: options, arguments = getopt.getopt(argv, "p", [ - "pass-through", "more-info", "less-info", "chrome-symbols-dir=", - "output-directory=", "apks-directory=", "symbols-dir=", "symbols-zip=", - "arch=", "fallback-so-file=", "verbose", "quiet", "help", + "pass-through", + "more-info", + "less-info", + "chrome-symbols-dir=", + "output-directory=", + "apks-directory=", + "symbols-dir=", + "symbols-zip=", + "arch=", + "fallback-so-file=", + "verbose", + "quiet", + "help", ]) except getopt.GetoptError: PrintUsage() @@ -195,6 +192,15 @@ if len(arguments) > 1: PrintUsage() + rootdir = None + if zip_arg: + rootdir = UnzipSymbols(zip_arg) + for subdir, dirs, _ in os.walk(rootdir): + if 'lib.unstripped' in dirs: + unzipped_output_dir = subdir + break + constants.SetOutputDirectory(unzipped_output_dir) + logging.basicConfig(level=log_level) # Do an up-front test that the output directory is known. if not symbol.CHROME_SYMBOLS_DIR: @@ -203,12 +209,8 @@ logging.info('Reading Android symbols from: %s', os.path.normpath(symbol.SYMBOLS_DIR)) chrome_search_path = symbol.GetLibrarySearchPaths() - logging.info('Searching for Chrome symbols from within: %s', - ':'.join((os.path.normpath(d) for d in chrome_search_path))) - - rootdir = None - if zip_arg: - rootdir, symbol.SYMBOLS_DIR = UnzipSymbols(zip_arg) + logging.info('Searching for Chrome symbols from within: %s', ':'.join( + (os.path.normpath(d) for d in chrome_search_path))) if not arguments or arguments[0] == '-': logging.info('Reading native crash info from stdin (symbolization starts ' @@ -235,11 +237,11 @@ load_vaddrs = {} with llvm_symbolizer.LLVMSymbolizer() as symbolizer: - logging.info('Searching for Chrome symbols from within: %s', - ':'.join((os.path.normpath(d) for d in chrome_search_path))) - stack_core.ConvertTrace(lines, load_vaddrs, more_info, - fallback_so_file, arch_defined, - test_symbolizer or symbolizer, apks_directory) + logging.info('Searching for Chrome symbols from within: %s', ':'.join( + (os.path.normpath(d) for d in chrome_search_path))) + stack_core.ConvertTrace(lines, load_vaddrs, more_info, fallback_so_file, + arch_defined, test_symbolizer or symbolizer, + apks_directory) if rootdir: # be a good citizen and clean up...os.rmdir and os.removedirs() don't work @@ -249,6 +251,7 @@ return 0 + if __name__ == "__main__": sys.exit(main(sys.argv[1:]))