blob: f16414d506fd5fd93a3bbac7cfb4c45313eb3728 [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
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000252 def clear_break(self, filename, lineno):
253 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000254 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000255 return 'There are no breakpoints in %s' % filename
256 if lineno not in self.breaks[filename]:
257 return 'There is no breakpoint at %s:%d' % (filename,
258 lineno)
259 # If there's only one bp in the list for that file,line
260 # pair, then remove the breaks entry
261 for bp in Breakpoint.bplist[filename, lineno][:]:
262 bp.deleteMe()
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000263 if (filename, lineno) not in Breakpoint.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000264 self.breaks[filename].remove(lineno)
265 if not self.breaks[filename]:
266 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000267
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000268 def clear_bpbynumber(self, arg):
269 try:
270 number = int(arg)
271 except:
272 return 'Non-numeric breakpoint number (%s)' % arg
273 try:
274 bp = Breakpoint.bpbynumber[number]
275 except IndexError:
276 return 'Breakpoint number (%d) out of range' % number
277 if not bp:
278 return 'Breakpoint (%d) already deleted' % number
279 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000280
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000281 def clear_all_file_breaks(self, filename):
282 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000283 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000284 return 'There are no breakpoints in %s' % filename
285 for line in self.breaks[filename]:
286 blist = Breakpoint.bplist[filename, line]
287 for bp in blist:
288 bp.deleteMe()
289 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000290
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000291 def clear_all_breaks(self):
292 if not self.breaks:
293 return 'There are no breakpoints'
294 for bp in Breakpoint.bpbynumber:
295 if bp:
296 bp.deleteMe()
297 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000298
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000299 def get_break(self, filename, lineno):
300 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000301 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000302 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000303
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000304 def get_breaks(self, filename, lineno):
305 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000306 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000307 lineno in self.breaks[filename] and \
308 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000309
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000310 def get_file_breaks(self, filename):
311 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000312 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000313 return self.breaks[filename]
314 else:
315 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000316
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000317 def get_all_breaks(self):
318 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000319
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000320 # Derived classes and clients can call the following method
321 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000322
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000323 def get_stack(self, f, t):
324 stack = []
325 if t and t.tb_frame is f:
326 t = t.tb_next
327 while f is not None:
328 stack.append((f, f.f_lineno))
329 if f is self.botframe:
330 break
331 f = f.f_back
332 stack.reverse()
333 i = max(0, len(stack) - 1)
334 while t is not None:
335 stack.append((t.tb_frame, t.tb_lineno))
336 t = t.tb_next
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000337 if f is None:
338 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000339 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000340
341 #
342
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000343 def format_stack_entry(self, frame_lineno, lprefix=': '):
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000344 import linecache, reprlib
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000345 frame, lineno = frame_lineno
346 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000347 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000348 if frame.f_code.co_name:
349 s = s + frame.f_code.co_name
350 else:
351 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000352 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000353 args = frame.f_locals['__args__']
354 else:
355 args = None
356 if args:
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000357 s = s + reprlib.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000358 else:
359 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000360 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000361 rv = frame.f_locals['__return__']
362 s = s + '->'
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000363 s = s + reprlib.repr(rv)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000364 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000365 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000366 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000367
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000368 # The following two methods can be called by clients to use
369 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000370
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000371 def run(self, cmd, globals=None, locals=None):
372 if globals is None:
373 import __main__
374 globals = __main__.__dict__
375 if locals is None:
376 locals = globals
377 self.reset()
378 sys.settrace(self.trace_dispatch)
379 if not isinstance(cmd, types.CodeType):
380 cmd = cmd+'\n'
381 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000382 exec(cmd, globals, locals)
383 except BdbQuit:
384 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000385 finally:
386 self.quitting = 1
387 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000388
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000389 def runeval(self, expr, globals=None, locals=None):
390 if globals is None:
391 import __main__
392 globals = __main__.__dict__
393 if locals is None:
394 locals = globals
395 self.reset()
396 sys.settrace(self.trace_dispatch)
397 if not isinstance(expr, types.CodeType):
398 expr = expr+'\n'
399 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000400 return eval(expr, globals, locals)
401 except BdbQuit:
402 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000403 finally:
404 self.quitting = 1
405 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000406
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 def runctx(self, cmd, globals, locals):
408 # B/W compatibility
409 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000410
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000411 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000412
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000413 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000414 self.reset()
415 sys.settrace(self.trace_dispatch)
416 res = None
417 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000418 res = func(*args, **kwds)
419 except BdbQuit:
420 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000421 finally:
422 self.quitting = 1
423 sys.settrace(None)
424 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000425
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000426
Guido van Rossumb6775db1994-08-01 11:34:53 +0000427def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000428 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000429
Guido van Rossumd93643f1998-09-11 22:38:35 +0000430
431class Breakpoint:
432
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000433 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000434
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000435 Implements temporary breakpoints, ignore counts, disabling and
436 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000437
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000438 Breakpoints are indexed by number through bpbynumber and by
439 the file,line tuple using bplist. The former points to a
440 single instance of class Breakpoint. The latter points to a
441 list of such instances since there may be more than one
442 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000443
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000444 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000445
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000446 # XXX Keeping state in the class is a mistake -- this means
447 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000448
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000449 next = 1 # Next bp to be assigned
450 bplist = {} # indexed by (file, lineno) tuple
451 bpbynumber = [None] # Each entry is None or an instance of Bpt
452 # index 0 is unused, except for marking an
453 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000454
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000455 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
456 self.funcname = funcname
457 # Needed if funcname is not None.
458 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000459 self.file = file # This better be in canonical form!
460 self.line = line
461 self.temporary = temporary
462 self.cond = cond
463 self.enabled = 1
464 self.ignore = 0
465 self.hits = 0
466 self.number = Breakpoint.next
467 Breakpoint.next = Breakpoint.next + 1
468 # Build the two lists
469 self.bpbynumber.append(self)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000470 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000471 self.bplist[file, line].append(self)
472 else:
473 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000474
Tim Peters11cf6052001-01-14 21:54:20 +0000475
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000476 def deleteMe(self):
477 index = (self.file, self.line)
478 self.bpbynumber[self.number] = None # No longer in list
479 self.bplist[index].remove(self)
480 if not self.bplist[index]:
481 # No more bp for this f:l combo
482 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000483
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000484 def enable(self):
485 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000486
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000487 def disable(self):
488 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000489
Thomas Wouters477c8d52006-05-27 19:21:47 +0000490 def bpprint(self, out=None):
491 if out is None:
492 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000493 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000494 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000495 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000496 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000497 if self.enabled:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000498 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000499 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000500 disp = disp + 'no '
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000501 print('%-4dbreakpoint %s at %s:%d' % (self.number, disp,
502 self.file, self.line), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000503 if self.cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000504 print('\tstop only if %s' % (self.cond,), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000505 if self.ignore:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000506 print('\tignore next %d hits' % (self.ignore), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000507 if (self.hits):
508 if (self.hits > 1): ss = 's'
509 else: ss = ''
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000510 print(('\tbreakpoint already hit %d time%s' %
511 (self.hits, ss)), file=out)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000512
513# -----------end of Breakpoint class----------
514
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000515def checkfuncname(b, frame):
516 """Check whether we should break here because of `b.funcname`."""
517 if not b.funcname:
518 # Breakpoint was set via line number.
519 if b.line != frame.f_lineno:
520 # Breakpoint was set at a line with a def statement and the function
521 # defined is called: don't break.
522 return False
523 return True
524
525 # Breakpoint set via function name.
526
527 if frame.f_code.co_name != b.funcname:
528 # It's not a function call, but rather execution of def statement.
529 return False
530
531 # We are in the right frame.
532 if not b.func_first_executable_line:
533 # The function is entered for the 1st time.
534 b.func_first_executable_line = frame.f_lineno
535
536 if b.func_first_executable_line != frame.f_lineno:
537 # But we are not at the first line number: don't break.
538 return False
539 return True
540
Guido van Rossumd93643f1998-09-11 22:38:35 +0000541# Determines if there is an effective (active) breakpoint at this
542# line of code. Returns breakpoint number or 0 if none
543def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000544 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000545
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000546 Called only if we know there is a bpt at this
547 location. Returns breakpoint that was triggered and a flag
548 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000549
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000550 """
551 possibles = Breakpoint.bplist[file,line]
552 for i in range(0, len(possibles)):
553 b = possibles[i]
554 if b.enabled == 0:
555 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000556 if not checkfuncname(b, frame):
557 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000558 # Count every hit when bp is enabled
559 b.hits = b.hits + 1
560 if not b.cond:
561 # If unconditional, and ignoring,
562 # go on to next, else break
563 if b.ignore > 0:
564 b.ignore = b.ignore -1
565 continue
566 else:
567 # breakpoint and marker that's ok
568 # to delete if temporary
569 return (b,1)
570 else:
571 # Conditional bp.
572 # Ignore count applies only to those bpt hits where the
573 # condition evaluates to true.
574 try:
575 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000576 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000577 if val:
578 if b.ignore > 0:
579 b.ignore = b.ignore -1
580 # continue
581 else:
582 return (b,1)
583 # else:
584 # continue
585 except:
586 # if eval fails, most conservative
587 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000588 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000589 # Don't delete temporary,
590 # as another hint to user.
591 return (b,0)
592 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000593
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000594# -------------------- testing --------------------
595
596class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000597 def user_call(self, frame, args):
598 name = frame.f_code.co_name
599 if not name: name = '???'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000600 print('+++ call', name, args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000601 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000602 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000603 name = frame.f_code.co_name
604 if not name: name = '???'
605 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000606 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000607 print('+++', fn, frame.f_lineno, name, ':', line.strip())
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000608 def user_return(self, frame, retval):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000609 print('+++ return', retval)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000610 def user_exception(self, frame, exc_stuff):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000611 print('+++ exception', exc_stuff)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000613
614def foo(n):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000615 print('foo(', n, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000616 x = bar(n*10)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000617 print('bar returned', x)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000618
619def bar(a):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000620 print('bar(', a, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000621 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000622
623def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000624 t = Tdb()
625 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000626
627# end