blob: 4a3153c71c5a4c1df139da786d230295a399427c [file] [log] [blame]
Guido van Rossum4acc25b2000-02-02 15:10:15 +00001"""Debugger basics"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00002
3import sys
Barry Warsaw148ffbc1999-09-09 23:24:33 +00004import os
Guido van Rossum4808dcb1996-10-15 14:40:21 +00005import types
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00006
Skip Montanaroe99d5ea2001-01-20 19:54:20 +00007__all__ = ["BdbQuit","Bdb","Breakpoint"]
8
Neal Norwitz93cf79f2002-03-31 14:06:41 +00009class BdbQuit(Exception):
10 """Exception to give up completely"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000011
12
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000013class Bdb:
Tim Peters11cf6052001-01-14 21:54:20 +000014
Guido van Rossum4acc25b2000-02-02 15:10:15 +000015 """Generic Python debugger base class.
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000016
Guido van Rossum4acc25b2000-02-02 15:10:15 +000017 This class takes care of details of the trace facility;
18 a derived class should implement user interaction.
19 The standard debugger class (pdb.Pdb) is an example.
20 """
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000021
Guido van Rossum4acc25b2000-02-02 15:10:15 +000022 def __init__(self):
23 self.breaks = {}
24 self.fncache = {}
Barry Warsaw148ffbc1999-09-09 23:24:33 +000025
Guido van Rossum4acc25b2000-02-02 15:10:15 +000026 def canonic(self, filename):
Guido van Rossum42f53322001-11-29 02:50:15 +000027 if filename == "<" + filename[1:-1] + ">":
28 return filename
Guido van Rossum4acc25b2000-02-02 15:10:15 +000029 canonic = self.fncache.get(filename)
30 if not canonic:
31 canonic = os.path.abspath(filename)
Guido van Rossumbdba3202002-02-25 23:23:24 +000032 canonic = os.path.normcase(canonic)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000033 self.fncache[filename] = canonic
34 return canonic
Tim Peters11cf6052001-01-14 21:54:20 +000035
Guido van Rossum4acc25b2000-02-02 15:10:15 +000036 def reset(self):
37 import linecache
38 linecache.checkcache()
39 self.botframe = None
Benjamin Peterson98353942008-05-11 14:13:25 +000040 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +000041
Guido van Rossum4acc25b2000-02-02 15:10:15 +000042 def trace_dispatch(self, frame, event, arg):
43 if self.quitting:
44 return # None
45 if event == 'line':
46 return self.dispatch_line(frame)
47 if event == 'call':
48 return self.dispatch_call(frame, arg)
49 if event == 'return':
50 return self.dispatch_return(frame, arg)
51 if event == 'exception':
52 return self.dispatch_exception(frame, arg)
Nicholas Bastinc69ebe82004-03-24 21:57:10 +000053 if event == 'c_call':
54 return self.trace_dispatch
55 if event == 'c_exception':
56 return self.trace_dispatch
57 if event == 'c_return':
58 return self.trace_dispatch
Walter Dörwald70a6b492004-02-12 17:35:32 +000059 print 'bdb.Bdb.dispatch: unknown debugging event:', repr(event)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000060 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000061
Guido van Rossum4acc25b2000-02-02 15:10:15 +000062 def dispatch_line(self, frame):
63 if self.stop_here(frame) or self.break_here(frame):
64 self.user_line(frame)
65 if self.quitting: raise BdbQuit
66 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000067
Guido van Rossum4acc25b2000-02-02 15:10:15 +000068 def dispatch_call(self, frame, arg):
69 # XXX 'arg' is no longer used
70 if self.botframe is None:
71 # First call of dispatch since reset()
Christian Tismer313a7512002-05-28 08:04:00 +000072 self.botframe = frame.f_back # (CT) Note that this may also be None!
Guido van Rossum4acc25b2000-02-02 15:10:15 +000073 return self.trace_dispatch
74 if not (self.stop_here(frame) or self.break_anywhere(frame)):
75 # No need to trace this function
76 return # None
77 self.user_call(frame, arg)
78 if self.quitting: raise BdbQuit
79 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000080
Guido van Rossum4acc25b2000-02-02 15:10:15 +000081 def dispatch_return(self, frame, arg):
82 if self.stop_here(frame) or frame == self.returnframe:
83 self.user_return(frame, arg)
84 if self.quitting: raise BdbQuit
Just van Rossumae1f65f2001-06-25 18:01:24 +000085 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000086
Guido van Rossum4acc25b2000-02-02 15:10:15 +000087 def dispatch_exception(self, frame, arg):
88 if self.stop_here(frame):
89 self.user_exception(frame, arg)
90 if self.quitting: raise BdbQuit
91 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000092
Guido van Rossum4acc25b2000-02-02 15:10:15 +000093 # Normally derived classes don't override the following
94 # methods, but they may if they want to redefine the
95 # definition of stopping and breakpoints.
Tim Peters11cf6052001-01-14 21:54:20 +000096
Guido van Rossum4acc25b2000-02-02 15:10:15 +000097 def stop_here(self, frame):
Neal Norwitz72a2b4d2002-05-29 00:54:38 +000098 # (CT) stopframe may now also be None, see dispatch_call.
99 # (CT) the former test for None is therefore removed from here.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000100 if frame is self.stopframe:
Georg Brandle64de922010-08-01 22:10:15 +0000101 if self.stoplineno == -1:
102 return False
Benjamin Peterson98353942008-05-11 14:13:25 +0000103 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000104 while frame is not None and frame is not self.stopframe:
105 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000106 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000107 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000108 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000109
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000110 def break_here(self, frame):
111 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000112 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000113 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000114 lineno = frame.f_lineno
115 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000116 # The line itself has no breakpoint, but maybe the line is the
117 # first line of a function with breakpoint set by function name.
118 lineno = frame.f_code.co_firstlineno
119 if not lineno in self.breaks[filename]:
120 return False
121
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000122 # flag says ok to delete temp. bp
123 (bp, flag) = effective(filename, lineno, frame)
124 if bp:
125 self.currentbp = bp.number
126 if (flag and bp.temporary):
127 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000128 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000129 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000130 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000131
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000132 def do_clear(self, arg):
133 raise NotImplementedError, "subclass of bdb must implement do_clear()"
134
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000135 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000136 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000137
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000138 # Derived classes should override the user_* methods
139 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000140
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000141 def user_call(self, frame, argument_list):
142 """This method is called when there is the remote possibility
143 that we ever need to stop in this function."""
144 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000145
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000146 def user_line(self, frame):
147 """This method is called when we stop or break at this line."""
148 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000149
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000150 def user_return(self, frame, return_value):
151 """This method is called when a return trap is set here."""
152 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000153
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000154 def user_exception(self, frame, exc_info):
155 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000156 """This method is called if an exception occurs,
157 but only if we are to stop at or just below this level."""
158 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000159
Georg Brandle64de922010-08-01 22:10:15 +0000160 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
Benjamin Peterson98353942008-05-11 14:13:25 +0000161 self.stopframe = stopframe
162 self.returnframe = returnframe
163 self.quitting = 0
Georg Brandle64de922010-08-01 22:10:15 +0000164 # stoplineno >= 0 means: stop at line >= the stoplineno
165 # stoplineno -1 means: don't stop at all
Benjamin Peterson98353942008-05-11 14:13:25 +0000166 self.stoplineno = stoplineno
167
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000168 # Derived classes and clients can call the following methods
169 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000170
Benjamin Peterson98353942008-05-11 14:13:25 +0000171 def set_until(self, frame): #the name "until" is borrowed from gdb
172 """Stop when the line with the line no greater than the current one is
173 reached or when returning from current frame"""
174 self._set_stopinfo(frame, frame, frame.f_lineno+1)
175
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000176 def set_step(self):
177 """Stop after one line of code."""
Georg Brandle64de922010-08-01 22:10:15 +0000178 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000179
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000180 def set_next(self, frame):
181 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000182 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000183
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000184 def set_return(self, frame):
185 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000186 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000187
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000188 def set_trace(self, frame=None):
189 """Start debugging from `frame`.
190
191 If frame is not specified, debugging starts from caller's frame.
192 """
193 if frame is None:
194 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000195 self.reset()
196 while frame:
197 frame.f_trace = self.trace_dispatch
198 self.botframe = frame
199 frame = frame.f_back
200 self.set_step()
201 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000203 def set_continue(self):
204 # Don't stop except at breakpoints or when finished
Georg Brandle64de922010-08-01 22:10:15 +0000205 self._set_stopinfo(self.botframe, None, -1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000206 if not self.breaks:
207 # no breakpoints; run without debugger overhead
208 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000209 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000210 while frame and frame is not self.botframe:
211 del frame.f_trace
212 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000213
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000214 def set_quit(self):
215 self.stopframe = self.botframe
216 self.returnframe = None
217 self.quitting = 1
218 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000219
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000220 # Derived classes and clients can call the following methods
221 # to manipulate breakpoints. These methods return an
222 # error message is something went wrong, None if all is well.
223 # Set_break prints out the breakpoint line and file:lineno.
224 # Call self.get_*break*() to see the breakpoints or better
225 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000226
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000227 def set_break(self, filename, lineno, temporary=0, cond = None,
228 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000229 filename = self.canonic(filename)
230 import linecache # Import as late as possible
231 line = linecache.getline(filename, lineno)
232 if not line:
233 return 'Line %s:%d does not exist' % (filename,
234 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000235 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000236 self.breaks[filename] = []
237 list = self.breaks[filename]
238 if not lineno in list:
239 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000240 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000241
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000242 def clear_break(self, filename, lineno):
243 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000244 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000245 return 'There are no breakpoints in %s' % filename
246 if lineno not in self.breaks[filename]:
247 return 'There is no breakpoint at %s:%d' % (filename,
248 lineno)
249 # If there's only one bp in the list for that file,line
250 # pair, then remove the breaks entry
251 for bp in Breakpoint.bplist[filename, lineno][:]:
252 bp.deleteMe()
253 if not Breakpoint.bplist.has_key((filename, lineno)):
254 self.breaks[filename].remove(lineno)
255 if not self.breaks[filename]:
256 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000257
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000258 def clear_bpbynumber(self, arg):
259 try:
260 number = int(arg)
261 except:
262 return 'Non-numeric breakpoint number (%s)' % arg
263 try:
264 bp = Breakpoint.bpbynumber[number]
265 except IndexError:
266 return 'Breakpoint number (%d) out of range' % number
267 if not bp:
268 return 'Breakpoint (%d) already deleted' % number
269 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000270
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000271 def clear_all_file_breaks(self, filename):
272 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000273 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000274 return 'There are no breakpoints in %s' % filename
275 for line in self.breaks[filename]:
276 blist = Breakpoint.bplist[filename, line]
277 for bp in blist:
278 bp.deleteMe()
279 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000280
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000281 def clear_all_breaks(self):
282 if not self.breaks:
283 return 'There are no breakpoints'
284 for bp in Breakpoint.bpbynumber:
285 if bp:
286 bp.deleteMe()
287 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000288
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000289 def get_break(self, filename, lineno):
290 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000291 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000292 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000293
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000294 def get_breaks(self, filename, lineno):
295 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000296 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000297 lineno in self.breaks[filename] and \
298 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000299
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000300 def get_file_breaks(self, filename):
301 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000302 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000303 return self.breaks[filename]
304 else:
305 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000306
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000307 def get_all_breaks(self):
308 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000309
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000310 # Derived classes and clients can call the following method
311 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000312
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000313 def get_stack(self, f, t):
314 stack = []
315 if t and t.tb_frame is f:
316 t = t.tb_next
317 while f is not None:
318 stack.append((f, f.f_lineno))
319 if f is self.botframe:
320 break
321 f = f.f_back
322 stack.reverse()
323 i = max(0, len(stack) - 1)
324 while t is not None:
325 stack.append((t.tb_frame, t.tb_lineno))
326 t = t.tb_next
Benjamin Petersonaf956f12008-10-22 21:19:41 +0000327 if f is None:
328 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000329 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000330
331 #
332
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000333 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000334 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000335 frame, lineno = frame_lineno
336 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000337 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000338 if frame.f_code.co_name:
339 s = s + frame.f_code.co_name
340 else:
341 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000342 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000343 args = frame.f_locals['__args__']
344 else:
345 args = None
346 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000347 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000348 else:
349 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000350 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000351 rv = frame.f_locals['__return__']
352 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000353 s = s + repr.repr(rv)
Nick Coghlan30327242008-12-14 11:30:16 +0000354 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000355 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000356 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000357
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000358 # The following two methods can be called by clients to use
359 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000360
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000361 def run(self, cmd, globals=None, locals=None):
362 if globals is None:
363 import __main__
364 globals = __main__.__dict__
365 if locals is None:
366 locals = globals
367 self.reset()
368 sys.settrace(self.trace_dispatch)
369 if not isinstance(cmd, types.CodeType):
370 cmd = cmd+'\n'
371 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000372 exec cmd in globals, locals
373 except BdbQuit:
374 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000375 finally:
376 self.quitting = 1
377 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000378
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000379 def runeval(self, expr, globals=None, locals=None):
380 if globals is None:
381 import __main__
382 globals = __main__.__dict__
383 if locals is None:
384 locals = globals
385 self.reset()
386 sys.settrace(self.trace_dispatch)
387 if not isinstance(expr, types.CodeType):
388 expr = expr+'\n'
389 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000390 return eval(expr, globals, locals)
391 except BdbQuit:
392 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000393 finally:
394 self.quitting = 1
395 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000396
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000397 def runctx(self, cmd, globals, locals):
398 # B/W compatibility
399 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000400
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000401 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000402
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000403 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000404 self.reset()
405 sys.settrace(self.trace_dispatch)
406 res = None
407 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000408 res = func(*args, **kwds)
409 except BdbQuit:
410 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000411 finally:
412 self.quitting = 1
413 sys.settrace(None)
414 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000415
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000416
Guido van Rossumb6775db1994-08-01 11:34:53 +0000417def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000418 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419
Guido van Rossumd93643f1998-09-11 22:38:35 +0000420
421class Breakpoint:
422
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000423 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000424
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000425 Implements temporary breakpoints, ignore counts, disabling and
426 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000427
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000428 Breakpoints are indexed by number through bpbynumber and by
429 the file,line tuple using bplist. The former points to a
430 single instance of class Breakpoint. The latter points to a
431 list of such instances since there may be more than one
432 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000433
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000434 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000435
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000436 # XXX Keeping state in the class is a mistake -- this means
437 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000438
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000439 next = 1 # Next bp to be assigned
440 bplist = {} # indexed by (file, lineno) tuple
441 bpbynumber = [None] # Each entry is None or an instance of Bpt
442 # index 0 is unused, except for marking an
443 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000444
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000445 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
446 self.funcname = funcname
447 # Needed if funcname is not None.
448 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000449 self.file = file # This better be in canonical form!
450 self.line = line
451 self.temporary = temporary
452 self.cond = cond
453 self.enabled = 1
454 self.ignore = 0
455 self.hits = 0
456 self.number = Breakpoint.next
457 Breakpoint.next = Breakpoint.next + 1
458 # Build the two lists
459 self.bpbynumber.append(self)
460 if self.bplist.has_key((file, line)):
461 self.bplist[file, line].append(self)
462 else:
463 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000464
Tim Peters11cf6052001-01-14 21:54:20 +0000465
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000466 def deleteMe(self):
467 index = (self.file, self.line)
468 self.bpbynumber[self.number] = None # No longer in list
469 self.bplist[index].remove(self)
470 if not self.bplist[index]:
471 # No more bp for this f:l combo
472 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000473
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000474 def enable(self):
475 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000476
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000477 def disable(self):
478 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000479
Georg Brandl19564802006-05-10 17:13:20 +0000480 def bpprint(self, out=None):
481 if out is None:
482 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000483 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000484 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000485 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000486 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000487 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000488 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000489 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000490 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000491 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
492 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000493 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000494 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000495 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000496 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000497 if (self.hits):
498 if (self.hits > 1): ss = 's'
499 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000500 print >>out, ('\tbreakpoint already hit %d time%s' %
501 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000502
503# -----------end of Breakpoint class----------
504
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000505def checkfuncname(b, frame):
506 """Check whether we should break here because of `b.funcname`."""
507 if not b.funcname:
508 # Breakpoint was set via line number.
509 if b.line != frame.f_lineno:
510 # Breakpoint was set at a line with a def statement and the function
511 # defined is called: don't break.
512 return False
513 return True
514
515 # Breakpoint set via function name.
516
517 if frame.f_code.co_name != b.funcname:
518 # It's not a function call, but rather execution of def statement.
519 return False
520
521 # We are in the right frame.
522 if not b.func_first_executable_line:
523 # The function is entered for the 1st time.
524 b.func_first_executable_line = frame.f_lineno
525
526 if b.func_first_executable_line != frame.f_lineno:
527 # But we are not at the first line number: don't break.
528 return False
529 return True
530
Guido van Rossumd93643f1998-09-11 22:38:35 +0000531# Determines if there is an effective (active) breakpoint at this
532# line of code. Returns breakpoint number or 0 if none
533def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000534 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000535
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000536 Called only if we know there is a bpt at this
537 location. Returns breakpoint that was triggered and a flag
538 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000539
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000540 """
541 possibles = Breakpoint.bplist[file,line]
542 for i in range(0, len(possibles)):
543 b = possibles[i]
544 if b.enabled == 0:
545 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000546 if not checkfuncname(b, frame):
547 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000548 # Count every hit when bp is enabled
549 b.hits = b.hits + 1
550 if not b.cond:
551 # If unconditional, and ignoring,
552 # go on to next, else break
553 if b.ignore > 0:
554 b.ignore = b.ignore -1
555 continue
556 else:
557 # breakpoint and marker that's ok
558 # to delete if temporary
559 return (b,1)
560 else:
561 # Conditional bp.
562 # Ignore count applies only to those bpt hits where the
563 # condition evaluates to true.
564 try:
565 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000566 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000567 if val:
568 if b.ignore > 0:
569 b.ignore = b.ignore -1
570 # continue
571 else:
572 return (b,1)
573 # else:
574 # continue
575 except:
576 # if eval fails, most conservative
577 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000578 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000579 # Don't delete temporary,
580 # as another hint to user.
581 return (b,0)
582 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000583
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000584# -------------------- testing --------------------
585
586class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000587 def user_call(self, frame, args):
588 name = frame.f_code.co_name
589 if not name: name = '???'
590 print '+++ call', name, args
591 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000592 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000593 name = frame.f_code.co_name
594 if not name: name = '???'
595 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlan30327242008-12-14 11:30:16 +0000596 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000597 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000598 def user_return(self, frame, retval):
599 print '+++ return', retval
600 def user_exception(self, frame, exc_stuff):
601 print '+++ exception', exc_stuff
602 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000603
604def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000605 print 'foo(', n, ')'
606 x = bar(n*10)
607 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000608
609def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000610 print 'bar(', a, ')'
611 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000612
613def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000614 t = Tdb()
615 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000616
617# end