diff options
author | Steven Knight <knight@baldmt.com> | 2004-02-07 08:42:48 (GMT) |
---|---|---|
committer | Steven Knight <knight@baldmt.com> | 2004-02-07 08:42:48 (GMT) |
commit | 27afea497df2b0e855def369c85057f2feccf70e (patch) | |
tree | 2c743335931e18cbf4204c361019137ef06d9b5c /src/engine/SCons/Debug.py | |
parent | 43720671708537d6b83f2591d52131b6aa81e23c (diff) | |
download | SCons-27afea497df2b0e855def369c85057f2feccf70e.zip SCons-27afea497df2b0e855def369c85057f2feccf70e.tar.gz SCons-27afea497df2b0e855def369c85057f2feccf70e.tar.bz2 |
Add options to investigate object creation and memory consumption.
Diffstat (limited to 'src/engine/SCons/Debug.py')
-rw-r--r-- | src/engine/SCons/Debug.py | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/engine/SCons/Debug.py b/src/engine/SCons/Debug.py new file mode 100644 index 0000000..410f390 --- /dev/null +++ b/src/engine/SCons/Debug.py @@ -0,0 +1,102 @@ +"""SCons.Debug + +Code for debugging SCons internal things. Not everything here is +guaranteed to work all the way back to Python 1.5.2, and shouldn't be +needed by most users. + +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + + +# Recipe 14.10 from the Python Cookbook. +import string +import sys +try: + import weakref +except ImportError: + def logInstanceCreation(instance, name=None): + pass +else: + def logInstanceCreation(instance, name=None): + if name is None: + name = instance.__class__.__name__ + if not tracked_classes.has_key(name): + tracked_classes[name] = [] + tracked_classes[name].append(weakref.ref(instance)) + + + +tracked_classes = {} + +def string_to_classes(s): + if s == '*': + c = tracked_classes.keys() + c.sort() + return c + else: + return string.split(s) + +def countLoggedInstances(classes, file=sys.stdout): + for classname in string_to_classes(classes): + file.write("%s: %d\n" % (classname, len(tracked_classes[classname]))) + +def listLoggedInstances(classes, file=sys.stdout): + for classname in string_to_classes(classes): + file.write('\n%s:\n' % classname) + for ref in tracked_classes[classname]: + obj = ref() + if obj is not None: + file.write(' %s\n' % repr(obj)) + +def dumpLoggedInstances(classes, file=sys.stdout): + for classname in string_to_classes(classes): + file.write('\n%s:\n' % classname) + for ref in tracked_classes[classname]: + obj = ref() + if obj is not None: + file.write(' %s:\n' % obj) + for key, value in obj.__dict__.items(): + file.write(' %20s : %s\n' % (key, value)) + + + +if sys.platform[:5] == "linux": + # Linux doesn't actually support memory usage stats from getrusage(). + def memory(): + mstr = open('/proc/self/stat').read() + mstr = string.split(mstr)[22] + return int(mstr) +else: + try: + import resource + except ImportError: + def memory(): + return 0 + else: + def memory(): + res = resource.getrusage(resource.RUSAGE_SELF) + return res[4] |