From 24ccca156557a64ca0574a2ad384506d246d030b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 29 Apr 2003 19:44:05 +0000 Subject: 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()). --- Modules/threadmodule.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c index 62fd76a..8b174b3 100644 --- a/Modules/threadmodule.c +++ b/Modules/threadmodule.c @@ -179,20 +179,28 @@ t_bootstrap(void *boot_raw) 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(); -- cgit v0.12