diff --git a/test/validate/makeTestfile.pl b/test/validate/makeTestfile.pl
index 38582e427871d8df9dbeda34ec4ba84368d45330..d235120f1ea4287636758f07b1f72c4886eac838 100644
--- a/test/validate/makeTestfile.pl
+++ b/test/validate/makeTestfile.pl
@@ -59,11 +59,11 @@ $killit;
 EOF
 } elsif (-r "$db") {
   print $OUT <<EOF;
-exec "$valgrind./$exe -S -t -d $db" or die "exec failed: $err";
+system "$valgrind./$exe -S -t -d $db";
 EOF
 } else {
   print $OUT <<EOF;
-exec "$valgrind./$exe -S -t" or die "exec failed: $err";
+system "$valgrind./$exe -S -t";
 EOF
 }
 
diff --git a/test/validate/testSupport.c b/test/validate/testSupport.c
index 3d23a671e97f0fc89b3a9716d5982f4a6a907052..53f0e4e600ea42fbd9eba7e3202d5979827ea0e7 100644
--- a/test/validate/testSupport.c
+++ b/test/validate/testSupport.c
@@ -8,6 +8,7 @@ in the file LICENSE that is included with this distribution.
 
 #include "epicsThread.h"
 #include "epicsEvent.h"
+#include "epicsExit.h"
 #include "seqCom.h"
 
 #include "../testSupport.h"
@@ -44,6 +45,11 @@ void seq_test_init(int num_tests)
     }
 }
 
+void seq_test_at_thread_exit(void *dummy)
+{
+    epicsExit(EXIT_SUCCESS);
+}
+
 void seq_test_done(void)
 {
     epicsThreadSetPriority(epicsThreadGetIdSelf(), epicsThreadPriorityMedium);
@@ -51,7 +57,7 @@ void seq_test_done(void)
 #if defined(vxWorks)
     epicsEventSignal(this_test_done);
 #else
-    exit(0);
+    epicsAtThreadExit(seq_test_at_thread_exit, 0);
 #endif
 }