blob: 3ed25fe1010f66e176a52a7c257e71356a33f1af [file] [log] [blame]
Guido van Rossum4acc25b2000-02-02 15:10:15 +00001"""Debugger basics"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00002
Georg Brandl243ad662009-05-05 09:00:19 +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 Brandl243ad662009-05-05 09:00:19 +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
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +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
Guido van Rossumbe19ed72007-02-09 05:37:30 +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 Brandl243ad662009-05-05 09:00:19 +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 Brandl243ad662009-05-05 09:00:19 +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 Brandl469d3e72010-08-01 19:35:16 +0000112 if self.stoplineno == -1:
113 return False
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +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):
Collin Winterce36ad82007-08-30 01:19:48 +0000144 raise NotImplementedError("subclass of bdb must implement do_clear()")
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000145
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000146 def break_anywhere(self, frame):
Guido van Rossume2b70bc2006-08-18 22:13:04 +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
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000165 def user_exception(self, frame, exc_info):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000166 """This method is called if an exception occurs,
167 but only if we are to stop at or just below this level."""
168 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000169
Georg Brandl469d3e72010-08-01 19:35:16 +0000170 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000171 self.stopframe = stopframe
172 self.returnframe = returnframe
173 self.quitting = 0
Georg Brandl469d3e72010-08-01 19:35:16 +0000174 # stoplineno >= 0 means: stop at line >= the stoplineno
175 # stoplineno -1 means: don't stop at all
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000176 self.stoplineno = stoplineno
177
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000178 # Derived classes and clients can call the following methods
179 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000180
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000181 def set_until(self, frame): #the name "until" is borrowed from gdb
182 """Stop when the line with the line no greater than the current one is
183 reached or when returning from current frame"""
184 self._set_stopinfo(frame, frame, frame.f_lineno+1)
185
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000186 def set_step(self):
187 """Stop after one line of code."""
Georg Brandl469d3e72010-08-01 19:35:16 +0000188 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000189
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000190 def set_next(self, frame):
191 """Stop on the next line in or below the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000192 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000193
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000194 def set_return(self, frame):
195 """Stop when returning from the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000196 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000197
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000198 def set_trace(self, frame=None):
199 """Start debugging from `frame`.
200
201 If frame is not specified, debugging starts from caller's frame.
202 """
203 if frame is None:
204 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000205 self.reset()
206 while frame:
207 frame.f_trace = self.trace_dispatch
208 self.botframe = frame
209 frame = frame.f_back
210 self.set_step()
211 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000213 def set_continue(self):
214 # Don't stop except at breakpoints or when finished
Georg Brandl469d3e72010-08-01 19:35:16 +0000215 self._set_stopinfo(self.botframe, None, -1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000216 if not self.breaks:
217 # no breakpoints; run without debugger overhead
218 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000219 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000220 while frame and frame is not self.botframe:
221 del frame.f_trace
222 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000223
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000224 def set_quit(self):
225 self.stopframe = self.botframe
226 self.returnframe = None
227 self.quitting = 1
228 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000229
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000230 # Derived classes and clients can call the following methods
231 # to manipulate breakpoints. These methods return an
232 # error message is something went wrong, None if all is well.
233 # Set_break prints out the breakpoint line and file:lineno.
234 # Call self.get_*break*() to see the breakpoints or better
235 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000236
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000237 def set_break(self, filename, lineno, temporary=0, cond = None,
238 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000239 filename = self.canonic(filename)
240 import linecache # Import as late as possible
241 line = linecache.getline(filename, lineno)
242 if not line:
243 return 'Line %s:%d does not exist' % (filename,
244 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000245 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000246 self.breaks[filename] = []
247 list = self.breaks[filename]
248 if not lineno in list:
249 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000250 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000251
Senthil Kumaran5170c812010-11-29 12:27:45 +0000252 def _prune_breaks(self, filename, lineno):
253 if (filename, lineno) not in Breakpoint.bplist:
254 self.breaks[filename].remove(lineno)
255 if not self.breaks[filename]:
256 del self.breaks[filename]
257
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000258 def clear_break(self, filename, lineno):
259 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000260 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000261 return 'There are no breakpoints in %s' % filename
262 if lineno not in self.breaks[filename]:
263 return 'There is no breakpoint at %s:%d' % (filename,
264 lineno)
265 # If there's only one bp in the list for that file,line
266 # pair, then remove the breaks entry
267 for bp in Breakpoint.bplist[filename, lineno][:]:
268 bp.deleteMe()
Senthil Kumaran5170c812010-11-29 12:27:45 +0000269 self._prune_breaks(filename, lineno)
Tim Peters11cf6052001-01-14 21:54:20 +0000270
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000271 def clear_bpbynumber(self, arg):
272 try:
273 number = int(arg)
274 except:
275 return 'Non-numeric breakpoint number (%s)' % arg
276 try:
277 bp = Breakpoint.bpbynumber[number]
278 except IndexError:
279 return 'Breakpoint number (%d) out of range' % number
280 if not bp:
281 return 'Breakpoint (%d) already deleted' % number
Senthil Kumaran5170c812010-11-29 12:27:45 +0000282 bp.deleteMe()
283 self._prune_breaks(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000284
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000285 def clear_all_file_breaks(self, filename):
286 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000287 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000288 return 'There are no breakpoints in %s' % filename
289 for line in self.breaks[filename]:
290 blist = Breakpoint.bplist[filename, line]
291 for bp in blist:
292 bp.deleteMe()
293 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000294
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000295 def clear_all_breaks(self):
296 if not self.breaks:
297 return 'There are no breakpoints'
298 for bp in Breakpoint.bpbynumber:
299 if bp:
300 bp.deleteMe()
301 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000302
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000303 def get_break(self, filename, lineno):
304 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000305 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000306 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000307
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000308 def get_breaks(self, filename, lineno):
309 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000310 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000311 lineno in self.breaks[filename] and \
312 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000313
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000314 def get_file_breaks(self, filename):
315 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000316 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000317 return self.breaks[filename]
318 else:
319 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000320
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000321 def get_all_breaks(self):
322 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000323
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000324 # Derived classes and clients can call the following method
325 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000326
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000327 def get_stack(self, f, t):
328 stack = []
329 if t and t.tb_frame is f:
330 t = t.tb_next
331 while f is not None:
332 stack.append((f, f.f_lineno))
333 if f is self.botframe:
334 break
335 f = f.f_back
336 stack.reverse()
337 i = max(0, len(stack) - 1)
338 while t is not None:
339 stack.append((t.tb_frame, t.tb_lineno))
340 t = t.tb_next
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000341 if f is None:
342 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000343 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000344
345 #
346
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000347 def format_stack_entry(self, frame_lineno, lprefix=': '):
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000348 import linecache, reprlib
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000349 frame, lineno = frame_lineno
350 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000351 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000352 if frame.f_code.co_name:
353 s = s + frame.f_code.co_name
354 else:
355 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000356 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000357 args = frame.f_locals['__args__']
358 else:
359 args = None
360 if args:
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000361 s = s + reprlib.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000362 else:
363 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000364 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000365 rv = frame.f_locals['__return__']
366 s = s + '->'
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000367 s = s + reprlib.repr(rv)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000368 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000369 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000370 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000371
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000372 # The following two methods can be called by clients to use
373 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000374
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000375 def run(self, cmd, 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(cmd, types.CodeType):
384 cmd = cmd+'\n'
385 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000386 exec(cmd, 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)
Tim Peters11cf6052001-01-14 21:54:20 +0000392
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000393 def runeval(self, expr, globals=None, locals=None):
394 if globals is None:
395 import __main__
396 globals = __main__.__dict__
397 if locals is None:
398 locals = globals
399 self.reset()
400 sys.settrace(self.trace_dispatch)
401 if not isinstance(expr, types.CodeType):
402 expr = expr+'\n'
403 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000404 return eval(expr, globals, locals)
405 except BdbQuit:
406 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 finally:
408 self.quitting = 1
409 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000410
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000411 def runctx(self, cmd, globals, locals):
412 # B/W compatibility
413 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000414
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000415 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000416
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000417 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000418 self.reset()
419 sys.settrace(self.trace_dispatch)
420 res = None
421 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000422 res = func(*args, **kwds)
423 except BdbQuit:
424 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000425 finally:
426 self.quitting = 1
427 sys.settrace(None)
428 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000429
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000430
Guido van Rossumb6775db1994-08-01 11:34:53 +0000431def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000432 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000433
Guido van Rossumd93643f1998-09-11 22:38:35 +0000434
435class Breakpoint:
436
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000437 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000438
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000439 Implements temporary breakpoints, ignore counts, disabling and
440 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000441
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000442 Breakpoints are indexed by number through bpbynumber and by
443 the file,line tuple using bplist. The former points to a
444 single instance of class Breakpoint. The latter points to a
445 list of such instances since there may be more than one
446 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000447
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000448 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000449
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000450 # XXX Keeping state in the class is a mistake -- this means
451 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000452
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000453 next = 1 # Next bp to be assigned
454 bplist = {} # indexed by (file, lineno) tuple
455 bpbynumber = [None] # Each entry is None or an instance of Bpt
456 # index 0 is unused, except for marking an
457 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000458
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000459 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
460 self.funcname = funcname
461 # Needed if funcname is not None.
462 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000463 self.file = file # This better be in canonical form!
464 self.line = line
465 self.temporary = temporary
466 self.cond = cond
467 self.enabled = 1
468 self.ignore = 0
469 self.hits = 0
470 self.number = Breakpoint.next
471 Breakpoint.next = Breakpoint.next + 1
472 # Build the two lists
473 self.bpbynumber.append(self)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000474 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000475 self.bplist[file, line].append(self)
476 else:
477 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000478
Tim Peters11cf6052001-01-14 21:54:20 +0000479
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000480 def deleteMe(self):
481 index = (self.file, self.line)
482 self.bpbynumber[self.number] = None # No longer in list
483 self.bplist[index].remove(self)
484 if not self.bplist[index]:
485 # No more bp for this f:l combo
486 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000487
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000488 def enable(self):
489 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000490
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000491 def disable(self):
492 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000493
Thomas Wouters477c8d52006-05-27 19:21:47 +0000494 def bpprint(self, out=None):
495 if out is None:
496 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000497 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000498 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000499 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000500 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000501 if self.enabled:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000502 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000503 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000504 disp = disp + 'no '
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000505 print('%-4dbreakpoint %s at %s:%d' % (self.number, disp,
506 self.file, self.line), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000507 if self.cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000508 print('\tstop only if %s' % (self.cond,), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000509 if self.ignore:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000510 print('\tignore next %d hits' % (self.ignore), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000511 if (self.hits):
512 if (self.hits > 1): ss = 's'
513 else: ss = ''
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000514 print(('\tbreakpoint already hit %d time%s' %
515 (self.hits, ss)), file=out)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000516
517# -----------end of Breakpoint class----------
518
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000519def checkfuncname(b, frame):
520 """Check whether we should break here because of `b.funcname`."""
521 if not b.funcname:
522 # Breakpoint was set via line number.
523 if b.line != frame.f_lineno:
524 # Breakpoint was set at a line with a def statement and the function
525 # defined is called: don't break.
526 return False
527 return True
528
529 # Breakpoint set via function name.
530
531 if frame.f_code.co_name != b.funcname:
532 # It's not a function call, but rather execution of def statement.
533 return False
534
535 # We are in the right frame.
536 if not b.func_first_executable_line:
537 # The function is entered for the 1st time.
538 b.func_first_executable_line = frame.f_lineno
539
540 if b.func_first_executable_line != frame.f_lineno:
541 # But we are not at the first line number: don't break.
542 return False
543 return True
544
Guido van Rossumd93643f1998-09-11 22:38:35 +0000545# Determines if there is an effective (active) breakpoint at this
546# line of code. Returns breakpoint number or 0 if none
547def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000548 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000549
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000550 Called only if we know there is a bpt at this
551 location. Returns breakpoint that was triggered and a flag
552 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000553
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000554 """
555 possibles = Breakpoint.bplist[file,line]
556 for i in range(0, len(possibles)):
557 b = possibles[i]
558 if b.enabled == 0:
559 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000560 if not checkfuncname(b, frame):
561 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000562 # Count every hit when bp is enabled
563 b.hits = b.hits + 1
564 if not b.cond:
565 # If unconditional, and ignoring,
566 # go on to next, else break
567 if b.ignore > 0:
568 b.ignore = b.ignore -1
569 continue
570 else:
571 # breakpoint and marker that's ok
572 # to delete if temporary
573 return (b,1)
574 else:
575 # Conditional bp.
576 # Ignore count applies only to those bpt hits where the
577 # condition evaluates to true.
578 try:
579 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000580 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000581 if val:
582 if b.ignore > 0:
583 b.ignore = b.ignore -1
584 # continue
585 else:
586 return (b,1)
587 # else:
588 # continue
589 except:
590 # if eval fails, most conservative
591 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000592 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000593 # Don't delete temporary,
594 # as another hint to user.
595 return (b,0)
596 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000597
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000598# -------------------- testing --------------------
599
600class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000601 def user_call(self, frame, args):
602 name = frame.f_code.co_name
603 if not name: name = '???'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000604 print('+++ call', name, args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000605 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000606 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000607 name = frame.f_code.co_name
608 if not name: name = '???'
609 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000610 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000611 print('+++', fn, frame.f_lineno, name, ':', line.strip())
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 def user_return(self, frame, retval):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000613 print('+++ return', retval)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000614 def user_exception(self, frame, exc_stuff):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000615 print('+++ exception', exc_stuff)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000616 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000617
618def foo(n):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000619 print('foo(', n, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000620 x = bar(n*10)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000621 print('bar returned', x)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000622
623def bar(a):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000624 print('bar(', a, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000625 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000626
627def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000628 t = Tdb()
629 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000630
631# end