changes by Barry, e.g. font lock & email addresses
[python/dscho.git] / Lib / lib-old / tb.py
blob641e8af2e865f90b610df7b6f44e504a8c8c1eb9
1 # Print tracebacks, with a dump of local variables.
2 # Also an interactive stack trace browser.
3 # Note -- this module is obsolete -- use pdb.pm() instead.
5 import sys
6 import os
7 from stat import *
8 import string
9 import linecache
11 def br(): browser(sys.last_traceback)
13 def tb(): printtb(sys.last_traceback)
15 def browser(tb):
16 if not tb:
17 print 'No traceback.'
18 return
19 tblist = []
20 while tb:
21 tblist.append(tb)
22 tb = tb.tb_next
23 ptr = len(tblist)-1
24 tb = tblist[ptr]
25 while 1:
26 if tb <> tblist[ptr]:
27 tb = tblist[ptr]
28 print `ptr` + ':',
29 printtbheader(tb)
30 try:
31 line = raw_input('TB: ')
32 except KeyboardInterrupt:
33 print '\n[Interrupted]'
34 break
35 except EOFError:
36 print '\n[EOF]'
37 break
38 cmd = string.strip(line)
39 if cmd:
40 if cmd == 'quit':
41 break
42 elif cmd == 'list':
43 browserlist(tb)
44 elif cmd == 'up':
45 if ptr-1 >= 0: ptr = ptr-1
46 else: print 'Bottom of stack.'
47 elif cmd == 'down':
48 if ptr+1 < len(tblist): ptr = ptr+1
49 else: print 'Top of stack.'
50 elif cmd == 'locals':
51 printsymbols(tb.tb_frame.f_locals)
52 elif cmd == 'globals':
53 printsymbols(tb.tb_frame.f_globals)
54 elif cmd in ('?', 'help'):
55 browserhelp()
56 else:
57 browserexec(tb, cmd)
59 def browserlist(tb):
60 filename = tb.tb_frame.f_code.co_filename
61 lineno = tb.tb_lineno
62 last = lineno
63 first = max(1, last-10)
64 for i in range(first, last+1):
65 if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
66 else: prefix = string.rjust(`i`, 7) + ':'
67 line = linecache.getline(filename, i)
68 if line[-1:] == '\n': line = line[:-1]
69 print prefix + line
71 def browserexec(tb, cmd):
72 locals = tb.tb_frame.f_locals
73 globals = tb.tb_frame.f_globals
74 try:
75 exec cmd+'\n' in globals, locals
76 except:
77 print '*** Exception:',
78 if type(sys.exc_type) == type(''):
79 print sys.exc_type,
80 else:
81 print sys.exc_type.__name__,
82 if sys.exc_value <> None:
83 print ':', sys.exc_value,
84 print
85 print 'Type help to get help.'
87 def browserhelp():
88 print
89 print ' This is the traceback browser. Commands are:'
90 print ' up : move one level up in the call stack'
91 print ' down : move one level down in the call stack'
92 print ' locals : print all local variables at this level'
93 print ' globals : print all global variables at this level'
94 print ' list : list source code around the failure'
95 print ' help : print help (what you are reading now)'
96 print ' quit : back to command interpreter'
97 print ' Typing any other 1-line statement will execute it'
98 print ' using the current level\'s symbol tables'
99 print
101 def printtb(tb):
102 while tb:
103 print1tb(tb)
104 tb = tb.tb_next
106 def print1tb(tb):
107 printtbheader(tb)
108 if tb.tb_frame.f_locals is not tb.tb_frame.f_globals:
109 printsymbols(tb.tb_frame.f_locals)
111 def printtbheader(tb):
112 filename = tb.tb_frame.f_code.co_filename
113 lineno = tb.tb_lineno
114 info = '"' + filename + '"(' + `lineno` + ')'
115 line = linecache.getline(filename, lineno)
116 if line:
117 info = info + ': ' + string.strip(line)
118 print info
120 def printsymbols(d):
121 keys = d.keys()
122 keys.sort()
123 for name in keys:
124 print ' ' + string.ljust(name, 12) + ':',
125 printobject(d[name], 4)
126 print
128 def printobject(v, maxlevel):
129 if v == None:
130 print 'None',
131 elif type(v) in (type(0), type(0.0)):
132 print v,
133 elif type(v) == type(''):
134 if len(v) > 20:
135 print `v[:17] + '...'`,
136 else:
137 print `v`,
138 elif type(v) == type(()):
139 print '(',
140 printlist(v, maxlevel)
141 print ')',
142 elif type(v) == type([]):
143 print '[',
144 printlist(v, maxlevel)
145 print ']',
146 elif type(v) == type({}):
147 print '{',
148 printdict(v, maxlevel)
149 print '}',
150 else:
151 print v,
153 def printlist(v, maxlevel):
154 n = len(v)
155 if n == 0: return
156 if maxlevel <= 0:
157 print '...',
158 return
159 for i in range(min(6, n)):
160 printobject(v[i], maxlevel-1)
161 if i+1 < n: print ',',
162 if n > 6: print '...',
164 def printdict(v, maxlevel):
165 keys = v.keys()
166 n = len(keys)
167 if n == 0: return
168 if maxlevel <= 0:
169 print '...',
170 return
171 keys.sort()
172 for i in range(min(6, n)):
173 key = keys[i]
174 print `key` + ':',
175 printobject(v[key], maxlevel-1)
176 if i+1 < n: print ',',
177 if n > 6: print '...',