1 """SCons.Debug
2
3 Code for debugging SCons internal things. Not everything here is
4 guaranteed to work all the way back to Python 1.5.2, and shouldn't be
5 needed by most users.
6
7 """
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 __revision__ = "src/engine/SCons/Debug.py 2725 2008/03/31 12:52:02 knight"
33
34 import os
35 import string
36 import sys
37
38
39 try:
40 import weakref
41 except ImportError:
44 else:
51
52
53
54 tracked_classes = {}
55
63
67
71
79
81 for classname in string_to_classes(classes):
82 file.write('\n%s:\n' % classname)
83 for ref in tracked_classes[classname]:
84 obj = ref()
85 if obj is not None:
86 file.write(' %s:\n' % obj)
87 for key, value in obj.__dict__.items():
88 file.write(' %20s : %s\n' % (key, value))
89
90
91
92 if sys.platform[:5] == "linux":
93
98 else:
99 try:
100 import resource
101 except ImportError:
102 try:
103 import win32process
104 import win32api
105 except ImportError:
108 else:
110 process_handle = win32api.GetCurrentProcess()
111 memory_info = win32process.GetProcessMemoryInfo( process_handle )
112 return memory_info['PeakWorkingSetSize']
113 else:
115 res = resource.getrusage(resource.RUSAGE_SELF)
116 return res[4]
117
118
119
120 caller_dicts = {}
121
123 import traceback
124 if not backlist:
125 backlist = [0]
126 result = []
127 for back in backlist:
128 tb = traceback.extract_stack(limit=3+back)
129 key = tb[1][:3]
130 try:
131 entry = caller_dicts[key]
132 except KeyError:
133 entry = caller_dicts[key] = {}
134 key = tb[0][:3]
135 entry[key] = entry.get(key, 0) + 1
136 result.append('%s:%d(%s)' % func_shorten(key))
137 return result
138
151
152 shorten_list = [
153 ( '/scons/SCons/', 1),
154 ( '/src/engine/SCons/', 1),
155 ( '/usr/lib/python', 0),
156 ]
157
158 if os.sep != '/':
161 shorten_list = map(platformize, shorten_list)
162 del platformize
163
165 f = func_tuple[0]
166 for t in shorten_list:
167 i = string.find(f, t[0])
168 if i >= 0:
169 if t[1]:
170 i = i + len(t[0])
171 f = f[i:]
172 break
173 return (f,)+func_tuple[1:]
174
175
176
177 TraceFP = {}
178 if sys.platform == 'win32':
179 TraceDefault = 'con'
180 else:
181 TraceDefault = '/dev/tty'
182
183 -def Trace(msg, file=None, mode='w'):
184 """Write a trace message to a file. Whenever a file is specified,
185 it becomes the default for the next call to Trace()."""
186 global TraceDefault
187 if file is None:
188 file = TraceDefault
189 else:
190 TraceDefault = file
191 try:
192 fp = TraceFP[file]
193 except KeyError:
194 try:
195 fp = TraceFP[file] = open(file, mode)
196 except TypeError:
197
198 fp = file
199 fp.write(msg)
200 fp.flush()
201