Added option to control debugging info on/off.
Rationale:
Mads Ager recommended having debug info on/off
as separate interesting cases for fuzz testing D8.
Bug: 70576364
Test: fuzz testing
Change-Id: Ie4def53b9ec6b855826864e20c89ef30a0d2a9b8
diff --git a/tools/jfuzz/run_jfuzz_test.py b/tools/jfuzz/run_jfuzz_test.py
index b889940..2b56767 100755
--- a/tools/jfuzz/run_jfuzz_test.py
+++ b/tools/jfuzz/run_jfuzz_test.py
@@ -43,11 +43,12 @@
BISECTABLE_RET_CODES = (RetCode.SUCCESS, RetCode.ERROR, RetCode.TIMEOUT)
-def GetExecutionModeRunner(dexer, device, mode):
+def GetExecutionModeRunner(dexer, debug_info, device, mode):
"""Returns a runner for the given execution mode.
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
device: string, target device serial number (or None)
mode: string, execution mode
Returns:
@@ -56,15 +57,15 @@
FatalError: error for unknown execution mode
"""
if mode == 'ri':
- return TestRunnerRIOnHost()
+ return TestRunnerRIOnHost(debug_info)
if mode == 'hint':
- return TestRunnerArtIntOnHost(dexer)
+ return TestRunnerArtIntOnHost(dexer, debug_info)
if mode == 'hopt':
- return TestRunnerArtOptOnHost(dexer)
+ return TestRunnerArtOptOnHost(dexer, debug_info)
if mode == 'tint':
- return TestRunnerArtIntOnTarget(dexer, device)
+ return TestRunnerArtIntOnTarget(dexer, debug_info, device)
if mode == 'topt':
- return TestRunnerArtOptOnTarget(dexer, device)
+ return TestRunnerArtOptOnTarget(dexer, debug_info, device)
raise FatalError('Unknown execution mode')
@@ -117,19 +118,22 @@
class TestRunnerWithHostCompilation(TestRunner):
"""Abstract test runner that supports compilation on host."""
- def __init__(self, dexer):
+ def __init__(self, dexer, debug_info):
"""Constructor for the runner with host compilation.
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
"""
+ self._dexer = dexer
+ self._debug_info = debug_info
self._jack_args = ['-cp', GetJackClassPath(), '--output-dex', '.',
'Test.java']
- self._dexer = dexer
def CompileOnHost(self):
if self._dexer == 'dx' or self._dexer == 'd8':
- if RunCommand(['javac', 'Test.java'],
+ dbg = '-g' if self._debug_info else '-g:none'
+ if RunCommand(['javac', dbg, 'Test.java'],
out=None, err=None, timeout=30) == RetCode.SUCCESS:
dx = 'dx' if self._dexer == 'dx' else 'd8-compat-dx'
retc = RunCommand([dx, '--dex', '--output=classes.dex'] + glob('*.class'),
@@ -147,6 +151,14 @@
class TestRunnerRIOnHost(TestRunner):
"""Concrete test runner of the reference implementation on host."""
+ def __init__(self, debug_info):
+ """Constructor for the runner with host compilation.
+
+ Args:
+ debug_info: boolean, if True include debugging info
+ """
+ self._debug_info = debug_info
+
@property
def description(self):
return 'RI on host'
@@ -156,7 +168,8 @@
return 'RI'
def CompileAndRunTest(self):
- if RunCommand(['javac', 'Test.java'],
+ dbg = '-g' if self._debug_info else '-g:none'
+ if RunCommand(['javac', dbg, 'Test.java'],
out=None, err=None, timeout=30) == RetCode.SUCCESS:
retc = RunCommand(['java', 'Test'], self.output_file, err=None)
else:
@@ -170,14 +183,15 @@
class TestRunnerArtOnHost(TestRunnerWithHostCompilation):
"""Abstract test runner of Art on host."""
- def __init__(self, dexer, extra_args=None):
+ def __init__(self, dexer, debug_info, extra_args=None):
"""Constructor for the Art on host tester.
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
extra_args: list of strings, extra arguments for dalvikvm
"""
- super().__init__(dexer)
+ super().__init__(dexer, debug_info)
self._art_cmd = ['/bin/bash', 'art', '-cp', 'classes.dex']
if extra_args is not None:
self._art_cmd += extra_args
@@ -194,13 +208,14 @@
class TestRunnerArtIntOnHost(TestRunnerArtOnHost):
"""Concrete test runner of interpreter mode Art on host."""
- def __init__(self, dexer):
+ def __init__(self, dexer, debug_info):
"""Constructor for the Art on host tester (interpreter).
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
"""
- super().__init__(dexer, ['-Xint'])
+ super().__init__(dexer, debug_info, ['-Xint'])
@property
def description(self):
@@ -217,13 +232,14 @@
class TestRunnerArtOptOnHost(TestRunnerArtOnHost):
"""Concrete test runner of optimizing compiler mode Art on host."""
- def __init__(self, dexer):
+ def __init__(self, dexer, debug_info):
"""Constructor for the Art on host tester (optimizing).
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
"""
- super().__init__(dexer, None)
+ super().__init__(dexer, debug_info, None)
@property
def description(self):
@@ -242,15 +258,16 @@
class TestRunnerArtOnTarget(TestRunnerWithHostCompilation):
"""Abstract test runner of Art on target."""
- def __init__(self, dexer, device, extra_args=None):
+ def __init__(self, dexer, debug_info, device, extra_args=None):
"""Constructor for the Art on target tester.
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
device: string, target device serial number (or None)
extra_args: list of strings, extra arguments for dalvikvm
"""
- super().__init__(dexer)
+ super().__init__(dexer, debug_info)
self._test_env = DeviceTestEnv('jfuzz_', specific_device=device)
self._dalvik_cmd = ['dalvikvm']
if extra_args is not None:
@@ -284,14 +301,15 @@
class TestRunnerArtIntOnTarget(TestRunnerArtOnTarget):
"""Concrete test runner of interpreter mode Art on target."""
- def __init__(self, dexer, device):
+ def __init__(self, dexer, debug_info, device):
"""Constructor for the Art on target tester (interpreter).
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
device: string, target device serial number (or None)
"""
- super().__init__(dexer, device, ['-Xint'])
+ super().__init__(dexer, debug_info, device, ['-Xint'])
@property
def description(self):
@@ -308,14 +326,15 @@
class TestRunnerArtOptOnTarget(TestRunnerArtOnTarget):
"""Concrete test runner of optimizing compiler mode Art on target."""
- def __init__(self, dexer, device):
+ def __init__(self, dexer, debug_info, device):
"""Constructor for the Art on target tester (optimizing).
Args:
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
device: string, target device serial number (or None)
"""
- super().__init__(dexer, device, None)
+ super().__init__(dexer, debug_info, device, None)
@property
def description(self):
@@ -345,7 +364,7 @@
"""Tester that runs JFuzz many times and report divergences."""
def __init__(self, num_tests, device, mode1, mode2, jfuzz_args,
- report_script, true_divergence_only, dexer):
+ report_script, true_divergence_only, dexer, debug_info):
"""Constructor for the tester.
Args:
@@ -357,15 +376,17 @@
report_script: string, path to script called for each divergence
true_divergence_only: boolean, if True don't bisect timeout divergences
dexer: string, defines dexer
+ debug_info: boolean, if True include debugging info
"""
self._num_tests = num_tests
self._device = device
- self._runner1 = GetExecutionModeRunner(dexer, device, mode1)
- self._runner2 = GetExecutionModeRunner(dexer, device, mode2)
+ self._runner1 = GetExecutionModeRunner(dexer, debug_info, device, mode1)
+ self._runner2 = GetExecutionModeRunner(dexer, debug_info, device, mode2)
self._jfuzz_args = jfuzz_args
self._report_script = report_script
self._true_divergence_only = true_divergence_only
self._dexer = dexer
+ self._debug_info = debug_info
self._save_dir = None
self._results_dir = None
self._jfuzz_dir = None
@@ -409,6 +430,7 @@
print('Exec-mode1:', self._runner1.description)
print('Exec-mode2:', self._runner2.description)
print('Dexer :', self._dexer)
+ print('Debug-info:', self._debug_info)
print()
self.ShowStats()
for self._test in range(1, self._num_tests + 1):
@@ -529,6 +551,7 @@
wrapped_args = ['--jfuzz_arg={0}'.format(opt) for opt in jfuzz_args]
repro_cmd_str = (os.path.basename(__file__) +
' --num_tests=1 --dexer=' + self._dexer +
+ (' --debug_info' if self._debug_info else '') +
' '.join(wrapped_args))
comment = 'jfuzz {0}\nReproduce test:\n{1}\nReproduce divergence:\n{2}\n'.format(
jfuzz_ver, jfuzz_cmd_str, repro_cmd_str)
@@ -610,14 +633,20 @@
help='do not bisect timeout divergences')
parser.add_argument('--dexer', default='dx', type=str,
help='defines dexer as dx, d8, or jack (default: dx)')
+ parser.add_argument('--debug_info', default=False, action='store_true',
+ help='include debugging info')
args = parser.parse_args()
if args.mode1 == args.mode2:
raise FatalError('Identical execution modes given')
# Run the JFuzz tester.
with JFuzzTester(args.num_tests,
- args.device, args.mode1, args.mode2,
- args.jfuzz_args, args.report_script,
- args.true_divergence, args.dexer) as fuzzer:
+ args.device,
+ args.mode1, args.mode2,
+ args.jfuzz_args,
+ args.report_script,
+ args.true_divergence,
+ args.dexer,
+ args.debug_info) as fuzzer:
fuzzer.Run()
if __name__ == '__main__':