зеркало из https://github.com/mozilla/gecko-dev.git
82 строки
2.5 KiB
Python
82 строки
2.5 KiB
Python
#!/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/.
|
|
|
|
|
|
from __future__ import absolute_import, print_function
|
|
|
|
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)
|
|
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()
|