blob: 7097b8f949701999aa1e07f01d0d13d861c2807f [file] [log] [blame]
Guido van Rossume7b146f2000-02-04 15:28:42 +00001"""Extract, format and print information about Python stack traces."""
Guido van Rossum526beed1994-07-01 15:36:46 +00002
3import linecache
4import string
5import sys
Guido van Rossumc7acf2a1995-02-27 13:15:45 +00006import types
Guido van Rossum526beed1994-07-01 15:36:46 +00007
Guido van Rossum194e20a1995-09-20 20:31:51 +00008def _print(file, str='', terminator='\n'):
Tim Petersb90f89a2001-01-15 03:26:36 +00009 file.write(str+terminator)
Guido van Rossumdcc057a1996-08-12 23:18:13 +000010
11
12def print_list(extracted_list, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +000013 """Print the list of tuples as returned by extract_tb() or
14 extract_stack() as a formatted stack trace to the given file."""
15 if not file:
16 file = sys.stderr
17 for filename, lineno, name, line in extracted_list:
18 _print(file,
19 ' File "%s", line %d, in %s' % (filename,lineno,name))
20 if line:
21 _print(file, ' %s' % string.strip(line))
Guido van Rossumdcc057a1996-08-12 23:18:13 +000022
23def format_list(extracted_list):
Tim Petersb90f89a2001-01-15 03:26:36 +000024 """Given a list of tuples as returned by extract_tb() or
25 extract_stack(), return a list of strings ready for printing.
26 Each string in the resulting list corresponds to the item with
27 the same index in the argument list. Each string ends in a
28 newline; the strings may contain internal newlines as well, for
29 those items whose source text line is not None."""
30 list = []
31 for filename, lineno, name, line in extracted_list:
32 item = ' File "%s", line %d, in %s\n' % (filename,lineno,name)
33 if line:
34 item = item + ' %s\n' % string.strip(line)
35 list.append(item)
36 return list
37
Guido van Rossum194e20a1995-09-20 20:31:51 +000038
39def print_tb(tb, limit=None, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +000040 """Print up to 'limit' stack trace entries from the traceback 'tb'.
41 If 'limit' is omitted or None, all entries are printed. If 'file' is
42 omitted or None, the output goes to sys.stderr; otherwise 'file'
43 should be an open file or file-like object with a write() method."""
44 if not file:
45 file = sys.stderr
46 if limit is None:
47 if hasattr(sys, 'tracebacklimit'):
48 limit = sys.tracebacklimit
49 n = 0
50 while tb is not None and (limit is None or n < limit):
51 f = tb.tb_frame
52 lineno = tb_lineno(tb)
53 co = f.f_code
54 filename = co.co_filename
55 name = co.co_name
56 _print(file,
57 ' File "%s", line %d, in %s' % (filename,lineno,name))
58 line = linecache.getline(filename, lineno)
59 if line: _print(file, ' ' + string.strip(line))
60 tb = tb.tb_next
61 n = n+1
Guido van Rossum526beed1994-07-01 15:36:46 +000062
Guido van Rossum28e99fe1995-08-04 04:30:30 +000063def format_tb(tb, limit = None):
Tim Petersb90f89a2001-01-15 03:26:36 +000064 """A shorthand for 'format_list(extract_stack(f, limit))."""
65 return format_list(extract_tb(tb, limit))
Guido van Rossum28e99fe1995-08-04 04:30:30 +000066
Guido van Rossum526beed1994-07-01 15:36:46 +000067def extract_tb(tb, limit = None):
Tim Petersb90f89a2001-01-15 03:26:36 +000068 """Return a list of up to 'limit' pre-processed stack trace entries
69 extracted from the traceback object 'traceback'. This is useful for
70 alternate formatting of stack traces. If 'limit' is omitted or None,
71 all entries are extracted. A pre-processed stack trace entry is a
72 quadruple (filename, line number, function name, text) representing
73 the information that is usually printed for a stack trace. The text
74 is a string with leading and trailing whitespace stripped; if the
75 source is not available it is None."""
76 if limit is None:
77 if hasattr(sys, 'tracebacklimit'):
78 limit = sys.tracebacklimit
79 list = []
80 n = 0
81 while tb is not None and (limit is None or n < limit):
82 f = tb.tb_frame
83 lineno = tb_lineno(tb)
84 co = f.f_code
85 filename = co.co_filename
86 name = co.co_name
87 line = linecache.getline(filename, lineno)
88 if line: line = string.strip(line)
89 else: line = None
90 list.append((filename, lineno, name, line))
91 tb = tb.tb_next
92 n = n+1
93 return list
Guido van Rossum526beed1994-07-01 15:36:46 +000094
Guido van Rossum28e99fe1995-08-04 04:30:30 +000095
Guido van Rossum194e20a1995-09-20 20:31:51 +000096def print_exception(etype, value, tb, limit=None, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +000097 """Print exception information and up to 'limit' stack trace entries
98 from the traceback 'tb' to 'file'. This differs from print_tb() in
99 the following ways: (1) if traceback is not None, it prints a header
100 "Traceback (most recent call last):"; (2) it prints the exception type and
101 value after the stack trace; (3) if type is SyntaxError and value has
102 the appropriate format, it prints the line where the syntax error
103 occurred with a caret on the next line indicating the approximate
104 position of the error."""
105 if not file:
106 file = sys.stderr
107 if tb:
108 _print(file, 'Traceback (most recent call last):')
109 print_tb(tb, limit, file)
110 lines = format_exception_only(etype, value)
111 for line in lines[:-1]:
112 _print(file, line, ' ')
113 _print(file, lines[-1], '')
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000114
115def format_exception(etype, value, tb, limit = None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000116 """Format a stack trace and the exception information. The arguments
117 have the same meaning as the corresponding arguments to
118 print_exception(). The return value is a list of strings, each
119 ending in a newline and some containing internal newlines. When
120 these lines are concatenated and printed, exactly the same text is
121 printed as does print_exception()."""
122 if tb:
123 list = ['Traceback (most recent call last):\n']
124 list = list + format_tb(tb, limit)
125 else:
126 list = []
127 list = list + format_exception_only(etype, value)
128 return list
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000129
130def format_exception_only(etype, value):
Tim Petersb90f89a2001-01-15 03:26:36 +0000131 """Format the exception part of a traceback. The arguments are the
132 exception type and value such as given by sys.last_type and
133 sys.last_value. The return value is a list of strings, each ending
134 in a newline. Normally, the list contains a single string;
135 however, for SyntaxError exceptions, it contains several lines that
136 (when printed) display detailed information about where the syntax
137 error occurred. The message indicating which exception occurred is
138 the always last string in the list."""
139 list = []
140 if type(etype) == types.ClassType:
141 stype = etype.__name__
142 else:
143 stype = etype
144 if value is None:
145 list.append(str(stype) + '\n')
146 else:
147 if etype is SyntaxError:
148 try:
149 msg, (filename, lineno, offset, line) = value
150 except:
151 pass
152 else:
153 if not filename: filename = "<string>"
154 list.append(' File "%s", line %d\n' %
155 (filename, lineno))
156 i = 0
157 while i < len(line) and \
158 line[i] in string.whitespace:
159 i = i+1
160 list.append(' %s\n' % string.strip(line))
161 s = ' '
162 for c in line[i:offset-1]:
163 if c in string.whitespace:
164 s = s + c
165 else:
166 s = s + ' '
167 list.append('%s^\n' % s)
168 value = msg
169 s = _some_str(value)
170 if s:
171 list.append('%s: %s\n' % (str(stype), s))
172 else:
173 list.append('%s\n' % str(stype))
174 return list
Guido van Rossum28e99fe1995-08-04 04:30:30 +0000175
Guido van Rossum2823f032000-08-22 02:04:46 +0000176def _some_str(value):
Tim Petersb90f89a2001-01-15 03:26:36 +0000177 try:
178 return str(value)
179 except:
180 return '<unprintable %s object>' % type(value).__name__
Guido van Rossum2823f032000-08-22 02:04:46 +0000181
Guido van Rossum526beed1994-07-01 15:36:46 +0000182
Guido van Rossum194e20a1995-09-20 20:31:51 +0000183def print_exc(limit=None, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000184 """This is a shorthand for 'print_exception(sys.exc_type,
185 sys.exc_value, sys.exc_traceback, limit, file)'.
186 (In fact, it uses sys.exc_info() to retrieve the same information
187 in a thread-safe way.)"""
188 if not file:
189 file = sys.stderr
190 try:
191 etype, value, tb = sys.exc_info()
192 print_exception(etype, value, tb, limit, file)
193 finally:
194 etype = value = tb = None
Guido van Rossum526beed1994-07-01 15:36:46 +0000195
Guido van Rossum194e20a1995-09-20 20:31:51 +0000196def print_last(limit=None, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000197 """This is a shorthand for 'print_exception(sys.last_type,
198 sys.last_value, sys.last_traceback, limit, file)'."""
199 if not file:
200 file = sys.stderr
201 print_exception(sys.last_type, sys.last_value, sys.last_traceback,
202 limit, file)
Guido van Rossumdcc057a1996-08-12 23:18:13 +0000203
204
205def print_stack(f=None, limit=None, file=None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000206 """This function prints a stack trace from its invocation point.
207 The optional 'f' argument can be used to specify an alternate stack
208 frame at which to start. The optional 'limit' and 'file' arguments
209 have the same meaning as for print_exception()."""
210 if f is None:
211 try:
212 raise ZeroDivisionError
213 except ZeroDivisionError:
214 f = sys.exc_info()[2].tb_frame.f_back
215 print_list(extract_stack(f, limit), file)
Guido van Rossumdcc057a1996-08-12 23:18:13 +0000216
217def format_stack(f=None, limit=None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000218 """A shorthand for 'format_list(extract_stack(f, limit))'."""
219 if f is None:
220 try:
221 raise ZeroDivisionError
222 except ZeroDivisionError:
223 f = sys.exc_info()[2].tb_frame.f_back
224 return format_list(extract_stack(f, limit))
Guido van Rossumdcc057a1996-08-12 23:18:13 +0000225
226def extract_stack(f=None, limit = None):
Tim Petersb90f89a2001-01-15 03:26:36 +0000227 """Extract the raw traceback from the current stack frame. The
228 return value has the same format as for extract_tb(). The optional
229 'f' and 'limit' arguments have the same meaning as for print_stack().
230 Each item in the list is a quadruple (filename, line number,
231 function name, text), and the entries are in order from oldest
232 to newest stack frame."""
233 if f is None:
234 try:
235 raise ZeroDivisionError
236 except ZeroDivisionError:
237 f = sys.exc_info()[2].tb_frame.f_back
238 if limit is None:
239 if hasattr(sys, 'tracebacklimit'):
240 limit = sys.tracebacklimit
241 list = []
242 n = 0
243 while f is not None and (limit is None or n < limit):
244 lineno = f.f_lineno # XXX Too bad if -O is used
245 co = f.f_code
246 filename = co.co_filename
247 name = co.co_name
248 line = linecache.getline(filename, lineno)
249 if line: line = string.strip(line)
250 else: line = None
251 list.append((filename, lineno, name, line))
252 f = f.f_back
253 n = n+1
254 list.reverse()
255 return list
Guido van Rossum47529661997-09-26 22:43:02 +0000256
Guido van Rossum47529661997-09-26 22:43:02 +0000257def tb_lineno(tb):
Tim Petersb90f89a2001-01-15 03:26:36 +0000258 """Calculate the correct line number of the traceback given in tb
259 (even with -O on)."""
Guido van Rossume7b146f2000-02-04 15:28:42 +0000260
Tim Petersb90f89a2001-01-15 03:26:36 +0000261 # Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
262 # in compile.c.
263 # Revised version by Jim Hugunin to work with JPython too.
Guido van Rossume7b146f2000-02-04 15:28:42 +0000264
Tim Petersb90f89a2001-01-15 03:26:36 +0000265 c = tb.tb_frame.f_code
266 if not hasattr(c, 'co_lnotab'):
267 return tb.tb_lineno
Guido van Rossum6e73af71998-02-26 17:25:02 +0000268
Tim Petersb90f89a2001-01-15 03:26:36 +0000269 tab = c.co_lnotab
270 line = c.co_firstlineno
271 stopat = tb.tb_lasti
272 addr = 0
273 for i in range(0, len(tab), 2):
274 addr = addr + ord(tab[i])
275 if addr > stopat:
276 break
277 line = line + ord(tab[i+1])
278 return line