@SuppressWarnings({ "removal" })  // Thread.stop()
	private void checkForTestTimeout(TestThread testThread) {

		if (timoutMonitor == null || !timoutMonitor.didRun()) {
			return;
		}

//		Not sure why we were doing this before
//		if (SystemUtilities.isInDevelopmentMode()) {
//			throw new AssertionFailedError("Test timeout after " +
//				TimeUnit.MINUTES.convert(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS) + " mins");
//		}

		String vmTrace = AbstractGenericTest.createStackTraceForAllThreads();
		Msg.error(ConcurrentTestExceptionStatement.class,
			"\n\nThreads at time of interrupt:\n" + vmTrace);

		interruptTestThread(testThread);

		StackTraceElement[] trace = testThread.getStackTrace();

		// if we get here, we are one step away from System.exit(1), so do the 
		// bad thing and kill the thread
		testThread.stop();
		lastTestThread = null; // don't try to join
		AssertionFailedError error =
			new AssertionFailedError("Test locked-up--aborting!  See log for details");
		error.setStackTrace(trace);
		throw error;
	}
Prints all exceptions found that did not occur on the test thread.  This is useful 
for debugging.
Ghidra/Framework/Generic/src/main/java/generic/test/ConcurrentTestExceptionStatement.java