xref: /aosp_15_r20/external/cronet/build/android/pylib/valgrind_tools.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker# pylint: disable=R0201
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Workerimport logging
11*6777b538SAndroid Build Coastguard Workerimport sys
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Workerfrom devil.android import device_errors
14*6777b538SAndroid Build Coastguard Workerfrom devil.android.valgrind_tools import base_tool
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Workerdef SetChromeTimeoutScale(device, scale):
18*6777b538SAndroid Build Coastguard Worker  """Sets the timeout scale in /data/local/tmp/chrome_timeout_scale to scale."""
19*6777b538SAndroid Build Coastguard Worker  path = '/data/local/tmp/chrome_timeout_scale'
20*6777b538SAndroid Build Coastguard Worker  if not scale or scale == 1.0:
21*6777b538SAndroid Build Coastguard Worker    # Delete if scale is None/0.0/1.0 since the default timeout scale is 1.0
22*6777b538SAndroid Build Coastguard Worker    device.RemovePath(path, force=True, as_root=True)
23*6777b538SAndroid Build Coastguard Worker  else:
24*6777b538SAndroid Build Coastguard Worker    device.WriteFile(path, '%f' % scale, as_root=True)
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Workerclass AddressSanitizerTool(base_tool.BaseTool):
29*6777b538SAndroid Build Coastguard Worker  """AddressSanitizer tool."""
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker  WRAPPER_NAME = '/system/bin/asanwrapper'
32*6777b538SAndroid Build Coastguard Worker  # Disable memcmp overlap check.There are blobs (gl drivers)
33*6777b538SAndroid Build Coastguard Worker  # on some android devices that use memcmp on overlapping regions,
34*6777b538SAndroid Build Coastguard Worker  # nothing we can do about that.
35*6777b538SAndroid Build Coastguard Worker  EXTRA_OPTIONS = 'strict_memcmp=0,use_sigaltstack=1'
36*6777b538SAndroid Build Coastguard Worker
37*6777b538SAndroid Build Coastguard Worker  def __init__(self, device):
38*6777b538SAndroid Build Coastguard Worker    super().__init__()
39*6777b538SAndroid Build Coastguard Worker    self._device = device
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker  @classmethod
42*6777b538SAndroid Build Coastguard Worker  def CopyFiles(cls, device):
43*6777b538SAndroid Build Coastguard Worker    """Copies ASan tools to the device."""
44*6777b538SAndroid Build Coastguard Worker    del device
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker  def GetTestWrapper(self):
47*6777b538SAndroid Build Coastguard Worker    return AddressSanitizerTool.WRAPPER_NAME
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker  def GetUtilWrapper(self):
50*6777b538SAndroid Build Coastguard Worker    """Returns the wrapper for utilities, such as forwarder.
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker    AddressSanitizer wrapper must be added to all instrumented binaries,
53*6777b538SAndroid Build Coastguard Worker    including forwarder and the like. This can be removed if such binaries
54*6777b538SAndroid Build Coastguard Worker    were built without instrumentation. """
55*6777b538SAndroid Build Coastguard Worker    return self.GetTestWrapper()
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker  def SetupEnvironment(self):
58*6777b538SAndroid Build Coastguard Worker    try:
59*6777b538SAndroid Build Coastguard Worker      self._device.EnableRoot()
60*6777b538SAndroid Build Coastguard Worker    except device_errors.CommandFailedError as e:
61*6777b538SAndroid Build Coastguard Worker      # Try to set the timeout scale anyway.
62*6777b538SAndroid Build Coastguard Worker      # TODO(jbudorick) Handle this exception appropriately after interface
63*6777b538SAndroid Build Coastguard Worker      #                 conversions are finished.
64*6777b538SAndroid Build Coastguard Worker      logging.error(str(e))
65*6777b538SAndroid Build Coastguard Worker    SetChromeTimeoutScale(self._device, self.GetTimeoutScale())
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker  def CleanUpEnvironment(self):
68*6777b538SAndroid Build Coastguard Worker    SetChromeTimeoutScale(self._device, None)
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker  def GetTimeoutScale(self):
71*6777b538SAndroid Build Coastguard Worker    # Very slow startup.
72*6777b538SAndroid Build Coastguard Worker    return 20.0
73*6777b538SAndroid Build Coastguard Worker
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard WorkerTOOL_REGISTRY = {
76*6777b538SAndroid Build Coastguard Worker    'asan': AddressSanitizerTool,
77*6777b538SAndroid Build Coastguard Worker}
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Workerdef CreateTool(tool_name, device):
81*6777b538SAndroid Build Coastguard Worker  """Creates a tool with the specified tool name.
82*6777b538SAndroid Build Coastguard Worker
83*6777b538SAndroid Build Coastguard Worker  Args:
84*6777b538SAndroid Build Coastguard Worker    tool_name: Name of the tool to create.
85*6777b538SAndroid Build Coastguard Worker    device: A DeviceUtils instance.
86*6777b538SAndroid Build Coastguard Worker  Returns:
87*6777b538SAndroid Build Coastguard Worker    A tool for the specified tool_name.
88*6777b538SAndroid Build Coastguard Worker  """
89*6777b538SAndroid Build Coastguard Worker  if not tool_name:
90*6777b538SAndroid Build Coastguard Worker    return base_tool.BaseTool()
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker  ctor = TOOL_REGISTRY.get(tool_name)
93*6777b538SAndroid Build Coastguard Worker  if ctor:
94*6777b538SAndroid Build Coastguard Worker    return ctor(device)
95*6777b538SAndroid Build Coastguard Worker  print('Unknown tool %s, available tools: %s' %
96*6777b538SAndroid Build Coastguard Worker        (tool_name, ', '.join(sorted(TOOL_REGISTRY.keys()))))
97*6777b538SAndroid Build Coastguard Worker  sys.exit(1)
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Workerdef PushFilesForTool(tool_name, device):
101*6777b538SAndroid Build Coastguard Worker  """Pushes the files required for |tool_name| to |device|.
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker  Args:
104*6777b538SAndroid Build Coastguard Worker    tool_name: Name of the tool to create.
105*6777b538SAndroid Build Coastguard Worker    device: A DeviceUtils instance.
106*6777b538SAndroid Build Coastguard Worker  """
107*6777b538SAndroid Build Coastguard Worker  if not tool_name:
108*6777b538SAndroid Build Coastguard Worker    return
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker  clazz = TOOL_REGISTRY.get(tool_name)
111*6777b538SAndroid Build Coastguard Worker  if clazz:
112*6777b538SAndroid Build Coastguard Worker    clazz.CopyFiles(device)
113*6777b538SAndroid Build Coastguard Worker  else:
114*6777b538SAndroid Build Coastguard Worker    print('Unknown tool %s, available tools: %s' % (tool_name, ', '.join(
115*6777b538SAndroid Build Coastguard Worker        sorted(TOOL_REGISTRY.keys()))))
116*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
117