[lldb/Scripts] Add verbose and failure only mode to replay script.
authorJonas Devlieghere <jonas@devlieghere.com>
Mon, 20 Apr 2020 15:52:07 +0000 (08:52 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Mon, 20 Apr 2020 16:03:48 +0000 (09:03 -0700)
Add two modes to the reproducer replay script that make debugging a
little easier. Verbose mode prints stdout and stderr, regardless of
whether replay was successful. When --failure-only is passed, output is
limited to tests that failed to replay.

lldb/scripts/reproducer-replay.py

index 5e9fab1..f16d6e8 100755 (executable)
@@ -15,9 +15,10 @@ def run_reproducer(path):
                             stderr=subprocess.PIPE)
     reason = None
     try:
+        success = proc.returncode == 0
         outs, errs = proc.communicate(timeout=TIMEOUT)
-        result = 'PASSED' if proc.returncode == 0 else 'FAILED'
-        if proc.returncode != 0:
+        result = 'PASSED' if success else 'FAILED'
+        if not success:
             outs = outs.decode()
             errs = errs.decode()
             # Do some pattern matching to find out the cause of the failure.
@@ -35,11 +36,18 @@ def run_reproducer(path):
                 reason = f'Exit code {proc.returncode}'
     except subprocess.TimeoutExpired:
         proc.kill()
+        success = False
         outs, errs = proc.communicate()
         result = 'TIMEOUT'
 
-    reason_str = f' ({reason})' if reason else ''
-    print(f'{result}: {path}{reason_str}')
+    if not FAILURE_ONLY or not success:
+        reason_str = f' ({reason})' if reason else ''
+        print(f'{result}: {path}{reason_str}')
+        if VERBOSE:
+            if outs:
+                print(outs)
+            if errs:
+                print(errs)
 
 
 def find_reproducers(path):
@@ -82,12 +90,23 @@ if __name__ == '__main__':
                         type=str,
                         required=True,
                         help='Path to the LLDB command line driver')
+    parser.add_argument('-v',
+                        '--verbose',
+                        help='Print replay output.',
+                        action='store_true')
+    parser.add_argument('--failure-only',
+                        help='Only log failures.',
+                        action='store_true')
     args = parser.parse_args()
 
     global LLDB
     global TIMEOUT
+    global VERBOSE
+    global FAILURE_ONLY
     LLDB = args.lldb
     TIMEOUT = args.timeout
+    VERBOSE = args.verbose
+    FAILURE_ONLY = args.failure_only
 
     print(
         f'Replaying reproducers in {args.path} with {args.threads} threads and a {args.timeout} seconds timeout'