| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- # Copyright (c) Facebook, Inc. and its affiliates.
- # All rights reserved.
- #
- # This source code is licensed under the BSD-style license found in the
- # LICENSE file in the root directory of this source tree.
- import os
- import signal
- import subprocess
- from contextlib import contextmanager
- @contextmanager
- def magic_trace(output="trace.fxt", magic_trace_cache="/tmp/magic-trace"):
- pid = os.getpid()
- if not os.path.exists(magic_trace_cache):
- print(f"Downloading magic_trace to: {magic_trace_cache}")
- subprocess.run(
- [
- "wget",
- "-O",
- magic_trace_cache,
- "-q",
- "https://github.com/janestreet/magic-trace/releases/download/v1.0.2/magic-trace",
- ]
- )
- subprocess.run(["chmod", "+x", magic_trace_cache])
- args = [magic_trace_cache, "attach", "-pid", str(pid), "-o", output]
- p = subprocess.Popen(args, stderr=subprocess.PIPE, encoding="utf-8")
- while True:
- x = p.stderr.readline()
- print(x)
- if "Attached" in x:
- break
- try:
- yield
- finally:
- p.send_signal(signal.SIGINT)
- r = p.wait()
- print(p.stderr.read())
- p.stderr.close()
- if r != 0:
- raise ValueError(f"magic_trace exited abnormally: {r}")
|