annotate Lib/lib-old/tb.py @ 5817:48b94de85bf3 legacy-trunk

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