diff Modules/threadmodule.c @ 28889:96b6cc5d408b legacy-trunk

When an unhandled exception happens, report the repr() of the function that was used to start the thread. This is useful to track down the source of the problem when there is no traceback, as can happen when a daemon thread gets to run after Python is finialized (a new kind of event, somehow this is now possible due to changes in Py_Finalize()).
author Guido van Rossum <guido@python.org>
date Tue, 29 Apr 2003 19:44:05 +0000
parents 5165a0ee84c6
children 8d160095eb66
line wrap: on
line diff
--- a/Modules/threadmodule.c	Tue Apr 29 19:27:26 2003 +0000
+++ b/Modules/threadmodule.c	Tue Apr 29 19:44:05 2003 +0000
@@ -179,20 +179,28 @@
 	PyEval_AcquireThread(tstate);
 	res = PyEval_CallObjectWithKeywords(
 		boot->func, boot->args, boot->keyw);
-	Py_DECREF(boot->func);
-	Py_DECREF(boot->args);
-	Py_XDECREF(boot->keyw);
-	PyMem_DEL(boot_raw);
 	if (res == NULL) {
 		if (PyErr_ExceptionMatches(PyExc_SystemExit))
 			PyErr_Clear();
 		else {
-			PySys_WriteStderr("Unhandled exception in thread:\n");
+			PyObject *file;
+			PySys_WriteStderr(
+				"Unhandled exception in thread started by ");
+			file = PySys_GetObject("stderr");
+			if (file)
+				PyFile_WriteObject(boot->func, file, 0);
+			else
+				PyObject_Print(boot->func, stderr, 0);
+			PySys_WriteStderr("\n");
 			PyErr_PrintEx(0);
 		}
 	}
 	else
 		Py_DECREF(res);
+	Py_DECREF(boot->func);
+	Py_DECREF(boot->args);
+	Py_XDECREF(boot->keyw);
+	PyMem_DEL(boot_raw);
 	PyThreadState_Clear(tstate);
 	PyThreadState_DeleteCurrent();
 	PyThread_exit_thread();