Skip to content

Instantly share code, notes, and snippets.

@luser
Last active June 11, 2021 10:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save luser/2ad32d290f224782fcfc to your computer and use it in GitHub Desktop.
Save luser/2ad32d290f224782fcfc to your computer and use it in GitHub Desktop.
Scripts to produce symbol package and upload to Mozilla crash-stats server
#!/usr/bin/env python
from __future__ 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()
#!/usr/bin/env python
import requests
import sys
url = 'https://crash-stats.mozilla.com/symbols/upload'
def main():
if len(sys.argv) != 3:
print 'Usage: uploadsymbols.py <zip file> <auth token>'
return 1
r = requests.post(
url,
files={'symbols.zip': open(sys.argv[1], 'rb')},
headers={'Auth-Token': sys.argv[2]},
allow_redirects=False
)
if r.status_code >= 200 and r.status_code < 300:
print 'Uploaded successfully!'
elif r.status_code < 400:
print 'Error: bad auth token? (%d)' % r.status_code
else:
print 'Error: %d' % r.status_code
print r.text
return 0
if __name__ == '__main__':
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment