#!/usr/bin/env python # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import argparse import os import subprocess import sys import zipfile class ProcError(Exception): def __init__(self, returncode, stderr): self.returncode = returncode self.stderr = stderr def check_output(command): proc = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True ) stdout, stderr = proc.communicate() if proc.returncode != 0: raise ProcError(proc.returncode, stderr) return stdout def process_file(dump_syms, path): try: stdout = check_output([dump_syms, path]) except ProcError as e: print('Error: running "%s %s": %s' % (dump_syms, path, e.stderr)) return None, None, None bits = stdout.splitlines()[0].split(" ", 4) if len(bits) != 5: return None, None, None _, platform, cpu_arch, debug_id, debug_file = bits if debug_file.lower().endswith(".pdb"): sym_file = debug_file[:-4] + ".sym" else: sym_file = debug_file + ".sym" filename = os.path.join(debug_file, debug_id, sym_file) debug_filename = os.path.join(debug_file, debug_id, debug_file) return filename, stdout, debug_filename def main(): parser = argparse.ArgumentParser() parser.add_argument("dump_syms", help="Path to dump_syms binary") parser.add_argument("files", nargs="+", help="Path to files to dump symbols from") parser.add_argument( "--symbol-zip", default="symbols.zip", help="Name of zip file to put dumped symbols in", ) parser.add_argument( "--no-binaries", action="store_true", default=False, help="Don't store binaries in zip file", ) args = parser.parse_args() count = 0 with zipfile.ZipFile(args.symbol_zip, "w", zipfile.ZIP_DEFLATED) as zf: for f in args.files: filename, contents, debug_filename = process_file(args.dump_syms, f) if not (filename and contents): print("Error dumping symbols") sys.exit(1) zf.writestr(filename, contents) count += 1 if not args.no_binaries: zf.write(f, debug_filename) count += 1 print("Added %d files to %s" % (count, args.symbol_zip)) if __name__ == "__main__": main()