blob: 5c592ceec18f3335ac30c9100a87d8c890bfea22 [file] [log] [blame]
Guido van Rossum217a5fa1990-12-26 15:40:07 +00001# Print tracebacks, with a dump of local variables.
2# Also an interactive stack trace browser.
Guido van Rossuma62b1001995-08-10 19:43:04 +00003# Note -- this module is obsolete -- use pdb.pm() instead.
Guido van Rossum217a5fa1990-12-26 15:40:07 +00004
5import sys
Guido van Rossum9542c581992-01-12 23:27:56 +00006import os
Guido van Rossum217a5fa1990-12-26 15:40:07 +00007from stat import *
8import string
Guido van Rossum9542c581992-01-12 23:27:56 +00009import linecache
Guido van Rossum217a5fa1990-12-26 15:40:07 +000010
11def br(): browser(sys.last_traceback)
12
13def tb(): printtb(sys.last_traceback)
14
15def 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:
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000040 if cmd == 'quit':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000041 break
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000042 elif cmd == 'list':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000043 browserlist(tb)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000044 elif cmd == 'up':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000045 if ptr-1 >= 0: ptr = ptr-1
46 else: print 'Bottom of stack.'
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000047 elif cmd == 'down':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000048 if ptr+1 < len(tblist): ptr = ptr+1
49 else: print 'Top of stack.'
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000050 elif cmd == 'locals':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000051 printsymbols(tb.tb_frame.f_locals)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000052 elif cmd == 'globals':
Guido van Rossum217a5fa1990-12-26 15:40:07 +000053 printsymbols(tb.tb_frame.f_globals)
54 elif cmd in ('?', 'help'):
55 browserhelp()
56 else:
57 browserexec(tb, cmd)
58
59def 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):
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000065 if i == lineno: prefix = '***' + string.rjust(`i`, 4) + ':'
Guido van Rossum217a5fa1990-12-26 15:40:07 +000066 else: prefix = string.rjust(`i`, 7) + ':'
Guido van Rossum9542c581992-01-12 23:27:56 +000067 line = linecache.getline(filename, i)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +000068 if line[-1:] == '\n': line = line[:-1]
Guido van Rossum217a5fa1990-12-26 15:40:07 +000069 print prefix + line
70
71def browserexec(tb, cmd):
72 locals = tb.tb_frame.f_locals
73 globals = tb.tb_frame.f_globals
74 try:
Guido van Rossuma62b1001995-08-10 19:43:04 +000075 exec cmd+'\n' in globals, locals
Guido van Rossum217a5fa1990-12-26 15:40:07 +000076 except:
Guido van Rossumf15d1591997-09-29 23:22:12 +000077 t, v = sys.exc_info()[:2]
Guido van Rossum217a5fa1990-12-26 15:40:07 +000078 print '*** Exception:',
Guido van Rossumf15d1591997-09-29 23:22:12 +000079 if type(t) == type(''):
80 print t,
Guido van Rossumc7acf2a1995-02-27 13:15:45 +000081 else:
Guido van Rossumf15d1591997-09-29 23:22:12 +000082 print t.__name__,
83 if v <> None:
84 print ':', v,
Guido van Rossum217a5fa1990-12-26 15:40:07 +000085 print
86 print 'Type help to get help.'
87
88def browserhelp():
89 print
90 print ' This is the traceback browser. Commands are:'
91 print ' up : move one level up in the call stack'
92 print ' down : move one level down in the call stack'
93 print ' locals : print all local variables at this level'
94 print ' globals : print all global variables at this level'
95 print ' list : list source code around the failure'
96 print ' help : print help (what you are reading now)'
97 print ' quit : back to command interpreter'
98 print ' Typing any other 1-line statement will execute it'
99 print ' using the current level\'s symbol tables'
100 print
101
102def printtb(tb):
103 while tb:
104 print1tb(tb)
105 tb = tb.tb_next
106
107def print1tb(tb):
108 printtbheader(tb)
109 if tb.tb_frame.f_locals is not tb.tb_frame.f_globals:
110 printsymbols(tb.tb_frame.f_locals)
111
112def printtbheader(tb):
113 filename = tb.tb_frame.f_code.co_filename
114 lineno = tb.tb_lineno
115 info = '"' + filename + '"(' + `lineno` + ')'
Guido van Rossum9542c581992-01-12 23:27:56 +0000116 line = linecache.getline(filename, lineno)
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000117 if line:
118 info = info + ': ' + string.strip(line)
119 print info
120
121def printsymbols(d):
122 keys = d.keys()
123 keys.sort()
124 for name in keys:
125 print ' ' + string.ljust(name, 12) + ':',
126 printobject(d[name], 4)
127 print
128
129def printobject(v, maxlevel):
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000130 if v == None:
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000131 print 'None',
132 elif type(v) in (type(0), type(0.0)):
133 print v,
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000134 elif type(v) == type(''):
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000135 if len(v) > 20:
136 print `v[:17] + '...'`,
137 else:
138 print `v`,
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000139 elif type(v) == type(()):
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000140 print '(',
141 printlist(v, maxlevel)
142 print ')',
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000143 elif type(v) == type([]):
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000144 print '[',
145 printlist(v, maxlevel)
146 print ']',
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000147 elif type(v) == type({}):
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000148 print '{',
149 printdict(v, maxlevel)
150 print '}',
151 else:
152 print v,
153
154def printlist(v, maxlevel):
155 n = len(v)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000156 if n == 0: return
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000157 if maxlevel <= 0:
158 print '...',
159 return
160 for i in range(min(6, n)):
161 printobject(v[i], maxlevel-1)
162 if i+1 < n: print ',',
163 if n > 6: print '...',
164
165def printdict(v, maxlevel):
166 keys = v.keys()
167 n = len(keys)
Guido van Rossumbdfcfcc1992-01-01 19:35:13 +0000168 if n == 0: return
Guido van Rossum217a5fa1990-12-26 15:40:07 +0000169 if maxlevel <= 0:
170 print '...',
171 return
172 keys.sort()
173 for i in range(min(6, n)):
174 key = keys[i]
175 print `key` + ':',
176 printobject(v[key], maxlevel-1)
177 if i+1 < n: print ',',
178 if n > 6: print '...',