blob: 3b4f99170bdfcdfc0fc2bddddb3ea538ec8d33d2 [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:
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +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):
Collin Winterce36ad82007-08-30 01:19:48 +0000142 raise NotImplementedError("subclass of bdb must implement do_clear()")
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000143
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000144 def break_anywhere(self, frame):
Guido van Rossume2b70bc2006-08-18 22:13:04 +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
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000163 def user_exception(self, frame, exc_info):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000164 """This method is called if an exception occurs,
165 but only if we are to stop at or just below this level."""
166 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000167
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000168 def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1):
169 self.stopframe = stopframe
170 self.returnframe = returnframe
171 self.quitting = 0
172 self.stoplineno = stoplineno
173
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000174 # Derived classes and clients can call the following methods
175 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000176
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000177 def set_until(self, frame): #the name "until" is borrowed from gdb
178 """Stop when the line with the line no greater than the current one is
179 reached or when returning from current frame"""
180 self._set_stopinfo(frame, frame, frame.f_lineno+1)
181
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000182 def set_step(self):
183 """Stop after one line of code."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000184 self._set_stopinfo(None,None)
Tim Peters11cf6052001-01-14 21:54:20 +0000185
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000186 def set_next(self, frame):
187 """Stop on the next line in or below the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000188 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000189
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000190 def set_return(self, frame):
191 """Stop when returning from the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000192 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000193
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000194 def set_trace(self, frame=None):
195 """Start debugging from `frame`.
196
197 If frame is not specified, debugging starts from caller's frame.
198 """
199 if frame is None:
200 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000201 self.reset()
202 while frame:
203 frame.f_trace = self.trace_dispatch
204 self.botframe = frame
205 frame = frame.f_back
206 self.set_step()
207 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000208
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000209 def set_continue(self):
210 # Don't stop except at breakpoints or when finished
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000211 self._set_stopinfo(self.botframe, None)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000212 if not self.breaks:
213 # no breakpoints; run without debugger overhead
214 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000215 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000216 while frame and frame is not self.botframe:
217 del frame.f_trace
218 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000219
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000220 def set_quit(self):
221 self.stopframe = self.botframe
222 self.returnframe = None
223 self.quitting = 1
224 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000225
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000226 # Derived classes and clients can call the following methods
227 # to manipulate breakpoints. These methods return an
228 # error message is something went wrong, None if all is well.
229 # Set_break prints out the breakpoint line and file:lineno.
230 # Call self.get_*break*() to see the breakpoints or better
231 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000232
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000233 def set_break(self, filename, lineno, temporary=0, cond = None,
234 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000235 filename = self.canonic(filename)
236 import linecache # Import as late as possible
237 line = linecache.getline(filename, lineno)
238 if not line:
239 return 'Line %s:%d does not exist' % (filename,
240 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000241 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000242 self.breaks[filename] = []
243 list = self.breaks[filename]
244 if not lineno in list:
245 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000246 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000247
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000248 def clear_break(self, filename, lineno):
249 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000250 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000251 return 'There are no breakpoints in %s' % filename
252 if lineno not in self.breaks[filename]:
253 return 'There is no breakpoint at %s:%d' % (filename,
254 lineno)
255 # If there's only one bp in the list for that file,line
256 # pair, then remove the breaks entry
257 for bp in Breakpoint.bplist[filename, lineno][:]:
258 bp.deleteMe()
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000259 if (filename, lineno) not in Breakpoint.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000260 self.breaks[filename].remove(lineno)
261 if not self.breaks[filename]:
262 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000263
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000264 def clear_bpbynumber(self, arg):
265 try:
266 number = int(arg)
267 except:
268 return 'Non-numeric breakpoint number (%s)' % arg
269 try:
270 bp = Breakpoint.bpbynumber[number]
271 except IndexError:
272 return 'Breakpoint number (%d) out of range' % number
273 if not bp:
274 return 'Breakpoint (%d) already deleted' % number
275 self.clear_break(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000276
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000277 def clear_all_file_breaks(self, filename):
278 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000279 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000280 return 'There are no breakpoints in %s' % filename
281 for line in self.breaks[filename]:
282 blist = Breakpoint.bplist[filename, line]
283 for bp in blist:
284 bp.deleteMe()
285 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000286
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000287 def clear_all_breaks(self):
288 if not self.breaks:
289 return 'There are no breakpoints'
290 for bp in Breakpoint.bpbynumber:
291 if bp:
292 bp.deleteMe()
293 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000294
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000295 def get_break(self, filename, lineno):
296 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000297 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000298 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000299
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000300 def get_breaks(self, filename, lineno):
301 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000302 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000303 lineno in self.breaks[filename] and \
304 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000305
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000306 def get_file_breaks(self, filename):
307 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000308 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000309 return self.breaks[filename]
310 else:
311 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000312
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000313 def get_all_breaks(self):
314 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000315
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000316 # Derived classes and clients can call the following method
317 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000318
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000319 def get_stack(self, f, t):
320 stack = []
321 if t and t.tb_frame is f:
322 t = t.tb_next
323 while f is not None:
324 stack.append((f, f.f_lineno))
325 if f is self.botframe:
326 break
327 f = f.f_back
328 stack.reverse()
329 i = max(0, len(stack) - 1)
330 while t is not None:
331 stack.append((t.tb_frame, t.tb_lineno))
332 t = t.tb_next
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000333 if f is None:
334 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000335 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000336
337 #
338
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000339 def format_stack_entry(self, frame_lineno, lprefix=': '):
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000340 import linecache, reprlib
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000341 frame, lineno = frame_lineno
342 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000343 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000344 if frame.f_code.co_name:
345 s = s + frame.f_code.co_name
346 else:
347 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000348 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000349 args = frame.f_locals['__args__']
350 else:
351 args = None
352 if args:
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000353 s = s + reprlib.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000354 else:
355 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000356 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000357 rv = frame.f_locals['__return__']
358 s = s + '->'
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000359 s = s + reprlib.repr(rv)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000360 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000361 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000362 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000363
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000364 # The following two methods can be called by clients to use
365 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000366
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000367 def run(self, cmd, globals=None, locals=None):
368 if globals is None:
369 import __main__
370 globals = __main__.__dict__
371 if locals is None:
372 locals = globals
373 self.reset()
374 sys.settrace(self.trace_dispatch)
375 if not isinstance(cmd, types.CodeType):
376 cmd = cmd+'\n'
377 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000378 exec(cmd, globals, locals)
379 except BdbQuit:
380 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000381 finally:
382 self.quitting = 1
383 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000384
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000385 def runeval(self, expr, globals=None, locals=None):
386 if globals is None:
387 import __main__
388 globals = __main__.__dict__
389 if locals is None:
390 locals = globals
391 self.reset()
392 sys.settrace(self.trace_dispatch)
393 if not isinstance(expr, types.CodeType):
394 expr = expr+'\n'
395 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000396 return eval(expr, globals, locals)
397 except BdbQuit:
398 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000399 finally:
400 self.quitting = 1
401 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000402
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000403 def runctx(self, cmd, globals, locals):
404 # B/W compatibility
405 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000406
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000408
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000409 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000410 self.reset()
411 sys.settrace(self.trace_dispatch)
412 res = None
413 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000414 res = func(*args, **kwds)
415 except BdbQuit:
416 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000417 finally:
418 self.quitting = 1
419 sys.settrace(None)
420 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000421
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000422
Guido van Rossumb6775db1994-08-01 11:34:53 +0000423def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000424 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000425
Guido van Rossumd93643f1998-09-11 22:38:35 +0000426
427class Breakpoint:
428
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000429 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000430
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000431 Implements temporary breakpoints, ignore counts, disabling and
432 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000433
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000434 Breakpoints are indexed by number through bpbynumber and by
435 the file,line tuple using bplist. The former points to a
436 single instance of class Breakpoint. The latter points to a
437 list of such instances since there may be more than one
438 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000439
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000440 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000441
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000442 # XXX Keeping state in the class is a mistake -- this means
443 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000444
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000445 next = 1 # Next bp to be assigned
446 bplist = {} # indexed by (file, lineno) tuple
447 bpbynumber = [None] # Each entry is None or an instance of Bpt
448 # index 0 is unused, except for marking an
449 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000450
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000451 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
452 self.funcname = funcname
453 # Needed if funcname is not None.
454 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000455 self.file = file # This better be in canonical form!
456 self.line = line
457 self.temporary = temporary
458 self.cond = cond
459 self.enabled = 1
460 self.ignore = 0
461 self.hits = 0
462 self.number = Breakpoint.next
463 Breakpoint.next = Breakpoint.next + 1
464 # Build the two lists
465 self.bpbynumber.append(self)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000466 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000467 self.bplist[file, line].append(self)
468 else:
469 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000470
Tim Peters11cf6052001-01-14 21:54:20 +0000471
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000472 def deleteMe(self):
473 index = (self.file, self.line)
474 self.bpbynumber[self.number] = None # No longer in list
475 self.bplist[index].remove(self)
476 if not self.bplist[index]:
477 # No more bp for this f:l combo
478 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000479
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000480 def enable(self):
481 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000482
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000483 def disable(self):
484 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000485
Thomas Wouters477c8d52006-05-27 19:21:47 +0000486 def bpprint(self, out=None):
487 if out is None:
488 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000489 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000490 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000491 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000492 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000493 if self.enabled:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000494 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000495 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000496 disp = disp + 'no '
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000497 print('%-4dbreakpoint %s at %s:%d' % (self.number, disp,
498 self.file, self.line), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000499 if self.cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000500 print('\tstop only if %s' % (self.cond,), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000501 if self.ignore:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000502 print('\tignore next %d hits' % (self.ignore), file=out)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000503 if (self.hits):
504 if (self.hits > 1): ss = 's'
505 else: ss = ''
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000506 print(('\tbreakpoint already hit %d time%s' %
507 (self.hits, ss)), file=out)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000508
509# -----------end of Breakpoint class----------
510
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000511def checkfuncname(b, frame):
512 """Check whether we should break here because of `b.funcname`."""
513 if not b.funcname:
514 # Breakpoint was set via line number.
515 if b.line != frame.f_lineno:
516 # Breakpoint was set at a line with a def statement and the function
517 # defined is called: don't break.
518 return False
519 return True
520
521 # Breakpoint set via function name.
522
523 if frame.f_code.co_name != b.funcname:
524 # It's not a function call, but rather execution of def statement.
525 return False
526
527 # We are in the right frame.
528 if not b.func_first_executable_line:
529 # The function is entered for the 1st time.
530 b.func_first_executable_line = frame.f_lineno
531
532 if b.func_first_executable_line != frame.f_lineno:
533 # But we are not at the first line number: don't break.
534 return False
535 return True
536
Guido van Rossumd93643f1998-09-11 22:38:35 +0000537# Determines if there is an effective (active) breakpoint at this
538# line of code. Returns breakpoint number or 0 if none
539def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000540 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000541
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000542 Called only if we know there is a bpt at this
543 location. Returns breakpoint that was triggered and a flag
544 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000545
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000546 """
547 possibles = Breakpoint.bplist[file,line]
548 for i in range(0, len(possibles)):
549 b = possibles[i]
550 if b.enabled == 0:
551 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000552 if not checkfuncname(b, frame):
553 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000554 # Count every hit when bp is enabled
555 b.hits = b.hits + 1
556 if not b.cond:
557 # If unconditional, and ignoring,
558 # go on to next, else break
559 if b.ignore > 0:
560 b.ignore = b.ignore -1
561 continue
562 else:
563 # breakpoint and marker that's ok
564 # to delete if temporary
565 return (b,1)
566 else:
567 # Conditional bp.
568 # Ignore count applies only to those bpt hits where the
569 # condition evaluates to true.
570 try:
571 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000572 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000573 if val:
574 if b.ignore > 0:
575 b.ignore = b.ignore -1
576 # continue
577 else:
578 return (b,1)
579 # else:
580 # continue
581 except:
582 # if eval fails, most conservative
583 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000584 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000585 # Don't delete temporary,
586 # as another hint to user.
587 return (b,0)
588 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000589
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000590# -------------------- testing --------------------
591
592class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000593 def user_call(self, frame, args):
594 name = frame.f_code.co_name
595 if not name: name = '???'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000596 print('+++ call', name, args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000597 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000598 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000599 name = frame.f_code.co_name
600 if not name: name = '???'
601 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000602 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000603 print('+++', fn, frame.f_lineno, name, ':', line.strip())
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000604 def user_return(self, frame, retval):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000605 print('+++ return', retval)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000606 def user_exception(self, frame, exc_stuff):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000607 print('+++ exception', exc_stuff)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000608 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000609
610def foo(n):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000611 print('foo(', n, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 x = bar(n*10)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000613 print('bar returned', x)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000614
615def bar(a):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000616 print('bar(', a, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000617 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000618
619def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000620 t = Tdb()
621 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000622
623# end