blob: d0fcff8dc9494f22dd636319ab59b572535ba033 [file] [log] [blame]
Guido van Rossum4acc25b2000-02-02 15:10:15 +00001"""Debugger basics"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00002
Georg Brandl4d4313d2009-05-05 08:54:11 +00003import fnmatch
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00004import sys
Barry Warsaw148ffbc1999-09-09 23:24:33 +00005import os
Guido van Rossum4808dcb1996-10-15 14:40:21 +00006import types
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00007
Skip Montanaroe99d5ea2001-01-20 19:54:20 +00008__all__ = ["BdbQuit","Bdb","Breakpoint"]
9
Neal Norwitz93cf79f2002-03-31 14:06:41 +000010class BdbQuit(Exception):
11 """Exception to give up completely"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000012
13
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000014class Bdb:
Tim Peters11cf6052001-01-14 21:54:20 +000015
Guido van Rossum4acc25b2000-02-02 15:10:15 +000016 """Generic Python debugger base class.
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000017
Guido van Rossum4acc25b2000-02-02 15:10:15 +000018 This class takes care of details of the trace facility;
19 a derived class should implement user interaction.
20 The standard debugger class (pdb.Pdb) is an example.
21 """
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000022
Georg Brandl4d4313d2009-05-05 08:54:11 +000023 def __init__(self, skip=None):
24 self.skip = set(skip) if skip else None
Guido van Rossum4acc25b2000-02-02 15:10:15 +000025 self.breaks = {}
26 self.fncache = {}
Barry Warsaw148ffbc1999-09-09 23:24:33 +000027
Guido van Rossum4acc25b2000-02-02 15:10:15 +000028 def canonic(self, filename):
Guido van Rossum42f53322001-11-29 02:50:15 +000029 if filename == "<" + filename[1:-1] + ">":
30 return filename
Guido van Rossum4acc25b2000-02-02 15:10:15 +000031 canonic = self.fncache.get(filename)
32 if not canonic:
33 canonic = os.path.abspath(filename)
Guido van Rossumbdba3202002-02-25 23:23:24 +000034 canonic = os.path.normcase(canonic)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000035 self.fncache[filename] = canonic
36 return canonic
Tim Peters11cf6052001-01-14 21:54:20 +000037
Guido van Rossum4acc25b2000-02-02 15:10:15 +000038 def reset(self):
39 import linecache
40 linecache.checkcache()
41 self.botframe = None
Benjamin Peterson98353942008-05-11 14:13:25 +000042 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +000043
Guido van Rossum4acc25b2000-02-02 15:10:15 +000044 def trace_dispatch(self, frame, event, arg):
45 if self.quitting:
46 return # None
47 if event == 'line':
48 return self.dispatch_line(frame)
49 if event == 'call':
50 return self.dispatch_call(frame, arg)
51 if event == 'return':
52 return self.dispatch_return(frame, arg)
53 if event == 'exception':
54 return self.dispatch_exception(frame, arg)
Nicholas Bastinc69ebe82004-03-24 21:57:10 +000055 if event == 'c_call':
56 return self.trace_dispatch
57 if event == 'c_exception':
58 return self.trace_dispatch
59 if event == 'c_return':
60 return self.trace_dispatch
Walter Dörwald70a6b492004-02-12 17:35:32 +000061 print 'bdb.Bdb.dispatch: unknown debugging event:', repr(event)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000062 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000063
Guido van Rossum4acc25b2000-02-02 15:10:15 +000064 def dispatch_line(self, frame):
65 if self.stop_here(frame) or self.break_here(frame):
66 self.user_line(frame)
67 if self.quitting: raise BdbQuit
68 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000069
Guido van Rossum4acc25b2000-02-02 15:10:15 +000070 def dispatch_call(self, frame, arg):
71 # XXX 'arg' is no longer used
72 if self.botframe is None:
73 # First call of dispatch since reset()
Christian Tismer313a7512002-05-28 08:04:00 +000074 self.botframe = frame.f_back # (CT) Note that this may also be None!
Guido van Rossum4acc25b2000-02-02 15:10:15 +000075 return self.trace_dispatch
76 if not (self.stop_here(frame) or self.break_anywhere(frame)):
77 # No need to trace this function
78 return # None
79 self.user_call(frame, arg)
80 if self.quitting: raise BdbQuit
81 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000082
Guido van Rossum4acc25b2000-02-02 15:10:15 +000083 def dispatch_return(self, frame, arg):
84 if self.stop_here(frame) or frame == self.returnframe:
85 self.user_return(frame, arg)
86 if self.quitting: raise BdbQuit
Just van Rossumae1f65f2001-06-25 18:01:24 +000087 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000088
Guido van Rossum4acc25b2000-02-02 15:10:15 +000089 def dispatch_exception(self, frame, arg):
90 if self.stop_here(frame):
91 self.user_exception(frame, arg)
92 if self.quitting: raise BdbQuit
93 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000094
Guido van Rossum4acc25b2000-02-02 15:10:15 +000095 # Normally derived classes don't override the following
96 # methods, but they may if they want to redefine the
97 # definition of stopping and breakpoints.
Tim Peters11cf6052001-01-14 21:54:20 +000098
Georg Brandl4d4313d2009-05-05 08:54:11 +000099 def is_skipped_module(self, module_name):
100 for pattern in self.skip:
101 if fnmatch.fnmatch(module_name, pattern):
102 return True
103 return False
104
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000105 def stop_here(self, frame):
Neal Norwitz72a2b4d2002-05-29 00:54:38 +0000106 # (CT) stopframe may now also be None, see dispatch_call.
107 # (CT) the former test for None is therefore removed from here.
Georg Brandl4d4313d2009-05-05 08:54:11 +0000108 if self.skip and \
109 self.is_skipped_module(frame.f_globals.get('__name__')):
110 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000111 if frame is self.stopframe:
Georg Brandl50775992010-08-01 19:33:15 +0000112 if self.stoplineno == -1:
113 return False
Benjamin Peterson98353942008-05-11 14:13:25 +0000114 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000115 while frame is not None and frame is not self.stopframe:
116 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000117 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000118 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000119 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000120
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000121 def break_here(self, frame):
122 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000123 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000124 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000125 lineno = frame.f_lineno
126 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000127 # The line itself has no breakpoint, but maybe the line is the
128 # first line of a function with breakpoint set by function name.
129 lineno = frame.f_code.co_firstlineno
130 if not lineno in self.breaks[filename]:
131 return False
132
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000133 # flag says ok to delete temp. bp
134 (bp, flag) = effective(filename, lineno, frame)
135 if bp:
136 self.currentbp = bp.number
137 if (flag and bp.temporary):
138 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000139 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000140 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000141 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000142
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000143 def do_clear(self, arg):
144 raise NotImplementedError, "subclass of bdb must implement do_clear()"
145
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000146 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000147 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000148
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000149 # Derived classes should override the user_* methods
150 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000151
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000152 def user_call(self, frame, argument_list):
153 """This method is called when there is the remote possibility
154 that we ever need to stop in this function."""
155 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000156
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000157 def user_line(self, frame):
158 """This method is called when we stop or break at this line."""
159 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000160
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000161 def user_return(self, frame, return_value):
162 """This method is called when a return trap is set here."""
163 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000164
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000165 def user_exception(self, frame, exc_info):
166 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000167 """This method is called if an exception occurs,
168 but only if we are to stop at or just below this level."""
169 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000170
Georg Brandl50775992010-08-01 19:33:15 +0000171 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
Benjamin Peterson98353942008-05-11 14:13:25 +0000172 self.stopframe = stopframe
173 self.returnframe = returnframe
174 self.quitting = 0
Georg Brandl50775992010-08-01 19:33:15 +0000175 # stoplineno >= 0 means: stop at line >= the stoplineno
176 # stoplineno -1 means: don't stop at all
Benjamin Peterson98353942008-05-11 14:13:25 +0000177 self.stoplineno = stoplineno
178
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000179 # Derived classes and clients can call the following methods
180 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000181
Benjamin Peterson98353942008-05-11 14:13:25 +0000182 def set_until(self, frame): #the name "until" is borrowed from gdb
183 """Stop when the line with the line no greater than the current one is
184 reached or when returning from current frame"""
185 self._set_stopinfo(frame, frame, frame.f_lineno+1)
186
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000187 def set_step(self):
188 """Stop after one line of code."""
Georg Brandl50775992010-08-01 19:33:15 +0000189 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000190
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000191 def set_next(self, frame):
192 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000193 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000194
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000195 def set_return(self, frame):
196 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000197 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000198
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000199 def set_trace(self, frame=None):
200 """Start debugging from `frame`.
201
202 If frame is not specified, debugging starts from caller's frame.
203 """
204 if frame is None:
205 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000206 self.reset()
207 while frame:
208 frame.f_trace = self.trace_dispatch
209 self.botframe = frame
210 frame = frame.f_back
211 self.set_step()
212 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000213
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000214 def set_continue(self):
215 # Don't stop except at breakpoints or when finished
Georg Brandl50775992010-08-01 19:33:15 +0000216 self._set_stopinfo(self.botframe, None, -1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000217 if not self.breaks:
218 # no breakpoints; run without debugger overhead
219 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000220 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000221 while frame and frame is not self.botframe:
222 del frame.f_trace
223 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000224
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000225 def set_quit(self):
226 self.stopframe = self.botframe
227 self.returnframe = None
228 self.quitting = 1
229 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000230
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000231 # Derived classes and clients can call the following methods
232 # to manipulate breakpoints. These methods return an
233 # error message is something went wrong, None if all is well.
234 # Set_break prints out the breakpoint line and file:lineno.
235 # Call self.get_*break*() to see the breakpoints or better
236 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000237
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000238 def set_break(self, filename, lineno, temporary=0, cond = None,
239 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000240 filename = self.canonic(filename)
241 import linecache # Import as late as possible
242 line = linecache.getline(filename, lineno)
243 if not line:
244 return 'Line %s:%d does not exist' % (filename,
245 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000246 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000247 self.breaks[filename] = []
248 list = self.breaks[filename]
249 if not lineno in list:
250 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000251 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000252
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000253 def clear_break(self, filename, lineno):
254 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000255 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000256 return 'There are no breakpoints in %s' % filename
257 if lineno not in self.breaks[filename]:
258 return 'There is no breakpoint at %s:%d' % (filename,
259 lineno)
260 # If there's only one bp in the list for that file,line
261 # pair, then remove the breaks entry
262 for bp in Breakpoint.bplist[filename, lineno][:]:
263 bp.deleteMe()
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000264 if (filename, lineno) not in Breakpoint.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000265 self.breaks[filename].remove(lineno)
266 if not self.breaks[filename]:
267 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000268
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000269 def clear_bpbynumber(self, arg):
270 try:
271 number = int(arg)
272 except:
273 return 'Non-numeric breakpoint number (%s)' % arg
274 try:
275 bp = Breakpoint.bpbynumber[number]
276 except IndexError:
277 return 'Breakpoint number (%d) out of range' % number
278 if not bp:
279 return 'Breakpoint (%d) already deleted' % number
280 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000281
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000282 def clear_all_file_breaks(self, filename):
283 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000284 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000285 return 'There are no breakpoints in %s' % filename
286 for line in self.breaks[filename]:
287 blist = Breakpoint.bplist[filename, line]
288 for bp in blist:
289 bp.deleteMe()
290 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000291
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000292 def clear_all_breaks(self):
293 if not self.breaks:
294 return 'There are no breakpoints'
295 for bp in Breakpoint.bpbynumber:
296 if bp:
297 bp.deleteMe()
298 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000299
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000300 def get_break(self, filename, lineno):
301 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000302 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000303 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000304
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000305 def get_breaks(self, filename, lineno):
306 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000307 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000308 lineno in self.breaks[filename] and \
309 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000310
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000311 def get_file_breaks(self, filename):
312 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000313 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000314 return self.breaks[filename]
315 else:
316 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000317
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000318 def get_all_breaks(self):
319 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000320
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000321 # Derived classes and clients can call the following method
322 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000323
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000324 def get_stack(self, f, t):
325 stack = []
326 if t and t.tb_frame is f:
327 t = t.tb_next
328 while f is not None:
329 stack.append((f, f.f_lineno))
330 if f is self.botframe:
331 break
332 f = f.f_back
333 stack.reverse()
334 i = max(0, len(stack) - 1)
335 while t is not None:
336 stack.append((t.tb_frame, t.tb_lineno))
337 t = t.tb_next
Benjamin Petersonc18574c2008-10-22 21:16:34 +0000338 if f is None:
339 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000340 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000341
342 #
343
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000344 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000345 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000346 frame, lineno = frame_lineno
347 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000348 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000349 if frame.f_code.co_name:
350 s = s + frame.f_code.co_name
351 else:
352 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000353 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000354 args = frame.f_locals['__args__']
355 else:
356 args = None
357 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000358 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000359 else:
360 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000361 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000362 rv = frame.f_locals['__return__']
363 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000364 s = s + repr.repr(rv)
Nick Coghlana2053472008-12-14 10:54:50 +0000365 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000366 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000367 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000368
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000369 # The following two methods can be called by clients to use
370 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000371
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000372 def run(self, cmd, globals=None, locals=None):
373 if globals is None:
374 import __main__
375 globals = __main__.__dict__
376 if locals is None:
377 locals = globals
378 self.reset()
379 sys.settrace(self.trace_dispatch)
380 if not isinstance(cmd, types.CodeType):
381 cmd = cmd+'\n'
382 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000383 exec cmd in globals, locals
384 except BdbQuit:
385 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000386 finally:
387 self.quitting = 1
388 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000389
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000390 def runeval(self, expr, globals=None, locals=None):
391 if globals is None:
392 import __main__
393 globals = __main__.__dict__
394 if locals is None:
395 locals = globals
396 self.reset()
397 sys.settrace(self.trace_dispatch)
398 if not isinstance(expr, types.CodeType):
399 expr = expr+'\n'
400 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000401 return eval(expr, globals, locals)
402 except BdbQuit:
403 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000404 finally:
405 self.quitting = 1
406 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000407
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000408 def runctx(self, cmd, globals, locals):
409 # B/W compatibility
410 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000411
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000412 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000413
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000414 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000415 self.reset()
416 sys.settrace(self.trace_dispatch)
417 res = None
418 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000419 res = func(*args, **kwds)
420 except BdbQuit:
421 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000422 finally:
423 self.quitting = 1
424 sys.settrace(None)
425 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000426
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000427
Guido van Rossumb6775db1994-08-01 11:34:53 +0000428def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000429 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000430
Guido van Rossumd93643f1998-09-11 22:38:35 +0000431
432class Breakpoint:
433
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000434 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000435
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000436 Implements temporary breakpoints, ignore counts, disabling and
437 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000438
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000439 Breakpoints are indexed by number through bpbynumber and by
440 the file,line tuple using bplist. The former points to a
441 single instance of class Breakpoint. The latter points to a
442 list of such instances since there may be more than one
443 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000444
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000445 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000446
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000447 # XXX Keeping state in the class is a mistake -- this means
448 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000449
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000450 next = 1 # Next bp to be assigned
451 bplist = {} # indexed by (file, lineno) tuple
452 bpbynumber = [None] # Each entry is None or an instance of Bpt
453 # index 0 is unused, except for marking an
454 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000455
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000456 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
457 self.funcname = funcname
458 # Needed if funcname is not None.
459 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000460 self.file = file # This better be in canonical form!
461 self.line = line
462 self.temporary = temporary
463 self.cond = cond
464 self.enabled = 1
465 self.ignore = 0
466 self.hits = 0
467 self.number = Breakpoint.next
468 Breakpoint.next = Breakpoint.next + 1
469 # Build the two lists
470 self.bpbynumber.append(self)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000471 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000472 self.bplist[file, line].append(self)
473 else:
474 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000475
Tim Peters11cf6052001-01-14 21:54:20 +0000476
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000477 def deleteMe(self):
478 index = (self.file, self.line)
479 self.bpbynumber[self.number] = None # No longer in list
480 self.bplist[index].remove(self)
481 if not self.bplist[index]:
482 # No more bp for this f:l combo
483 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000484
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000485 def enable(self):
486 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000487
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000488 def disable(self):
489 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000490
Georg Brandl19564802006-05-10 17:13:20 +0000491 def bpprint(self, out=None):
492 if out is None:
493 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000494 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000495 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000496 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000497 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000498 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000499 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000500 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000501 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000502 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
503 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000504 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000505 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000506 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000507 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000508 if (self.hits):
509 if (self.hits > 1): ss = 's'
510 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000511 print >>out, ('\tbreakpoint already hit %d time%s' %
512 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000513
514# -----------end of Breakpoint class----------
515
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000516def checkfuncname(b, frame):
517 """Check whether we should break here because of `b.funcname`."""
518 if not b.funcname:
519 # Breakpoint was set via line number.
520 if b.line != frame.f_lineno:
521 # Breakpoint was set at a line with a def statement and the function
522 # defined is called: don't break.
523 return False
524 return True
525
526 # Breakpoint set via function name.
527
528 if frame.f_code.co_name != b.funcname:
529 # It's not a function call, but rather execution of def statement.
530 return False
531
532 # We are in the right frame.
533 if not b.func_first_executable_line:
534 # The function is entered for the 1st time.
535 b.func_first_executable_line = frame.f_lineno
536
537 if b.func_first_executable_line != frame.f_lineno:
538 # But we are not at the first line number: don't break.
539 return False
540 return True
541
Guido van Rossumd93643f1998-09-11 22:38:35 +0000542# Determines if there is an effective (active) breakpoint at this
543# line of code. Returns breakpoint number or 0 if none
544def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000545 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000546
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000547 Called only if we know there is a bpt at this
548 location. Returns breakpoint that was triggered and a flag
549 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000550
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000551 """
552 possibles = Breakpoint.bplist[file,line]
553 for i in range(0, len(possibles)):
554 b = possibles[i]
555 if b.enabled == 0:
556 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000557 if not checkfuncname(b, frame):
558 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000559 # Count every hit when bp is enabled
560 b.hits = b.hits + 1
561 if not b.cond:
562 # If unconditional, and ignoring,
563 # go on to next, else break
564 if b.ignore > 0:
565 b.ignore = b.ignore -1
566 continue
567 else:
568 # breakpoint and marker that's ok
569 # to delete if temporary
570 return (b,1)
571 else:
572 # Conditional bp.
573 # Ignore count applies only to those bpt hits where the
574 # condition evaluates to true.
575 try:
576 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000577 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000578 if val:
579 if b.ignore > 0:
580 b.ignore = b.ignore -1
581 # continue
582 else:
583 return (b,1)
584 # else:
585 # continue
586 except:
587 # if eval fails, most conservative
588 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000589 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000590 # Don't delete temporary,
591 # as another hint to user.
592 return (b,0)
593 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000594
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000595# -------------------- testing --------------------
596
597class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000598 def user_call(self, frame, args):
599 name = frame.f_code.co_name
600 if not name: name = '???'
601 print '+++ call', name, args
602 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000603 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000604 name = frame.f_code.co_name
605 if not name: name = '???'
606 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlana2053472008-12-14 10:54:50 +0000607 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000608 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000609 def user_return(self, frame, retval):
610 print '+++ return', retval
611 def user_exception(self, frame, exc_stuff):
612 print '+++ exception', exc_stuff
613 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000614
615def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000616 print 'foo(', n, ')'
617 x = bar(n*10)
618 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000619
620def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000621 print 'bar(', a, ')'
622 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000623
624def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000625 t = Tdb()
626 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000627
628# end