diff options
Diffstat (limited to 'buildscripts/mongosymb.py')
-rwxr-xr-x | buildscripts/mongosymb.py | 73 |
1 files changed, 42 insertions, 31 deletions
diff --git a/buildscripts/mongosymb.py b/buildscripts/mongosymb.py index e09806665d3..1cb9c8ede64 100755 --- a/buildscripts/mongosymb.py +++ b/buildscripts/mongosymb.py @@ -18,7 +18,7 @@ but emits json instead of plain text. """ import json -import optparse +import argparse import os import subprocess import sys @@ -78,7 +78,7 @@ def symbolize_frames(trace_doc, dbg_path_resolver, symbolizer_path, dsym_hint, i symbolizer_args = [symbolizer_path] for dh in dsym_hint: - symbolizer_args.append("-dsym-hint=%s" % dh) + symbolizer_args.append("-dsym-hint={}".format(dh)) symbolizer_process = subprocess.Popen(args=symbolizer_args, close_fds=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=open("/dev/null")) @@ -156,7 +156,8 @@ class S3BuildidDbgFileResolver(object): self._get_from_s3(build_id) except Exception: # pylint: disable=broad-except ex = sys.exc_info()[0] - sys.stderr.write("Failed to find debug symbols for %s in s3: %s\n" % (build_id, ex)) + sys.stderr.write("Failed to find debug symbols for {} in s3: {}\n".format( + build_id, ex)) return None if not os.path.exists(build_id_path): return None @@ -165,8 +166,7 @@ class S3BuildidDbgFileResolver(object): def _get_from_s3(self, build_id): """Download debug symbols from S3.""" subprocess.check_call( - ['wget', - 'https://s3.amazonaws.com/%s/%s.debug.gz' % (self._s3_bucket, build_id)], + ['wget', 'https://s3.amazonaws.com/{}/{}.debug.gz'.format(self._s3_bucket, build_id)], cwd=self._cache_dir) subprocess.check_call(['gunzip', build_id + ".debug.gz"], cwd=self._cache_dir) @@ -177,32 +177,32 @@ def classic_output(frames, outfile, **kwargs): # pylint: disable=unused-argumen symbinfo = frame["symbinfo"] if symbinfo: for sframe in symbinfo: - outfile.write(" %(file)s:%(line)s:%(column)s: %(fn)s\n" % sframe) + outfile.write(" {file:s}:{line:d}:{column:d}: {fn:s}\n".format(**sframe)) else: - outfile.write(" %(path)s!!!\n" % symbinfo) - - -def main(argv): + outfile.write(" {path:s}!!!\n".format(**symbinfo)) + + +def make_argument_parser(**kwargs): + """Make and return an argparse.""" + parser = argparse.ArgumentParser(**kwargs) + parser.add_argument('--dsym-hint', default=[], action='append') + parser.add_argument('--symbolizer-path', default='') + parser.add_argument('--input-format', choices=['classic', 'thin'], default='classic') + parser.add_argument('--output-format', choices=['classic', 'json'], default='classic', + help='"json" shows some extra information') + parser.add_argument('--debug-file-resolver', choices=['path', 's3'], default='path') + s3_group = parser.add_argument_group( + "s3 options", description='Options used with \'--debug-file-resolver s3\'') + s3_group.add_argument('--s3-cache-dir') + s3_group.add_argument('--s3-bucket') + parser.add_argument('path_to_executable') + return parser + + +def main(): """Execute Main program.""" - parser = optparse.OptionParser() - parser.add_option("--dsym-hint", action="append", dest="dsym_hint", default=list()) - parser.add_option("--symbolizer-path", dest="symbolizer_path", default=str()) - parser.add_option("--debug-file-resolver", dest="debug_file_resolver", default="path") - parser.add_option("--input-format", dest="input_format", default="classic") - parser.add_option("--output-format", dest="output_format", default="classic") - (options, args) = parser.parse_args(argv) - resolver_constructor = dict(path=PathDbgFileResolver, s3=S3BuildidDbgFileResolver).get( - options.debug_file_resolver, None) - if resolver_constructor is None: - sys.stderr.write("Invalid debug-file-resolver argument: %s\n" % options.debug_file_resolver) - sys.exit(1) - - output_fn = dict(json=json.dump, classic=classic_output).get(options.output_format, None) - if output_fn is None: - sys.stderr.write("Invalid output-format argument: %s\n" % options.output_format) - sys.exit(1) - - unnamed_args = args[1:] + + options = make_argument_parser(description=__doc__).parse_args() # Skip over everything before the first '{' since it is likely to be log line prefixes. # Additionally, using raw_decode() to ignore extra data after the closing '}' to allow maximal @@ -211,11 +211,22 @@ def main(argv): trace_doc = trace_doc[trace_doc.find('{'):] trace_doc = json.JSONDecoder().raw_decode(trace_doc)[0] - resolver = resolver_constructor(*unnamed_args) + output_fn = None + if options.output_format == 'json': + output_fn = json.dump + if options.output_format == 'classic': + output_fn = classic_output + + resolver = None + if options.debug_file_resolver == 'path': + resolver = PathDbgFileResolver(options.path_to_executable) + elif options.debug_file_resolver == 's3': + resolver = S3BuildidDbgFileResolver(options.s3_cache_dir, options.s3_bucket) + frames = symbolize_frames(trace_doc, resolver, **vars(options)) output_fn(frames, sys.stdout, indent=2) if __name__ == '__main__': - main(sys.argv) + main() sys.exit(0) |