Index: tests/pybin/settings.py
===================================================================
--- tests/pybin/settings.py	(revision 5baa33c60b2df67a8dfbda24fec4c5006b2b4ae0)
+++ tests/pybin/settings.py	(revision cc9b520ea1443ba102cee9a58e98d29db995b7b9)
@@ -192,15 +192,9 @@
 	global distcc
 	distcc       = "DISTCC_CFA_PATH=~/.cfadistcc/%s/cfa" % tools.config_hash()
-	errf = os.path.join(BUILDDIR, ".validate.err")
-	make_ret, out = tools.make( ".validate", error_file = errf, output_file=subprocess.DEVNULL, error=subprocess.DEVNULL )
+	make_ret, out, err = tools.make( ".validate", output_file=subprocess.PIPE, error=subprocess.PIPE )
 	if make_ret != 0:
-		with open (errf, "r") as myfile:
-			error=myfile.read()
 		print("ERROR: Invalid configuration %s:%s" % (arch.string, debug.string), file=sys.stderr)
-		print("       verify returned : \n%s" % error, file=sys.stderr)
-		tools.rm(errf)
+		print("       verify returned : \n%s" % err, file=sys.stderr)
 		sys.exit(1)
-
-	tools.rm(errf)
 
 def prep_output(tests):
Index: tests/pybin/tools.py
===================================================================
--- tests/pybin/tools.py	(revision 5baa33c60b2df67a8dfbda24fec4c5006b2b4ae0)
+++ tests/pybin/tools.py	(revision cc9b520ea1443ba102cee9a58e98d29db995b7b9)
@@ -70,18 +70,18 @@
 
 				try:
-					out, _ = proc.communicate(
+					out, errout = proc.communicate(
 						timeout = settings.timeout.single if timeout else None
 					)
 
-					return proc.returncode, out.decode("latin-1") if out else None
+					return proc.returncode, out.decode("latin-1") if out else None, errout.decode("latin-1") if errout else None
 				except subprocess.TimeoutExpired:
 					if settings.timeout2gdb:
 						print("Process {} timeout".format(proc.pid))
 						proc.communicate()
-						return 124, str(None)
+						return 124, str(None), "Subprocess Timeout 2 gdb"
 					else:
 						proc.send_signal(signal.SIGABRT)
 						proc.communicate()
-						return 124, str(None)
+						return 124, str(None), "Subprocess Timeout 2 gdb"
 
 	except Exception as ex:
@@ -106,7 +106,7 @@
 		return (False, "No file")
 
-	code, out = sh("file", fname, output_file=subprocess.PIPE)
+	code, out, err = sh("file", fname, output_file=subprocess.PIPE)
 	if code != 0:
-		return (False, "'file EXPECT' failed with code {}".format(code))
+		return (False, "'file EXPECT' failed with code {} '{}'".format(code, err))
 
 	match = re.search(".*: (.*)", out)
@@ -242,10 +242,10 @@
 # move a file
 def mv(source, dest):
-	ret, _ = sh("mv", source, dest)
+	ret, _, _ = sh("mv", source, dest)
 	return ret
 
 # cat one file into the other
 def cat(source, dest):
-	ret, _ = sh("cat", source, output_file=dest)
+	ret, _, _ = sh("cat", source, output_file=dest)
 	return ret
 
@@ -291,10 +291,8 @@
 ################################################################################
 def jobserver_version():
-	make_ret, out = sh('make', '.test_makeflags', '-j2', output_file=subprocess.PIPE)
+	make_ret, out, err = sh('make', '.test_makeflags', '-j2', output_file=subprocess.PIPE, error=subprocess.PIPE)
 	if make_ret != 0:
-		with open (errf, "r") as myfile:
-			error=myfile.read()
 		print("ERROR: cannot find Makefile jobserver version", file=sys.stderr)
-		print("       test returned : \n%s" % out, file=sys.stderr)
+		print("       test returned : {} '{}'".format(make_ret, err), file=sys.stderr)
 		sys.exit(1)
 
@@ -302,5 +300,5 @@
 	if not re_jobs:
 		print("ERROR: cannot find Makefile jobserver version", file=sys.stderr)
-		print("       MAKEFLAGS are : \n%s" % out, file=sys.stderr)
+		print("       MAKEFLAGS are : '{}'".format(out), file=sys.stderr)
 		sys.exit(1)
 
@@ -344,5 +342,5 @@
 		# remote hardware is allowed
 		# how much do we have?
-		ret, jstr = sh("distcc", "-j", output_file=subprocess.PIPE, ignore_dry_run=True)
+		ret, jstr, _ = sh("distcc", "-j", output_file=subprocess.PIPE, ignore_dry_run=True)
 		return int(jstr.strip()) if ret == 0 else multiprocessing.cpu_count()
 	else:
@@ -445,5 +443,5 @@
 	distcc_hash = os.path.join(settings.SRCDIR, '../tools/build/distcc_hash')
 	config = "%s-%s" % (settings.arch.target, settings.debug.path)
-	_, out = sh(distcc_hash, config, output_file=subprocess.PIPE, ignore_dry_run=True)
+	_, out, _ = sh(distcc_hash, config, output_file=subprocess.PIPE, ignore_dry_run=True)
 	return out.strip()
 
Index: tests/test.py
===================================================================
--- tests/test.py	(revision 5baa33c60b2df67a8dfbda24fec4c5006b2b4ae0)
+++ tests/test.py	(revision cc9b520ea1443ba102cee9a58e98d29db995b7b9)
@@ -195,5 +195,5 @@
 	# build, skipping to next test on error
 	with Timed() as comp_dur:
-		make_ret, _ = make( test.target(), output_file=subprocess.DEVNULL, error=out_file, error_file = err_file )
+		make_ret, _, _ = make( test.target(), output_file=subprocess.DEVNULL, error=out_file, error_file = err_file )
 
 	# ----------
@@ -208,5 +208,5 @@
 				if settings.dry_run or is_exe(exe_file):
 					# run test
-					retcode, _ = sh(exe_file, output_file=out_file, input_file=in_file, timeout=True)
+					retcode, _, _ = sh(exe_file, output_file=out_file, input_file=in_file, timeout=True)
 				else :
 					# simply cat the result into the output
@@ -226,5 +226,5 @@
 			else :
 				# fetch return code and error from the diff command
-				retcode, error = diff(cmp_file, out_file)
+				retcode, error, _ = diff(cmp_file, out_file)
 
 		else:
@@ -235,6 +235,9 @@
 				error = "Output log can't be read, file is bigger than 1MB, see {} for actual error\n".format(out_file)
 
-			ret, info = core_info(exe_file)
-			error = error + info if error else info
+			ret, info, gdberr = core_info(exe_file)
+			if ret == 0:
+				error = error + info if error else info
+			else :
+				error = error + gdberr if error else gdberr
 
 			if settings.archive:
@@ -366,8 +369,8 @@
 			print(os.path.relpath(t.expect(), settings.SRCDIR), end=' ')
 			print(os.path.relpath(t.input() , settings.SRCDIR), end=' ')
-			code, out = make_recon(t.target())
+			code, out, err = make_recon(t.target())
 
 			if code != 0:
-				print('ERROR: recond failed for test {}'.format(t.target()), file=sys.stderr)
+				print('ERROR: recond failed for test {}: {} \'{}\''.format(t.target(), code, err), file=sys.stderr)
 				sys.exit(1)
 
