blob: 59440a99a0fab025d1dcf8dd1610f56e1729b149 [file] [log] [blame]
Guido van Rossum4acc25b2000-02-02 15:10:15 +00001"""Debugger basics"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00002
Georg Brandl4d4313d2009-05-05 08:54:11 +00003import fnmatch
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00004import sys
Barry Warsaw148ffbc1999-09-09 23:24:33 +00005import os
Guido van Rossum4808dcb1996-10-15 14:40:21 +00006import types
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00007
Skip Montanaroe99d5ea2001-01-20 19:54:20 +00008__all__ = ["BdbQuit","Bdb","Breakpoint"]
9
Neal Norwitz93cf79f2002-03-31 14:06:41 +000010class BdbQuit(Exception):
11 """Exception to give up completely"""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000012
13
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000014class Bdb:
Tim Peters11cf6052001-01-14 21:54:20 +000015
Guido van Rossum4acc25b2000-02-02 15:10:15 +000016 """Generic Python debugger base class.
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000017
Guido van Rossum4acc25b2000-02-02 15:10:15 +000018 This class takes care of details of the trace facility;
19 a derived class should implement user interaction.
20 The standard debugger class (pdb.Pdb) is an example.
21 """
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000022
Georg Brandl4d4313d2009-05-05 08:54:11 +000023 def __init__(self, skip=None):
24 self.skip = set(skip) if skip else None
Guido van Rossum4acc25b2000-02-02 15:10:15 +000025 self.breaks = {}
26 self.fncache = {}
Senthil Kumaran7f6d4e12012-05-01 10:36:28 +080027 self.frame_returning = None
Barry Warsaw148ffbc1999-09-09 23:24:33 +000028
Guido van Rossum4acc25b2000-02-02 15:10:15 +000029 def canonic(self, filename):
Guido van Rossum42f53322001-11-29 02:50:15 +000030 if filename == "<" + filename[1:-1] + ">":
31 return filename
Guido van Rossum4acc25b2000-02-02 15:10:15 +000032 canonic = self.fncache.get(filename)
33 if not canonic:
34 canonic = os.path.abspath(filename)
Guido van Rossumbdba3202002-02-25 23:23:24 +000035 canonic = os.path.normcase(canonic)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000036 self.fncache[filename] = canonic
37 return canonic
Tim Peters11cf6052001-01-14 21:54:20 +000038
Guido van Rossum4acc25b2000-02-02 15:10:15 +000039 def reset(self):
40 import linecache
41 linecache.checkcache()
42 self.botframe = None
Benjamin Peterson98353942008-05-11 14:13:25 +000043 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +000044
Guido van Rossum4acc25b2000-02-02 15:10:15 +000045 def trace_dispatch(self, frame, event, arg):
46 if self.quitting:
47 return # None
48 if event == 'line':
49 return self.dispatch_line(frame)
50 if event == 'call':
51 return self.dispatch_call(frame, arg)
52 if event == 'return':
53 return self.dispatch_return(frame, arg)
54 if event == 'exception':
55 return self.dispatch_exception(frame, arg)
Nicholas Bastinc69ebe82004-03-24 21:57:10 +000056 if event == 'c_call':
57 return self.trace_dispatch
58 if event == 'c_exception':
59 return self.trace_dispatch
60 if event == 'c_return':
61 return self.trace_dispatch
Walter Dörwald70a6b492004-02-12 17:35:32 +000062 print 'bdb.Bdb.dispatch: unknown debugging event:', repr(event)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000063 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000064
Guido van Rossum4acc25b2000-02-02 15:10:15 +000065 def dispatch_line(self, frame):
66 if self.stop_here(frame) or self.break_here(frame):
67 self.user_line(frame)
68 if self.quitting: raise BdbQuit
69 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000070
Guido van Rossum4acc25b2000-02-02 15:10:15 +000071 def dispatch_call(self, frame, arg):
72 # XXX 'arg' is no longer used
73 if self.botframe is None:
74 # First call of dispatch since reset()
Christian Tismer313a7512002-05-28 08:04:00 +000075 self.botframe = frame.f_back # (CT) Note that this may also be None!
Guido van Rossum4acc25b2000-02-02 15:10:15 +000076 return self.trace_dispatch
77 if not (self.stop_here(frame) or self.break_anywhere(frame)):
78 # No need to trace this function
79 return # None
80 self.user_call(frame, arg)
81 if self.quitting: raise BdbQuit
82 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000083
Guido van Rossum4acc25b2000-02-02 15:10:15 +000084 def dispatch_return(self, frame, arg):
85 if self.stop_here(frame) or frame == self.returnframe:
Senthil Kumarandc8cb3d2012-05-01 10:46:59 +080086 try:
87 self.frame_returning = frame
88 self.user_return(frame, arg)
89 finally:
90 self.frame_returning = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +000091 if self.quitting: raise BdbQuit
Just van Rossumae1f65f2001-06-25 18:01:24 +000092 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000093
Guido van Rossum4acc25b2000-02-02 15:10:15 +000094 def dispatch_exception(self, frame, arg):
95 if self.stop_here(frame):
96 self.user_exception(frame, arg)
97 if self.quitting: raise BdbQuit
98 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000099
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000100 # Normally derived classes don't override the following
101 # methods, but they may if they want to redefine the
102 # definition of stopping and breakpoints.
Tim Peters11cf6052001-01-14 21:54:20 +0000103
Georg Brandl4d4313d2009-05-05 08:54:11 +0000104 def is_skipped_module(self, module_name):
105 for pattern in self.skip:
106 if fnmatch.fnmatch(module_name, pattern):
107 return True
108 return False
109
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000110 def stop_here(self, frame):
Neal Norwitz72a2b4d2002-05-29 00:54:38 +0000111 # (CT) stopframe may now also be None, see dispatch_call.
112 # (CT) the former test for None is therefore removed from here.
Georg Brandl4d4313d2009-05-05 08:54:11 +0000113 if self.skip and \
114 self.is_skipped_module(frame.f_globals.get('__name__')):
115 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000116 if frame is self.stopframe:
Georg Brandl50775992010-08-01 19:33:15 +0000117 if self.stoplineno == -1:
118 return False
Benjamin Peterson98353942008-05-11 14:13:25 +0000119 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000120 while frame is not None and frame is not self.stopframe:
121 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000122 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000123 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000124 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000125
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000126 def break_here(self, frame):
127 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000128 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000129 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000130 lineno = frame.f_lineno
131 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000132 # The line itself has no breakpoint, but maybe the line is the
133 # first line of a function with breakpoint set by function name.
134 lineno = frame.f_code.co_firstlineno
135 if not lineno in self.breaks[filename]:
136 return False
137
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000138 # flag says ok to delete temp. bp
139 (bp, flag) = effective(filename, lineno, frame)
140 if bp:
141 self.currentbp = bp.number
142 if (flag and bp.temporary):
143 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000144 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000145 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000146 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000147
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000148 def do_clear(self, arg):
149 raise NotImplementedError, "subclass of bdb must implement do_clear()"
150
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000151 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000152 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000153
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000154 # Derived classes should override the user_* methods
155 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000156
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000157 def user_call(self, frame, argument_list):
158 """This method is called when there is the remote possibility
159 that we ever need to stop in this function."""
160 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000161
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000162 def user_line(self, frame):
163 """This method is called when we stop or break at this line."""
164 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000165
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000166 def user_return(self, frame, return_value):
167 """This method is called when a return trap is set here."""
168 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000169
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000170 def user_exception(self, frame, exc_info):
171 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000172 """This method is called if an exception occurs,
173 but only if we are to stop at or just below this level."""
174 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000175
Georg Brandl50775992010-08-01 19:33:15 +0000176 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
Benjamin Peterson98353942008-05-11 14:13:25 +0000177 self.stopframe = stopframe
178 self.returnframe = returnframe
179 self.quitting = 0
Georg Brandl50775992010-08-01 19:33:15 +0000180 # stoplineno >= 0 means: stop at line >= the stoplineno
181 # stoplineno -1 means: don't stop at all
Benjamin Peterson98353942008-05-11 14:13:25 +0000182 self.stoplineno = stoplineno
183
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000184 # Derived classes and clients can call the following methods
185 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000186
Benjamin Peterson98353942008-05-11 14:13:25 +0000187 def set_until(self, frame): #the name "until" is borrowed from gdb
188 """Stop when the line with the line no greater than the current one is
189 reached or when returning from current frame"""
190 self._set_stopinfo(frame, frame, frame.f_lineno+1)
191
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000192 def set_step(self):
193 """Stop after one line of code."""
Senthil Kumaran7f6d4e12012-05-01 10:36:28 +0800194 # Issue #13183: pdb skips frames after hitting a breakpoint and running
195 # step commands.
196 # Restore the trace function in the caller (that may not have been set
197 # for performance reasons) when returning from the current frame.
198 if self.frame_returning:
199 caller_frame = self.frame_returning.f_back
200 if caller_frame and not caller_frame.f_trace:
201 caller_frame.f_trace = self.trace_dispatch
Georg Brandl50775992010-08-01 19:33:15 +0000202 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000203
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000204 def set_next(self, frame):
205 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000206 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000207
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000208 def set_return(self, frame):
209 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000210 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000211
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000212 def set_trace(self, frame=None):
213 """Start debugging from `frame`.
214
215 If frame is not specified, debugging starts from caller's frame.
216 """
217 if frame is None:
218 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000219 self.reset()
220 while frame:
221 frame.f_trace = self.trace_dispatch
222 self.botframe = frame
223 frame = frame.f_back
224 self.set_step()
225 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000226
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000227 def set_continue(self):
228 # Don't stop except at breakpoints or when finished
Georg Brandl50775992010-08-01 19:33:15 +0000229 self._set_stopinfo(self.botframe, None, -1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000230 if not self.breaks:
231 # no breakpoints; run without debugger overhead
232 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000233 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000234 while frame and frame is not self.botframe:
235 del frame.f_trace
236 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000237
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000238 def set_quit(self):
239 self.stopframe = self.botframe
240 self.returnframe = None
241 self.quitting = 1
242 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000243
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000244 # Derived classes and clients can call the following methods
245 # to manipulate breakpoints. These methods return an
246 # error message is something went wrong, None if all is well.
247 # Set_break prints out the breakpoint line and file:lineno.
248 # Call self.get_*break*() to see the breakpoints or better
249 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000250
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000251 def set_break(self, filename, lineno, temporary=0, cond = None,
252 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000253 filename = self.canonic(filename)
254 import linecache # Import as late as possible
255 line = linecache.getline(filename, lineno)
256 if not line:
257 return 'Line %s:%d does not exist' % (filename,
258 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000259 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000260 self.breaks[filename] = []
261 list = self.breaks[filename]
262 if not lineno in list:
263 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000264 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000265
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000266 def _prune_breaks(self, filename, lineno):
267 if (filename, lineno) not in Breakpoint.bplist:
268 self.breaks[filename].remove(lineno)
269 if not self.breaks[filename]:
270 del self.breaks[filename]
271
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000272 def clear_break(self, filename, lineno):
273 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000274 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000275 return 'There are no breakpoints in %s' % filename
276 if lineno not in self.breaks[filename]:
277 return 'There is no breakpoint at %s:%d' % (filename,
278 lineno)
279 # If there's only one bp in the list for that file,line
280 # pair, then remove the breaks entry
281 for bp in Breakpoint.bplist[filename, lineno][:]:
282 bp.deleteMe()
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000283 self._prune_breaks(filename, lineno)
Tim Peters11cf6052001-01-14 21:54:20 +0000284
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000285 def clear_bpbynumber(self, arg):
286 try:
287 number = int(arg)
288 except:
289 return 'Non-numeric breakpoint number (%s)' % arg
290 try:
291 bp = Breakpoint.bpbynumber[number]
292 except IndexError:
293 return 'Breakpoint number (%d) out of range' % number
294 if not bp:
295 return 'Breakpoint (%d) already deleted' % number
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000296 bp.deleteMe()
297 self._prune_breaks(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000298
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000299 def clear_all_file_breaks(self, filename):
300 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000301 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000302 return 'There are no breakpoints in %s' % filename
303 for line in self.breaks[filename]:
304 blist = Breakpoint.bplist[filename, line]
305 for bp in blist:
306 bp.deleteMe()
307 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000308
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000309 def clear_all_breaks(self):
310 if not self.breaks:
311 return 'There are no breakpoints'
312 for bp in Breakpoint.bpbynumber:
313 if bp:
314 bp.deleteMe()
315 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000316
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000317 def get_break(self, filename, lineno):
318 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000319 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000320 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000321
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000322 def get_breaks(self, filename, lineno):
323 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000324 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000325 lineno in self.breaks[filename] and \
326 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000327
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000328 def get_file_breaks(self, filename):
329 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000330 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000331 return self.breaks[filename]
332 else:
333 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000334
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000335 def get_all_breaks(self):
336 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000337
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000338 # Derived classes and clients can call the following method
339 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000340
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000341 def get_stack(self, f, t):
342 stack = []
343 if t and t.tb_frame is f:
344 t = t.tb_next
345 while f is not None:
346 stack.append((f, f.f_lineno))
347 if f is self.botframe:
348 break
349 f = f.f_back
350 stack.reverse()
351 i = max(0, len(stack) - 1)
352 while t is not None:
353 stack.append((t.tb_frame, t.tb_lineno))
354 t = t.tb_next
Benjamin Petersonc18574c2008-10-22 21:16:34 +0000355 if f is None:
356 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000357 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000358
359 #
360
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000361 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000362 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000363 frame, lineno = frame_lineno
364 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000365 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000366 if frame.f_code.co_name:
367 s = s + frame.f_code.co_name
368 else:
369 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000370 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000371 args = frame.f_locals['__args__']
372 else:
373 args = None
374 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000375 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000376 else:
377 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000378 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000379 rv = frame.f_locals['__return__']
380 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000381 s = s + repr.repr(rv)
Nick Coghlana2053472008-12-14 10:54:50 +0000382 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000383 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000384 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000385
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000386 # The following two methods can be called by clients to use
387 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000388
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000389 def run(self, cmd, 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(cmd, types.CodeType):
398 cmd = cmd+'\n'
399 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000400 exec cmd in 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)
Tim Peters11cf6052001-01-14 21:54:20 +0000406
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 def runeval(self, expr, globals=None, locals=None):
408 if globals is None:
409 import __main__
410 globals = __main__.__dict__
411 if locals is None:
412 locals = globals
413 self.reset()
414 sys.settrace(self.trace_dispatch)
415 if not isinstance(expr, types.CodeType):
416 expr = expr+'\n'
417 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000418 return eval(expr, globals, locals)
419 except BdbQuit:
420 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000421 finally:
422 self.quitting = 1
423 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000424
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000425 def runctx(self, cmd, globals, locals):
426 # B/W compatibility
427 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000428
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000429 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000430
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000431 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000432 self.reset()
433 sys.settrace(self.trace_dispatch)
434 res = None
435 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000436 res = func(*args, **kwds)
437 except BdbQuit:
438 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000439 finally:
440 self.quitting = 1
441 sys.settrace(None)
442 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000443
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000444
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000446 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000447
Guido van Rossumd93643f1998-09-11 22:38:35 +0000448
449class Breakpoint:
450
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000451 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000452
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000453 Implements temporary breakpoints, ignore counts, disabling and
454 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000455
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000456 Breakpoints are indexed by number through bpbynumber and by
457 the file,line tuple using bplist. The former points to a
458 single instance of class Breakpoint. The latter points to a
459 list of such instances since there may be more than one
460 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000461
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000462 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000463
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000464 # XXX Keeping state in the class is a mistake -- this means
465 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000466
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000467 next = 1 # Next bp to be assigned
468 bplist = {} # indexed by (file, lineno) tuple
469 bpbynumber = [None] # Each entry is None or an instance of Bpt
470 # index 0 is unused, except for marking an
471 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000472
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000473 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
474 self.funcname = funcname
475 # Needed if funcname is not None.
476 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000477 self.file = file # This better be in canonical form!
478 self.line = line
479 self.temporary = temporary
480 self.cond = cond
481 self.enabled = 1
482 self.ignore = 0
483 self.hits = 0
484 self.number = Breakpoint.next
485 Breakpoint.next = Breakpoint.next + 1
486 # Build the two lists
487 self.bpbynumber.append(self)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000488 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000489 self.bplist[file, line].append(self)
490 else:
491 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000492
Tim Peters11cf6052001-01-14 21:54:20 +0000493
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000494 def deleteMe(self):
495 index = (self.file, self.line)
496 self.bpbynumber[self.number] = None # No longer in list
497 self.bplist[index].remove(self)
498 if not self.bplist[index]:
499 # No more bp for this f:l combo
500 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000501
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000502 def enable(self):
503 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000504
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000505 def disable(self):
506 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000507
Georg Brandl19564802006-05-10 17:13:20 +0000508 def bpprint(self, out=None):
509 if out is None:
510 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000511 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000512 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000513 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000514 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000515 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000516 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000517 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000518 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000519 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
520 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000521 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000522 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000523 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000524 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000525 if (self.hits):
526 if (self.hits > 1): ss = 's'
527 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000528 print >>out, ('\tbreakpoint already hit %d time%s' %
529 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000530
531# -----------end of Breakpoint class----------
532
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000533def checkfuncname(b, frame):
534 """Check whether we should break here because of `b.funcname`."""
535 if not b.funcname:
536 # Breakpoint was set via line number.
537 if b.line != frame.f_lineno:
538 # Breakpoint was set at a line with a def statement and the function
539 # defined is called: don't break.
540 return False
541 return True
542
543 # Breakpoint set via function name.
544
545 if frame.f_code.co_name != b.funcname:
546 # It's not a function call, but rather execution of def statement.
547 return False
548
549 # We are in the right frame.
550 if not b.func_first_executable_line:
551 # The function is entered for the 1st time.
552 b.func_first_executable_line = frame.f_lineno
553
554 if b.func_first_executable_line != frame.f_lineno:
555 # But we are not at the first line number: don't break.
556 return False
557 return True
558
Guido van Rossumd93643f1998-09-11 22:38:35 +0000559# Determines if there is an effective (active) breakpoint at this
560# line of code. Returns breakpoint number or 0 if none
561def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000562 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000563
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000564 Called only if we know there is a bpt at this
565 location. Returns breakpoint that was triggered and a flag
566 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000567
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000568 """
569 possibles = Breakpoint.bplist[file,line]
570 for i in range(0, len(possibles)):
571 b = possibles[i]
572 if b.enabled == 0:
573 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000574 if not checkfuncname(b, frame):
575 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000576 # Count every hit when bp is enabled
577 b.hits = b.hits + 1
578 if not b.cond:
579 # If unconditional, and ignoring,
580 # go on to next, else break
581 if b.ignore > 0:
582 b.ignore = b.ignore -1
583 continue
584 else:
585 # breakpoint and marker that's ok
586 # to delete if temporary
587 return (b,1)
588 else:
589 # Conditional bp.
590 # Ignore count applies only to those bpt hits where the
591 # condition evaluates to true.
592 try:
593 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000594 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000595 if val:
596 if b.ignore > 0:
597 b.ignore = b.ignore -1
598 # continue
599 else:
600 return (b,1)
601 # else:
602 # continue
603 except:
604 # if eval fails, most conservative
605 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000606 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000607 # Don't delete temporary,
608 # as another hint to user.
609 return (b,0)
610 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000611
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000612# -------------------- testing --------------------
613
614class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000615 def user_call(self, frame, args):
616 name = frame.f_code.co_name
617 if not name: name = '???'
618 print '+++ call', name, args
619 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000620 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000621 name = frame.f_code.co_name
622 if not name: name = '???'
623 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlana2053472008-12-14 10:54:50 +0000624 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000625 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000626 def user_return(self, frame, retval):
627 print '+++ return', retval
628 def user_exception(self, frame, exc_stuff):
629 print '+++ exception', exc_stuff
630 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000631
632def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000633 print 'foo(', n, ')'
634 x = bar(n*10)
635 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000636
637def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000638 print 'bar(', a, ')'
639 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000640
641def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000642 t = Tdb()
643 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000644
645# end