Index: build/android/pylib/valgrind_tools.py |
diff --git a/build/android/pylib/valgrind_tools.py b/build/android/pylib/valgrind_tools.py |
index a2ada9dbde0714d4b4bf90417931a5cc1513aa79..50cc8f58f4367414e5077def4195684c0d06ed28 100644 |
--- a/build/android/pylib/valgrind_tools.py |
+++ b/build/android/pylib/valgrind_tools.py |
@@ -24,7 +24,7 @@ Call tool.CleanUpEnvironment(). |
import os.path |
import sys |
-from run_tests_helper import CHROME_DIR |
+from constants import CHROME_DIR |
class BaseTool(object): |
@@ -37,6 +37,11 @@ class BaseTool(object): |
"""Returns a string that is to be prepended to the test command line.""" |
return '' |
+ def GetUtilWrapper(self): |
+ """Returns a string that is to be prepended to the command line of utility |
+ processes (forwarder, etc.)""" |
+ return '' |
+ |
def CopyFiles(self): |
"""Copies tool-specific files to the device, create directories, etc.""" |
pass |
@@ -64,6 +69,54 @@ class BaseTool(object): |
return False |
+class AddressSanitizerTool(BaseTool): |
+ """AddressSanitizer tool.""" |
+ |
+ WRAPPER_PATH = "/system/bin/asanwrapper" |
+ |
+ def __init__(self, adb): |
+ self.adb = adb |
+ self.wrap_properties = ['wrap.com.google.android.apps.ch', |
+ 'wrap.org.chromium.native_test'] |
+ |
+ def CopyFiles(self): |
+ """Copies ASan tools to the device.""" |
+ files = ['system/lib/libasan_preload.so', |
+ 'system/bin/asanwrapper', |
+ 'system/bin/asan/app_process', |
+ 'system/bin/linker'] |
+ android_product_out = os.environ['ANDROID_PRODUCT_OUT'] |
+ self.adb.MakeSystemFolderWritable() |
+ for f in files: |
+ self.adb.PushIfNeeded(os.path.join(android_product_out, f), |
+ os.path.join('/', f)) |
+ |
+ def GetTestWrapper(self): |
+ return AddressSanitizerTool.WRAPPER_PATH |
+ |
+ def GetUtilWrapper(self): |
+ """ AddressSanitizer wrapper must be added to all instrumented binaries, |
+ including forwarder and the like. This can be removed if such binaries |
+ were built without instrumentation. """ |
+ return AddressSanitizerTool.WRAPPER_PATH |
+ |
+ def SetupEnvironment(self): |
+ for prop in self.wrap_properties: |
+ self.adb.RunShellCommand('setprop %s "logwrapper %s"' % ( |
+ prop, self.GetTestWrapper())) |
+ self.adb.RunShellCommand('setprop chrome.timeout_scale %f' % ( |
+ self.GetTimeoutScale())) |
+ |
+ def CleanUpEnvironment(self): |
+ for prop in self.wrap_properties: |
+ self.adb.RunShellCommand('setprop %s ""' % (prop,)) |
+ self.adb.RunShellCommand('setprop chrome.timeout_scale ""') |
+ |
+ def GetTimeoutScale(self): |
+ # Very slow startup. |
+ return 20.0 |
+ |
+ |
class ValgrindTool(BaseTool): |
"""Base abstract class for Valgrind tools.""" |
@@ -72,11 +125,9 @@ class ValgrindTool(BaseTool): |
def __init__(self, adb, renderer=False): |
self.adb = adb |
- if renderer: |
- # exactly 31 chars, SystemProperties::PROP_NAME_MAX |
- self.wrap_property = 'wrap.com.android.chrome:sandbox' |
- else: |
- self.wrap_property = 'wrap.com.android.chrome' |
+ # exactly 31 chars, SystemProperties::PROP_NAME_MAX |
+ self.wrap_properties = ['wrap.com.google.android.apps.ch', |
+ 'wrap.org.chromium.native_test'] |
def CopyFiles(self): |
"""Copies Valgrind tools to the device.""" |
@@ -93,14 +144,16 @@ class ValgrindTool(BaseTool): |
def SetupEnvironment(self): |
"""Sets up device environment.""" |
self.adb.RunShellCommand('chmod 777 /data/local/tmp') |
- self.adb.RunShellCommand('setprop %s "logwrapper %s"' % ( |
- self.wrap_property, self.GetTestWrapper())) |
+ for prop in self.wrap_properties: |
+ self.adb.RunShellCommand('setprop %s "logwrapper %s"' % ( |
+ prop, self.GetTestWrapper())) |
self.adb.RunShellCommand('setprop chrome.timeout_scale %f' % ( |
self.GetTimeoutScale())) |
def CleanUpEnvironment(self): |
"""Cleans up device environment.""" |
- self.adb.RunShellCommand('setprop %s ""' % (self.wrap_property,)) |
+ for prop in self.wrap_properties: |
+ self.adb.RunShellCommand('setprop %s ""' % (prop,)) |
self.adb.RunShellCommand('setprop chrome.timeout_scale ""') |
def GetFilesForTool(self): |
@@ -162,7 +215,8 @@ TOOL_REGISTRY = { |
'memcheck': lambda x: MemcheckTool(x, False), |
'memcheck-renderer': lambda x: MemcheckTool(x, True), |
'tsan': lambda x: TSanTool(x, False), |
- 'tsan-renderer': lambda x: TSanTool(x, True) |
+ 'tsan-renderer': lambda x: TSanTool(x, True), |
+ 'asan': lambda x: AddressSanitizerTool(x) |
} |