extras-buildsys/common DebugUtils.py, NONE, 1.1.2.1 HTTPServer.py, 1.6.2.1, 1.6.2.2 Makefile, 1.9, 1.9.2.1

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


Author: dcbw

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

Modified Files:
      Tag: STABLE_0_4
	HTTPServer.py Makefile 
Added Files:
      Tag: STABLE_0_4
	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.




--- NEW FILE DebugUtils.py ---
# 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.6.2.1
retrieving revision 1.6.2.2
diff -u -r1.6.2.1 -r1.6.2.2
--- HTTPServer.py	18 Nov 2005 15:03:44 -0000	1.6.2.1
+++ HTTPServer.py	29 Nov 2005 06:36:38 -0000	1.6.2.2
@@ -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.9.2.1
diff -u -r1.9 -r1.9.2.1
--- Makefile	31 Aug 2005 01:56:38 -0000	1.9
+++ Makefile	29 Nov 2005 06:36:38 -0000	1.9.2.1
@@ -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