blob: aa6779d76e173f6e267a36f544509fe261273b48 [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:
Benjamin Peterson98353942008-05-11 14:13:25 +0000112 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000113 while frame is not None and frame is not self.stopframe:
114 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000115 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000116 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000117 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000118
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000119 def break_here(self, frame):
120 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000121 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000122 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000123 lineno = frame.f_lineno
124 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000125 # The line itself has no breakpoint, but maybe the line is the
126 # first line of a function with breakpoint set by function name.
127 lineno = frame.f_code.co_firstlineno
128 if not lineno in self.breaks[filename]:
129 return False
130
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000131 # flag says ok to delete temp. bp
132 (bp, flag) = effective(filename, lineno, frame)
133 if bp:
134 self.currentbp = bp.number
135 if (flag and bp.temporary):
136 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000137 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000138 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000139 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000140
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000141 def do_clear(self, arg):
142 raise NotImplementedError, "subclass of bdb must implement do_clear()"
143
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000144 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000145 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000146
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000147 # Derived classes should override the user_* methods
148 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000149
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000150 def user_call(self, frame, argument_list):
151 """This method is called when there is the remote possibility
152 that we ever need to stop in this function."""
153 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000154
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000155 def user_line(self, frame):
156 """This method is called when we stop or break at this line."""
157 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000158
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000159 def user_return(self, frame, return_value):
160 """This method is called when a return trap is set here."""
161 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000162
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000163 def user_exception(self, frame, exc_info):
164 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000165 """This method is called if an exception occurs,
166 but only if we are to stop at or just below this level."""
167 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000168
Benjamin Peterson98353942008-05-11 14:13:25 +0000169 def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1):
170 self.stopframe = stopframe
171 self.returnframe = returnframe
172 self.quitting = 0
173 self.stoplineno = stoplineno
174
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000175 # Derived classes and clients can call the following methods
176 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000177
Benjamin Peterson98353942008-05-11 14:13:25 +0000178 def set_until(self, frame): #the name "until" is borrowed from gdb
179 """Stop when the line with the line no greater than the current one is
180 reached or when returning from current frame"""
181 self._set_stopinfo(frame, frame, frame.f_lineno+1)
182
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000183 def set_step(self):
184 """Stop after one line of code."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000185 self._set_stopinfo(None,None)
Tim Peters11cf6052001-01-14 21:54:20 +0000186
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000187 def set_next(self, frame):
188 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000189 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000190
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000191 def set_return(self, frame):
192 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000193 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000194
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000195 def set_trace(self, frame=None):
196 """Start debugging from `frame`.
197
198 If frame is not specified, debugging starts from caller's frame.
199 """
200 if frame is None:
201 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000202 self.reset()
203 while frame:
204 frame.f_trace = self.trace_dispatch
205 self.botframe = frame
206 frame = frame.f_back
207 self.set_step()
208 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000210 def set_continue(self):
211 # Don't stop except at breakpoints or when finished
Benjamin Peterson98353942008-05-11 14:13:25 +0000212 self._set_stopinfo(self.botframe, None)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000213 if not self.breaks:
214 # no breakpoints; run without debugger overhead
215 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000216 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000217 while frame and frame is not self.botframe:
218 del frame.f_trace
219 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000220
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000221 def set_quit(self):
222 self.stopframe = self.botframe
223 self.returnframe = None
224 self.quitting = 1
225 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000226
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000227 # Derived classes and clients can call the following methods
228 # to manipulate breakpoints. These methods return an
229 # error message is something went wrong, None if all is well.
230 # Set_break prints out the breakpoint line and file:lineno.
231 # Call self.get_*break*() to see the breakpoints or better
232 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000233
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000234 def set_break(self, filename, lineno, temporary=0, cond = None,
235 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000236 filename = self.canonic(filename)
237 import linecache # Import as late as possible
238 line = linecache.getline(filename, lineno)
239 if not line:
240 return 'Line %s:%d does not exist' % (filename,
241 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000242 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000243 self.breaks[filename] = []
244 list = self.breaks[filename]
245 if not lineno in list:
246 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000247 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000248
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000249 def clear_break(self, filename, lineno):
250 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000251 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000252 return 'There are no breakpoints in %s' % filename
253 if lineno not in self.breaks[filename]:
254 return 'There is no breakpoint at %s:%d' % (filename,
255 lineno)
256 # If there's only one bp in the list for that file,line
257 # pair, then remove the breaks entry
258 for bp in Breakpoint.bplist[filename, lineno][:]:
259 bp.deleteMe()
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000260 if (filename, lineno) not in Breakpoint.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000261 self.breaks[filename].remove(lineno)
262 if not self.breaks[filename]:
263 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000264
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000265 def clear_bpbynumber(self, arg):
266 try:
267 number = int(arg)
268 except:
269 return 'Non-numeric breakpoint number (%s)' % arg
270 try:
271 bp = Breakpoint.bpbynumber[number]
272 except IndexError:
273 return 'Breakpoint number (%d) out of range' % number
274 if not bp:
275 return 'Breakpoint (%d) already deleted' % number
276 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000277
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000278 def clear_all_file_breaks(self, filename):
279 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000280 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000281 return 'There are no breakpoints in %s' % filename
282 for line in self.breaks[filename]:
283 blist = Breakpoint.bplist[filename, line]
284 for bp in blist:
285 bp.deleteMe()
286 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000287
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000288 def clear_all_breaks(self):
289 if not self.breaks:
290 return 'There are no breakpoints'
291 for bp in Breakpoint.bpbynumber:
292 if bp:
293 bp.deleteMe()
294 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000295
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000296 def get_break(self, filename, lineno):
297 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000298 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000299 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000300
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000301 def get_breaks(self, filename, lineno):
302 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000303 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000304 lineno in self.breaks[filename] and \
305 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000306
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000307 def get_file_breaks(self, filename):
308 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000309 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000310 return self.breaks[filename]
311 else:
312 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000313
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000314 def get_all_breaks(self):
315 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000316
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000317 # Derived classes and clients can call the following method
318 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000319
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000320 def get_stack(self, f, t):
321 stack = []
322 if t and t.tb_frame is f:
323 t = t.tb_next
324 while f is not None:
325 stack.append((f, f.f_lineno))
326 if f is self.botframe:
327 break
328 f = f.f_back
329 stack.reverse()
330 i = max(0, len(stack) - 1)
331 while t is not None:
332 stack.append((t.tb_frame, t.tb_lineno))
333 t = t.tb_next
Benjamin Petersonc18574c2008-10-22 21:16:34 +0000334 if f is None:
335 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000336 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000337
338 #
339
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000340 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000341 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000342 frame, lineno = frame_lineno
343 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000344 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000345 if frame.f_code.co_name:
346 s = s + frame.f_code.co_name
347 else:
348 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000349 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000350 args = frame.f_locals['__args__']
351 else:
352 args = None
353 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000354 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000355 else:
356 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000357 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000358 rv = frame.f_locals['__return__']
359 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000360 s = s + repr.repr(rv)
Nick Coghlana2053472008-12-14 10:54:50 +0000361 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000362 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000363 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000364
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000365 # The following two methods can be called by clients to use
366 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000367
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000368 def run(self, cmd, globals=None, locals=None):
369 if globals is None:
370 import __main__
371 globals = __main__.__dict__
372 if locals is None:
373 locals = globals
374 self.reset()
375 sys.settrace(self.trace_dispatch)
376 if not isinstance(cmd, types.CodeType):
377 cmd = cmd+'\n'
378 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000379 exec cmd in globals, locals
380 except BdbQuit:
381 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000382 finally:
383 self.quitting = 1
384 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000385
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000386 def runeval(self, expr, globals=None, locals=None):
387 if globals is None:
388 import __main__
389 globals = __main__.__dict__
390 if locals is None:
391 locals = globals
392 self.reset()
393 sys.settrace(self.trace_dispatch)
394 if not isinstance(expr, types.CodeType):
395 expr = expr+'\n'
396 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000397 return eval(expr, globals, locals)
398 except BdbQuit:
399 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000400 finally:
401 self.quitting = 1
402 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000403
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000404 def runctx(self, cmd, globals, locals):
405 # B/W compatibility
406 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000407
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000408 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000409
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000410 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000411 self.reset()
412 sys.settrace(self.trace_dispatch)
413 res = None
414 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000415 res = func(*args, **kwds)
416 except BdbQuit:
417 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000418 finally:
419 self.quitting = 1
420 sys.settrace(None)
421 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000422
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000423
Guido van Rossumb6775db1994-08-01 11:34:53 +0000424def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000425 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000426
Guido van Rossumd93643f1998-09-11 22:38:35 +0000427
428class Breakpoint:
429
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000430 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000431
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000432 Implements temporary breakpoints, ignore counts, disabling and
433 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000434
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000435 Breakpoints are indexed by number through bpbynumber and by
436 the file,line tuple using bplist. The former points to a
437 single instance of class Breakpoint. The latter points to a
438 list of such instances since there may be more than one
439 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000440
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000441 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000442
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000443 # XXX Keeping state in the class is a mistake -- this means
444 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000445
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000446 next = 1 # Next bp to be assigned
447 bplist = {} # indexed by (file, lineno) tuple
448 bpbynumber = [None] # Each entry is None or an instance of Bpt
449 # index 0 is unused, except for marking an
450 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000451
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000452 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
453 self.funcname = funcname
454 # Needed if funcname is not None.
455 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000456 self.file = file # This better be in canonical form!
457 self.line = line
458 self.temporary = temporary
459 self.cond = cond
460 self.enabled = 1
461 self.ignore = 0
462 self.hits = 0
463 self.number = Breakpoint.next
464 Breakpoint.next = Breakpoint.next + 1
465 # Build the two lists
466 self.bpbynumber.append(self)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000467 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000468 self.bplist[file, line].append(self)
469 else:
470 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000471
Tim Peters11cf6052001-01-14 21:54:20 +0000472
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000473 def deleteMe(self):
474 index = (self.file, self.line)
475 self.bpbynumber[self.number] = None # No longer in list
476 self.bplist[index].remove(self)
477 if not self.bplist[index]:
478 # No more bp for this f:l combo
479 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000480
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000481 def enable(self):
482 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000483
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000484 def disable(self):
485 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000486
Georg Brandl19564802006-05-10 17:13:20 +0000487 def bpprint(self, out=None):
488 if out is None:
489 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000490 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000491 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000492 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000493 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000494 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000495 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000496 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000497 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000498 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
499 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000500 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000501 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000502 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000503 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000504 if (self.hits):
505 if (self.hits > 1): ss = 's'
506 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000507 print >>out, ('\tbreakpoint already hit %d time%s' %
508 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000509
510# -----------end of Breakpoint class----------
511
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000512def checkfuncname(b, frame):
513 """Check whether we should break here because of `b.funcname`."""
514 if not b.funcname:
515 # Breakpoint was set via line number.
516 if b.line != frame.f_lineno:
517 # Breakpoint was set at a line with a def statement and the function
518 # defined is called: don't break.
519 return False
520 return True
521
522 # Breakpoint set via function name.
523
524 if frame.f_code.co_name != b.funcname:
525 # It's not a function call, but rather execution of def statement.
526 return False
527
528 # We are in the right frame.
529 if not b.func_first_executable_line:
530 # The function is entered for the 1st time.
531 b.func_first_executable_line = frame.f_lineno
532
533 if b.func_first_executable_line != frame.f_lineno:
534 # But we are not at the first line number: don't break.
535 return False
536 return True
537
Guido van Rossumd93643f1998-09-11 22:38:35 +0000538# Determines if there is an effective (active) breakpoint at this
539# line of code. Returns breakpoint number or 0 if none
540def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000541 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000542
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000543 Called only if we know there is a bpt at this
544 location. Returns breakpoint that was triggered and a flag
545 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000546
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000547 """
548 possibles = Breakpoint.bplist[file,line]
549 for i in range(0, len(possibles)):
550 b = possibles[i]
551 if b.enabled == 0:
552 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000553 if not checkfuncname(b, frame):
554 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000555 # Count every hit when bp is enabled
556 b.hits = b.hits + 1
557 if not b.cond:
558 # If unconditional, and ignoring,
559 # go on to next, else break
560 if b.ignore > 0:
561 b.ignore = b.ignore -1
562 continue
563 else:
564 # breakpoint and marker that's ok
565 # to delete if temporary
566 return (b,1)
567 else:
568 # Conditional bp.
569 # Ignore count applies only to those bpt hits where the
570 # condition evaluates to true.
571 try:
572 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000573 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000574 if val:
575 if b.ignore > 0:
576 b.ignore = b.ignore -1
577 # continue
578 else:
579 return (b,1)
580 # else:
581 # continue
582 except:
583 # if eval fails, most conservative
584 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000585 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000586 # Don't delete temporary,
587 # as another hint to user.
588 return (b,0)
589 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000590
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000591# -------------------- testing --------------------
592
593class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000594 def user_call(self, frame, args):
595 name = frame.f_code.co_name
596 if not name: name = '???'
597 print '+++ call', name, args
598 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000599 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000600 name = frame.f_code.co_name
601 if not name: name = '???'
602 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlana2053472008-12-14 10:54:50 +0000603 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000604 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000605 def user_return(self, frame, retval):
606 print '+++ return', retval
607 def user_exception(self, frame, exc_stuff):
608 print '+++ exception', exc_stuff
609 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000610
611def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 print 'foo(', n, ')'
613 x = bar(n*10)
614 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000615
616def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000617 print 'bar(', a, ')'
618 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000619
620def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000621 t = Tdb()
622 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000623
624# end