aboutsummaryrefslogtreecommitdiff
path: root/llvm_tools/bisect_clang_crashes.py
diff options
context:
space:
mode:
Diffstat (limited to 'llvm_tools/bisect_clang_crashes.py')
-rwxr-xr-xllvm_tools/bisect_clang_crashes.py157
1 files changed, 0 insertions, 157 deletions
diff --git a/llvm_tools/bisect_clang_crashes.py b/llvm_tools/bisect_clang_crashes.py
deleted file mode 100755
index b2759051..00000000
--- a/llvm_tools/bisect_clang_crashes.py
+++ /dev/null
@@ -1,157 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-# Copyright 2020 The ChromiumOS Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Fetches and submits the artifacts from ChromeOS toolchain's crash bucket.
-"""
-
-import argparse
-import glob
-import json
-import logging
-import os
-import os.path
-import shutil
-import subprocess
-import sys
-
-import chroot
-
-
-def get_artifacts(pattern):
- results = subprocess.check_output(
- ["gsutil.py", "ls", pattern], stderr=subprocess.STDOUT, encoding="utf-8"
- )
- return sorted(l.strip() for l in results.splitlines())
-
-
-def get_crash_reproducers(working_dir):
- results = []
- for src in [
- f
- for f in glob.glob("%s/*.c*" % working_dir)
- if f.split(".")[-1] in ["c", "cc", "cpp"]
- ]:
- script = ".".join(src.split(".")[:-1]) + ".sh"
- if not os.path.exists(script):
- logging.warning("could not find the matching script of %s", src)
- else:
- results.append((src, script))
- return results
-
-
-def submit_crash_to_forcey(
- forcey: str, temporary_directory: str, buildbucket_id: str, url: str
-) -> None:
- dest_dir = os.path.join(temporary_directory, buildbucket_id)
- dest_file = os.path.join(dest_dir, os.path.basename(url))
- logging.info("Downloading and submitting %r...", url)
- subprocess.check_output(
- ["gsutil.py", "cp", url, dest_file], stderr=subprocess.STDOUT
- )
- subprocess.check_output(["tar", "-xJf", dest_file], cwd=dest_dir)
- for src, script in get_crash_reproducers(dest_dir):
- subprocess.check_output(
- [
- forcey,
- "reduce",
- "-wait=false",
- "-note",
- "%s:%s" % (url, src),
- "-sh_file",
- script,
- "-src_file",
- src,
- ]
- )
-
-
-def main(argv):
- chroot.VerifyOutsideChroot()
- logging.basicConfig(
- format="%(asctime)s: %(levelname)s: %(filename)s:%(lineno)d: %(message)s",
- level=logging.INFO,
- )
- cur_dir = os.path.dirname(os.path.abspath(__file__))
- parser = argparse.ArgumentParser(description=__doc__)
- parser.add_argument(
- "--4c", dest="forcey", required=True, help="Path to a 4c client binary"
- )
- parser.add_argument(
- "--state_file",
- default=os.path.join(cur_dir, "chromeos-state.json"),
- help="The path to the state file.",
- )
- parser.add_argument(
- "--nocleanup",
- action="store_false",
- dest="cleanup",
- help="Keep temporary files created after the script finishes.",
- )
- opts = parser.parse_args(argv)
-
- state_file = os.path.abspath(opts.state_file)
- os.makedirs(os.path.dirname(state_file), exist_ok=True)
- temporary_directory = "/tmp/bisect_clang_crashes"
- os.makedirs(temporary_directory, exist_ok=True)
- urls = get_artifacts(
- "gs://chromeos-toolchain-artifacts/clang-crash-diagnoses"
- "/**/*clang_crash_diagnoses.tar.xz"
- )
- logging.info("%d crash URLs found", len(urls))
-
- visited = {}
- if os.path.exists(state_file):
- buildbucket_ids = {url.split("/")[-2] for url in urls}
- with open(state_file, encoding="utf-8") as f:
- data = json.load(f)
- visited = {k: v for k, v in data.items() if k in buildbucket_ids}
- logging.info(
- "Successfully loaded %d previously-submitted crashes", len(visited)
- )
-
- try:
- for url in urls:
- splits = url.split("/")
- buildbucket_id = splits[-2]
- # Skip the builds that has been processed
- if buildbucket_id in visited:
- continue
- submit_crash_to_forcey(
- forcey=opts.forcey,
- temporary_directory=temporary_directory,
- buildbucket_id=buildbucket_id,
- url=url,
- )
- visited[buildbucket_id] = url
-
- exception_in_flight = False
- except:
- exception_in_flight = True
- raise
- finally:
- if exception_in_flight:
- # This is best-effort. If the machine powers off or similar, we'll just
- # resubmit the same crashes, which is suboptimal, but otherwise
- # acceptable.
- logging.error(
- "Something went wrong; attempting to save our work..."
- )
- else:
- logging.info("Persisting state...")
-
- tmp_state_file = state_file + ".tmp"
- with open(tmp_state_file, "w", encoding="utf-8") as f:
- json.dump(visited, f, indent=2)
- os.rename(tmp_state_file, state_file)
-
- logging.info("State successfully persisted")
-
- if opts.cleanup:
- shutil.rmtree(temporary_directory)
-
-
-if __name__ == "__main__":
- sys.exit(main(sys.argv[1:]))