Index: Lib/test/regrtest.py
===================================================================
--- Lib/test/regrtest.py	(revision 56002)
+++ Lib/test/regrtest.py	(working copy)
@@ -675,9 +675,11 @@
     dash_R_cleanup(fs, ps, pic)
     for i in range(repcount):
         rc = sys.gettotalrefcount()
+        sys.debug_ref_leak_enter()
         run_the_test()
         sys.stderr.write('.')
         dash_R_cleanup(fs, ps, pic)
+        sys.debug_ref_leak_leave()
         if i >= nwarmup:
             deltas.append(sys.gettotalrefcount() - rc - 2)
     print >> sys.stderr
Index: Modules/threadmodule.c
===================================================================
--- Modules/threadmodule.c	(revision 56002)
+++ Modules/threadmodule.c	(working copy)
@@ -411,6 +411,8 @@
 	PyObject *keyw;
 };
 
+volatile int current_thread_count = 0;
+
 static void
 t_bootstrap(void *boot_raw)
 {
@@ -418,6 +420,9 @@
 	PyThreadState *tstate;
 	PyObject *res;
 
+	fprintf(stderr, "================= thread enter\n");
+	current_thread_count++;
+
 	tstate = PyThreadState_New(boot->interp);
 
 	PyEval_AcquireThread(tstate);
@@ -444,6 +449,10 @@
 	Py_DECREF(boot->func);
 	Py_DECREF(boot->args);
 	Py_XDECREF(boot->keyw);
+
+	fprintf(stderr, "================= thread leave\n");
+	current_thread_count--;
+
 	PyMem_DEL(boot_raw);
 	PyThreadState_Clear(tstate);
 	PyThreadState_DeleteCurrent();
Index: Python/sysmodule.c
===================================================================
--- Python/sysmodule.c	(revision 56002)
+++ Python/sysmodule.c	(working copy)
@@ -606,6 +606,31 @@
 {
 	return PyInt_FromSsize_t(_Py_GetRefTotal());
 }
+
+extern volatile int current_thread_count;
+
+static int original_thread_count;
+
+static PyObject *
+sys_debug_ref_leak_enter(PyObject *self)
+{
+	original_thread_count = current_thread_count;
+	Py_IncRef(Py_None);
+	return Py_None;
+}
+
+static PyObject *
+sys_debug_ref_leak_leave(PyObject *self)
+{
+	while (original_thread_count != current_thread_count) {
+		fprintf(stderr, "thread count %d %d\n", original_thread_count, current_thread_count);
+		Py_BEGIN_ALLOW_THREADS
+		Sleep(100);
+		Py_END_ALLOW_THREADS
+	}
+	Py_IncRef(Py_None);
+	return Py_None;
+}
 #endif /* Py_REF_DEBUG */
 
 PyDoc_STRVAR(getrefcount_doc,
@@ -767,6 +792,8 @@
 #endif
 #ifdef Py_REF_DEBUG
 	{"gettotalrefcount", (PyCFunction)sys_gettotalrefcount, METH_NOARGS},
+	{"debug_ref_leak_enter", (PyCFunction)sys_debug_ref_leak_enter, METH_NOARGS},
+	{"debug_ref_leak_leave", (PyCFunction)sys_debug_ref_leak_leave, METH_NOARGS},
 #endif
 	{"getrefcount",	(PyCFunction)sys_getrefcount, METH_O, getrefcount_doc},
 	{"getrecursionlimit", (PyCFunction)sys_getrecursionlimit, METH_NOARGS,
