1# Copyright 2022 The Chromium Authors 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5from __future__ import annotations 6 7from typing import TYPE_CHECKING, cast 8 9from crossbench import helper 10from crossbench.browsers.chromium.chromium import Chromium 11from crossbench.probes.chromium_probe import ChromiumProbe 12from crossbench.probes.probe import ProbeContext 13from crossbench.probes.result_location import ResultLocation 14from crossbench.probes.results import (BrowserProbeResult, LocalProbeResult, 15 ProbeResult) 16 17if TYPE_CHECKING: 18 from crossbench.browsers.browser import Browser 19 from crossbench.path import AnyPath 20 from crossbench.runner.run import Run 21 22 23class V8TurbolizerProbe(ChromiumProbe): 24 """ 25 Chromium-only Probe for extracting detailed turbofan graphs. 26 Note: This probe can have significant overhead. 27 Tool: https://v8.dev/tools/head/turbolizer 28 """ 29 NAME = "v8.turbolizer" 30 RESULT_LOCATION = ResultLocation.BROWSER 31 32 def attach(self, browser: Browser) -> None: 33 super().attach(browser) 34 assert isinstance(browser, Chromium) 35 chromium = cast(Chromium, browser) 36 chromium.flags.set("--no-sandbox") 37 chromium.js_flags.set("--trace-turbo") 38 39 def get_context(self, run: Run) -> V8TurbolizerProbeContext: 40 return V8TurbolizerProbeContext(self, run) 41 42 43class V8TurbolizerProbeContext(ProbeContext[V8TurbolizerProbe]): 44 45 @property 46 def results_dir(self) -> AnyPath: 47 # Put v8.turbolizer files into separate dirs in case we have 48 # multiple isolates 49 turbolizer_log_dir = super().result_path 50 self.browser_platform.mkdir(turbolizer_log_dir, exist_ok=True) 51 return turbolizer_log_dir 52 53 def setup(self) -> None: 54 js_flags = self.session.extra_js_flags 55 js_flags["--trace-turbo-path"] = str(self.results_dir) 56 js_flags["--trace-turbo-cfg-file"] = str(self.results_dir / "cfg.graph") 57 58 def start(self) -> None: 59 pass 60 61 def stop(self) -> None: 62 pass 63 64 def teardown(self) -> ProbeResult: 65 log_dir = self.local_result_path.parent 66 # Copy the files from a potentially remote browser to a the local result 67 # dir. 68 result: BrowserProbeResult = self.browser_result(file=(log_dir,)) 69 local_log_dir = result.file 70 assert local_log_dir.is_dir() 71 # Sort files locally after transferring them. 72 log_files = helper.sort_by_file_size(local_log_dir.glob("*")) 73 return LocalProbeResult(file=log_files) 74