blob: 5288cc0d77b3fff578e0312df2922fe926db43bf [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:
Benjamin Peterson98353942008-05-11 14:13:25 +0000101 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000102 while frame is not None and frame is not self.stopframe:
103 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000104 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000105 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000106 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000107
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000108 def break_here(self, frame):
109 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000110 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000111 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000112 lineno = frame.f_lineno
113 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000114 # The line itself has no breakpoint, but maybe the line is the
115 # first line of a function with breakpoint set by function name.
116 lineno = frame.f_code.co_firstlineno
117 if not lineno in self.breaks[filename]:
118 return False
119
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000120 # flag says ok to delete temp. bp
121 (bp, flag) = effective(filename, lineno, frame)
122 if bp:
123 self.currentbp = bp.number
124 if (flag and bp.temporary):
125 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000126 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000127 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000128 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000129
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000130 def do_clear(self, arg):
131 raise NotImplementedError, "subclass of bdb must implement do_clear()"
132
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000133 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000134 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000135
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000136 # Derived classes should override the user_* methods
137 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000138
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000139 def user_call(self, frame, argument_list):
140 """This method is called when there is the remote possibility
141 that we ever need to stop in this function."""
142 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000143
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000144 def user_line(self, frame):
145 """This method is called when we stop or break at this line."""
146 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000147
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000148 def user_return(self, frame, return_value):
149 """This method is called when a return trap is set here."""
150 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000151
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000152 def user_exception(self, frame, exc_info):
153 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000154 """This method is called if an exception occurs,
155 but only if we are to stop at or just below this level."""
156 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000157
Benjamin Peterson98353942008-05-11 14:13:25 +0000158 def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1):
159 self.stopframe = stopframe
160 self.returnframe = returnframe
161 self.quitting = 0
162 self.stoplineno = stoplineno
163
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000164 # Derived classes and clients can call the following methods
165 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000166
Benjamin Peterson98353942008-05-11 14:13:25 +0000167 def set_until(self, frame): #the name "until" is borrowed from gdb
168 """Stop when the line with the line no greater than the current one is
169 reached or when returning from current frame"""
170 self._set_stopinfo(frame, frame, frame.f_lineno+1)
171
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000172 def set_step(self):
173 """Stop after one line of code."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000174 self._set_stopinfo(None,None)
Tim Peters11cf6052001-01-14 21:54:20 +0000175
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000176 def set_next(self, frame):
177 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000178 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000179
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000180 def set_return(self, frame):
181 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000182 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000183
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000184 def set_trace(self, frame=None):
185 """Start debugging from `frame`.
186
187 If frame is not specified, debugging starts from caller's frame.
188 """
189 if frame is None:
190 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000191 self.reset()
192 while frame:
193 frame.f_trace = self.trace_dispatch
194 self.botframe = frame
195 frame = frame.f_back
196 self.set_step()
197 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000199 def set_continue(self):
200 # Don't stop except at breakpoints or when finished
Benjamin Peterson98353942008-05-11 14:13:25 +0000201 self._set_stopinfo(self.botframe, None)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000202 if not self.breaks:
203 # no breakpoints; run without debugger overhead
204 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000205 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000206 while frame and frame is not self.botframe:
207 del frame.f_trace
208 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000209
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000210 def set_quit(self):
211 self.stopframe = self.botframe
212 self.returnframe = None
213 self.quitting = 1
214 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000215
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000216 # Derived classes and clients can call the following methods
217 # to manipulate breakpoints. These methods return an
218 # error message is something went wrong, None if all is well.
219 # Set_break prints out the breakpoint line and file:lineno.
220 # Call self.get_*break*() to see the breakpoints or better
221 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000222
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000223 def set_break(self, filename, lineno, temporary=0, cond = None,
224 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000225 filename = self.canonic(filename)
226 import linecache # Import as late as possible
227 line = linecache.getline(filename, lineno)
228 if not line:
229 return 'Line %s:%d does not exist' % (filename,
230 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000231 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000232 self.breaks[filename] = []
233 list = self.breaks[filename]
234 if not lineno in list:
235 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000236 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000237
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000238 def clear_break(self, filename, lineno):
239 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000240 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000241 return 'There are no breakpoints in %s' % filename
242 if lineno not in self.breaks[filename]:
243 return 'There is no breakpoint at %s:%d' % (filename,
244 lineno)
245 # If there's only one bp in the list for that file,line
246 # pair, then remove the breaks entry
247 for bp in Breakpoint.bplist[filename, lineno][:]:
248 bp.deleteMe()
249 if not Breakpoint.bplist.has_key((filename, lineno)):
250 self.breaks[filename].remove(lineno)
251 if not self.breaks[filename]:
252 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000253
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000254 def clear_bpbynumber(self, arg):
255 try:
256 number = int(arg)
257 except:
258 return 'Non-numeric breakpoint number (%s)' % arg
259 try:
260 bp = Breakpoint.bpbynumber[number]
261 except IndexError:
262 return 'Breakpoint number (%d) out of range' % number
263 if not bp:
264 return 'Breakpoint (%d) already deleted' % number
265 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000266
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000267 def clear_all_file_breaks(self, filename):
268 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000269 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000270 return 'There are no breakpoints in %s' % filename
271 for line in self.breaks[filename]:
272 blist = Breakpoint.bplist[filename, line]
273 for bp in blist:
274 bp.deleteMe()
275 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000276
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000277 def clear_all_breaks(self):
278 if not self.breaks:
279 return 'There are no breakpoints'
280 for bp in Breakpoint.bpbynumber:
281 if bp:
282 bp.deleteMe()
283 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000284
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000285 def get_break(self, filename, lineno):
286 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000287 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000288 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000289
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000290 def get_breaks(self, filename, lineno):
291 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000292 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000293 lineno in self.breaks[filename] and \
294 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000295
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000296 def get_file_breaks(self, filename):
297 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000298 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000299 return self.breaks[filename]
300 else:
301 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000302
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000303 def get_all_breaks(self):
304 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000305
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000306 # Derived classes and clients can call the following method
307 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000308
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000309 def get_stack(self, f, t):
310 stack = []
311 if t and t.tb_frame is f:
312 t = t.tb_next
313 while f is not None:
314 stack.append((f, f.f_lineno))
315 if f is self.botframe:
316 break
317 f = f.f_back
318 stack.reverse()
319 i = max(0, len(stack) - 1)
320 while t is not None:
321 stack.append((t.tb_frame, t.tb_lineno))
322 t = t.tb_next
Benjamin Petersonc18574c2008-10-22 21:16:34 +0000323 if f is None:
324 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000325 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000326
327 #
328
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000329 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000330 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000331 frame, lineno = frame_lineno
332 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000333 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000334 if frame.f_code.co_name:
335 s = s + frame.f_code.co_name
336 else:
337 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000338 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000339 args = frame.f_locals['__args__']
340 else:
341 args = None
342 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000343 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000344 else:
345 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000346 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000347 rv = frame.f_locals['__return__']
348 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000349 s = s + repr.repr(rv)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000350 line = linecache.getline(filename, lineno)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000351 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000352 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000353
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000354 # The following two methods can be called by clients to use
355 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000356
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000357 def run(self, cmd, globals=None, locals=None):
358 if globals is None:
359 import __main__
360 globals = __main__.__dict__
361 if locals is None:
362 locals = globals
363 self.reset()
364 sys.settrace(self.trace_dispatch)
365 if not isinstance(cmd, types.CodeType):
366 cmd = cmd+'\n'
367 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000368 exec cmd in globals, locals
369 except BdbQuit:
370 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000371 finally:
372 self.quitting = 1
373 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000374
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000375 def runeval(self, expr, globals=None, locals=None):
376 if globals is None:
377 import __main__
378 globals = __main__.__dict__
379 if locals is None:
380 locals = globals
381 self.reset()
382 sys.settrace(self.trace_dispatch)
383 if not isinstance(expr, types.CodeType):
384 expr = expr+'\n'
385 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000386 return eval(expr, globals, locals)
387 except BdbQuit:
388 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000389 finally:
390 self.quitting = 1
391 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000392
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000393 def runctx(self, cmd, globals, locals):
394 # B/W compatibility
395 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000396
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000397 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000398
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000399 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000400 self.reset()
401 sys.settrace(self.trace_dispatch)
402 res = None
403 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000404 res = func(*args, **kwds)
405 except BdbQuit:
406 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 finally:
408 self.quitting = 1
409 sys.settrace(None)
410 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000411
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000412
Guido van Rossumb6775db1994-08-01 11:34:53 +0000413def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000414 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000415
Guido van Rossumd93643f1998-09-11 22:38:35 +0000416
417class Breakpoint:
418
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000419 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000420
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000421 Implements temporary breakpoints, ignore counts, disabling and
422 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000423
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000424 Breakpoints are indexed by number through bpbynumber and by
425 the file,line tuple using bplist. The former points to a
426 single instance of class Breakpoint. The latter points to a
427 list of such instances since there may be more than one
428 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000429
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000430 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000431
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000432 # XXX Keeping state in the class is a mistake -- this means
433 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000434
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000435 next = 1 # Next bp to be assigned
436 bplist = {} # indexed by (file, lineno) tuple
437 bpbynumber = [None] # Each entry is None or an instance of Bpt
438 # index 0 is unused, except for marking an
439 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000440
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000441 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
442 self.funcname = funcname
443 # Needed if funcname is not None.
444 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000445 self.file = file # This better be in canonical form!
446 self.line = line
447 self.temporary = temporary
448 self.cond = cond
449 self.enabled = 1
450 self.ignore = 0
451 self.hits = 0
452 self.number = Breakpoint.next
453 Breakpoint.next = Breakpoint.next + 1
454 # Build the two lists
455 self.bpbynumber.append(self)
456 if self.bplist.has_key((file, line)):
457 self.bplist[file, line].append(self)
458 else:
459 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000460
Tim Peters11cf6052001-01-14 21:54:20 +0000461
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000462 def deleteMe(self):
463 index = (self.file, self.line)
464 self.bpbynumber[self.number] = None # No longer in list
465 self.bplist[index].remove(self)
466 if not self.bplist[index]:
467 # No more bp for this f:l combo
468 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000469
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000470 def enable(self):
471 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000472
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000473 def disable(self):
474 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000475
Georg Brandl19564802006-05-10 17:13:20 +0000476 def bpprint(self, out=None):
477 if out is None:
478 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000479 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000480 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000481 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000482 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000483 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000484 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000485 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000486 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000487 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
488 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000489 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000490 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000491 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000492 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000493 if (self.hits):
494 if (self.hits > 1): ss = 's'
495 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000496 print >>out, ('\tbreakpoint already hit %d time%s' %
497 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000498
499# -----------end of Breakpoint class----------
500
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000501def checkfuncname(b, frame):
502 """Check whether we should break here because of `b.funcname`."""
503 if not b.funcname:
504 # Breakpoint was set via line number.
505 if b.line != frame.f_lineno:
506 # Breakpoint was set at a line with a def statement and the function
507 # defined is called: don't break.
508 return False
509 return True
510
511 # Breakpoint set via function name.
512
513 if frame.f_code.co_name != b.funcname:
514 # It's not a function call, but rather execution of def statement.
515 return False
516
517 # We are in the right frame.
518 if not b.func_first_executable_line:
519 # The function is entered for the 1st time.
520 b.func_first_executable_line = frame.f_lineno
521
522 if b.func_first_executable_line != frame.f_lineno:
523 # But we are not at the first line number: don't break.
524 return False
525 return True
526
Guido van Rossumd93643f1998-09-11 22:38:35 +0000527# Determines if there is an effective (active) breakpoint at this
528# line of code. Returns breakpoint number or 0 if none
529def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000530 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000531
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000532 Called only if we know there is a bpt at this
533 location. Returns breakpoint that was triggered and a flag
534 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000535
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000536 """
537 possibles = Breakpoint.bplist[file,line]
538 for i in range(0, len(possibles)):
539 b = possibles[i]
540 if b.enabled == 0:
541 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000542 if not checkfuncname(b, frame):
543 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000544 # Count every hit when bp is enabled
545 b.hits = b.hits + 1
546 if not b.cond:
547 # If unconditional, and ignoring,
548 # go on to next, else break
549 if b.ignore > 0:
550 b.ignore = b.ignore -1
551 continue
552 else:
553 # breakpoint and marker that's ok
554 # to delete if temporary
555 return (b,1)
556 else:
557 # Conditional bp.
558 # Ignore count applies only to those bpt hits where the
559 # condition evaluates to true.
560 try:
561 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000562 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000563 if val:
564 if b.ignore > 0:
565 b.ignore = b.ignore -1
566 # continue
567 else:
568 return (b,1)
569 # else:
570 # continue
571 except:
572 # if eval fails, most conservative
573 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000574 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000575 # Don't delete temporary,
576 # as another hint to user.
577 return (b,0)
578 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000579
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000580# -------------------- testing --------------------
581
582class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000583 def user_call(self, frame, args):
584 name = frame.f_code.co_name
585 if not name: name = '???'
586 print '+++ call', name, args
587 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000588 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000589 name = frame.f_code.co_name
590 if not name: name = '???'
591 fn = self.canonic(frame.f_code.co_filename)
592 line = linecache.getline(fn, frame.f_lineno)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000593 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000594 def user_return(self, frame, retval):
595 print '+++ return', retval
596 def user_exception(self, frame, exc_stuff):
597 print '+++ exception', exc_stuff
598 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000599
600def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000601 print 'foo(', n, ')'
602 x = bar(n*10)
603 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000604
605def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000606 print 'bar(', a, ')'
607 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000608
609def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000610 t = Tdb()
611 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000612
613# end