diff --git a/tests-extra/runtests.py b/tests-extra/runtests.py
index 64992c375f72951df128c3ad4240ad59ef85f475..d2d6cfaca7b87f7e05d41c8f4b0aecbdfeac6d7c 100755
--- a/tests-extra/runtests.py
+++ b/tests-extra/runtests.py
@@ -24,10 +24,11 @@ TESTS_DIR = "tests"
 log = None
 outs_dir = None
 
-def save_traceback(outdir):
+def save_traceback(outdir, exc):
     path = os.path.join(Context().out_dir, "traceback.log")
     with open(path, mode="a") as f:
-        traceback.print_exc(file=f)
+        tb = traceback.TracebackException.from_exception(exc, capture_locals=True)
+        print("".join(tb.format()), file=f)
 
 def create_log(logger, filename="", level=logging.NOTSET):
     if filename:
@@ -190,7 +191,7 @@ def job(tasks, results, stop):
             log.error(case_str_err + "SKIPPED (%s)" % format(exc))
             skip_cnt += 1
         except dnstest.utils.Failed as exc:
-            save_traceback(ctx.out_dir)
+            save_traceback(ctx.out_dir, exc)
 
             desc = format(exc)
             msg = "FAILED (%s)" % (desc if desc else exc.__class__.__name__)
@@ -205,7 +206,7 @@ def job(tasks, results, stop):
             fail_cnt += 1
             stop.value = True
         except Exception as exc:
-            save_traceback(ctx.out_dir)
+            save_traceback(ctx.out_dir, exc)
 
             desc = format(exc)
             msg = "EXCEPTION (%s)" % (desc if desc else exc.__class__.__name__)
@@ -218,7 +219,7 @@ def job(tasks, results, stop):
             fail_cnt += 1
             stop.value = True
         except BaseException as exc:
-            save_traceback(ctx.out_dir)
+            save_traceback(ctx.out_dir, exc)
             if params.debug:
                 traceback.print_exc()
             else: