extras-buildsys/common DebugUtils.py, 1.1, 1.2 HTTPServer.py, 1.7, 1.8 Makefile, 1.9, 1.10

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Tue Nov 29 06:41:48 UTC 2005


Author: dcbw

Update of /cvs/fedora/extras-buildsys/common
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv28008/common

Modified Files:
	HTTPServer.py Makefile 
Added Files:
	DebugUtils.py 
Log Message:
2005-11-29  Dan Williams  <dcbw at redhat.com>

    * Add a traceback server that listens on a Unix socket
        and writes backtraces for all threads to it.  Disabled
        by default.




Index: DebugUtils.py
===================================================================
RCS file: DebugUtils.py
diff -N DebugUtils.py
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ DebugUtils.py	29 Nov 2005 06:41:46 -0000	1.2
@@ -0,0 +1,106 @@
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Copyright 2005 Dan Williams <dcbw at redhat.com> and Red Hat, Inc.
+
+import sys
+import SocketServer
+import traceback
+import os
+import threading
+import thread
+import time
+
+haveThreadframe = True
+try:
+    import threadframe    
+except ImportError:
+    haveThreadframe = False
+
+
+tlLock = threading.Lock()
+threadList = {}
+
+
+def registerThreadName(t):
+    name = t.getName()
+    if name and len(name) > 0:
+        tlLock.acquire()
+        threadList[thread.get_ident()] = name
+        tlLock.release()
+
+class ThreadTracebackRequestHandler(SocketServer.StreamRequestHandler):
+    def handle(self):
+        if not haveThreadframe:
+            self.wfile.write("Threadframe not installed.  No traceback available.")
+            return
+
+        # Python 2.2 does not support threadframe.dict()
+        if sys.version_info[:3] < (2, 3, 0):
+            frames = threadframe.threadframe()
+            for frame in frames:
+                self.wfile.write(('-' * 72) + '\n')
+                self.wfile.write('frame ref count = %d\n' % sys.getrefcount(frame))
+                traceback.print_stack(f=frame, limit=None, file=self.wfile)
+                self.wfile.write("\n")
+        else:
+            frames = threadframe.dict()
+            for thread_id, frame in frames.iteritems():
+                tlLock.acquire()
+                thread_name = ''
+                try:
+                    thread_name = " (%s)" % threadList[thread_id]
+                except:
+                    pass
+                tlLock.release()
+                self.wfile.write(('-' * 72) + '\n')
+                self.wfile.write('[%s%s] %d' % (thread_id, thread_name, sys.getrefcount(frame)))
+                traceback.print_stack(frame, limit=None, file=self.wfile)
+                self.wfile.write("\n")
+
+
+class ThreadTracebackServer(threading.Thread):
+    def __init__(self, address="/tmp/plague-debug"):
+        if os.path.exists(address):
+            os.remove(address)
+        self._address = address
+        self._server = SocketServer.ThreadingUnixStreamServer(address, ThreadTracebackRequestHandler)
+        self._stop = False
+        threading.Thread.__init__(self)
+        self.setName("DebugUtilsTracebackServer")
+
+    def run(self):
+        print "Starting traceback server on %s." % self._address
+        registerThreadName(self)
+        while not self._stop:
+            self._server.handle_request()
+
+    def stop(self):
+        self._stop = True
+        self._server.server_close()
+
+def main():
+    address = "/tmp/plague-debug"
+    server = ThreadTracebackServer(address)
+    server.start()
+    while True:
+        try:
+            time.sleep(1)
+        except KeyboardInterrupt:
+            server.stop()
+            print "Exiting..."
+            os._exit(0)
+
+if __name__ == '__main__':
+    main()


Index: HTTPServer.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/common/HTTPServer.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- HTTPServer.py	18 Nov 2005 14:43:09 -0000	1.7
+++ HTTPServer.py	29 Nov 2005 06:41:46 -0000	1.8
@@ -26,6 +26,7 @@
 import time
 import socket
 from OpenSSL import SSL
+import DebugUtils
 
 
 class PlgHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
@@ -104,8 +105,10 @@
         self._stop = False
         self._stopped = False
         threading.Thread.__init__(self)
+        self.setName("PlgHTTPServerManager: %s/%s" % (addr, http_dir))
 
     def run(self):
+        DebugUtils.registerThreadName(self)
         while not self._stop:
             self._server.handle_request()
         self._stopped = True


Index: Makefile
===================================================================
RCS file: /cvs/fedora/extras-buildsys/common/Makefile,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- Makefile	31 Aug 2005 01:56:38 -0000	1.9
+++ Makefile	29 Nov 2005 06:41:46 -0000	1.10
@@ -11,6 +11,7 @@
 	ArchUtils.py \
 	BaseConfig.py \
 	CommonErrors.py \
+	DebugUtils.py \
 	ExecUtils.py \
 	FileDownloader.py \
 	HTTPSURLopener.py \




More information about the fedora-extras-commits mailing list