From: "Brian C. Lane" bcl@redhat.com
* log when threads are started and are finished * log progress messages * log all the running threads and their stack frame when USR2 is received. --- pyanaconda/__init__.py | 9 +++++++++ pyanaconda/progress.py | 4 ++++ pyanaconda/threads.py | 5 +++++ 3 files changed, 18 insertions(+)
diff --git a/pyanaconda/__init__.py b/pyanaconda/__init__.py index 5154e44..c46d20c 100644 --- a/pyanaconda/__init__.py +++ b/pyanaconda/__init__.py @@ -29,6 +29,7 @@ #
import os, time, string +import sys import iutil import isys from constants import ROOT_PATH @@ -179,15 +180,23 @@ class Anaconda(object): def dumpState(self): from meh.dump import ReverseExceptionDump from inspect import stack as _stack + from traceback import format_stack
# Skip the frames for dumpState and the signal handler. stack = _stack()[2:] stack.reverse() exn = ReverseExceptionDump((None, None, stack), self.mehConfig)
+ # gather up info on the running threads + threads = "\nThreads\n-------\n" + for thread_id, frame in sys._current_frames().iteritems(): + threads += "\nThread %s\n" % (thread_id,) + threads += "".join(format_stack(frame)) + # dump to a unique file (fd, filename) = mkstemp(prefix="anaconda-tb-", dir="/tmp") dump_text = exn.traceback_and_object_dump(self) + dump_text += threads dump_text = dump_text.encode("utf-8") os.write(fd, dump_text) os.close(fd) diff --git a/pyanaconda/progress.py b/pyanaconda/progress.py index a671fad..433d205 100644 --- a/pyanaconda/progress.py +++ b/pyanaconda/progress.py @@ -18,6 +18,9 @@ # # Author(s): Chris Lumens clumens@redhat.com
+import logging +log = logging.getLogger("anaconda") + from contextlib import contextmanager import Queue
@@ -66,5 +69,6 @@ def send_quit(code): @contextmanager def progress_report(message): send_message(message) + log.info(message) yield send_step() diff --git a/pyanaconda/threads.py b/pyanaconda/threads.py index 2119a7f..55fe141 100644 --- a/pyanaconda/threads.py +++ b/pyanaconda/threads.py @@ -19,6 +19,9 @@ # # Author(s): Chris Lumens clumens@redhat.com # +import logging +log = logging.getLogger("anaconda") + import threading
class ThreadManager(object): @@ -83,6 +86,7 @@ class AnacondaThread(threading.Thread): # http://bugs.python.org/issue1230540#msg25696 import sys
+ log.info("Running Thread: %s (%s)" % (self.name, self.ident)) try: threading.Thread.run(self, *args, **kwargs) except KeyboardInterrupt: @@ -91,6 +95,7 @@ class AnacondaThread(threading.Thread): sys.excepthook(*sys.exc_info()) finally: threadMgr.remove(self.name) + log.info("Thread Done: %s (%s)" % (self.name, self.ident))
def initThreading(): """Set up threading for anaconda's use. This method must be called before
On 10/08/2012 04:37 PM, Brian C. Lane wrote:
From: "Brian C. Lane"bcl@redhat.com
- log when threads are started and are finished
- log progress messages
- log all the running threads and their stack frame when USR2 is received.
ACK
anaconda-patches@lists.fedorahosted.org