blob: 1a562f47b0ff29cce0234a25b6ccd05c9dd88684 [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 Kumaran7f6d4e12012-05-01 10:36:28 +080086 self.frame_returning = frame
Guido van Rossum4acc25b2000-02-02 15:10:15 +000087 self.user_return(frame, arg)
Senthil Kumaran7f6d4e12012-05-01 10:36:28 +080088 self.frame_returning = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +000089 if self.quitting: raise BdbQuit
Just van Rossumae1f65f2001-06-25 18:01:24 +000090 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000091
Guido van Rossum4acc25b2000-02-02 15:10:15 +000092 def dispatch_exception(self, frame, arg):
93 if self.stop_here(frame):
94 self.user_exception(frame, arg)
95 if self.quitting: raise BdbQuit
96 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +000097
Guido van Rossum4acc25b2000-02-02 15:10:15 +000098 # Normally derived classes don't override the following
99 # methods, but they may if they want to redefine the
100 # definition of stopping and breakpoints.
Tim Peters11cf6052001-01-14 21:54:20 +0000101
Georg Brandl4d4313d2009-05-05 08:54:11 +0000102 def is_skipped_module(self, module_name):
103 for pattern in self.skip:
104 if fnmatch.fnmatch(module_name, pattern):
105 return True
106 return False
107
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000108 def stop_here(self, frame):
Neal Norwitz72a2b4d2002-05-29 00:54:38 +0000109 # (CT) stopframe may now also be None, see dispatch_call.
110 # (CT) the former test for None is therefore removed from here.
Georg Brandl4d4313d2009-05-05 08:54:11 +0000111 if self.skip and \
112 self.is_skipped_module(frame.f_globals.get('__name__')):
113 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000114 if frame is self.stopframe:
Georg Brandl50775992010-08-01 19:33:15 +0000115 if self.stoplineno == -1:
116 return False
Benjamin Peterson98353942008-05-11 14:13:25 +0000117 return frame.f_lineno >= self.stoplineno
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000118 while frame is not None and frame is not self.stopframe:
119 if frame is self.botframe:
Tim Petersbc0e9102002-04-04 22:55:58 +0000120 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000121 frame = frame.f_back
Tim Petersbc0e9102002-04-04 22:55:58 +0000122 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000123
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000124 def break_here(self, frame):
125 filename = self.canonic(frame.f_code.co_filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000126 if not filename in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000127 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000128 lineno = frame.f_lineno
129 if not lineno in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000130 # The line itself has no breakpoint, but maybe the line is the
131 # first line of a function with breakpoint set by function name.
132 lineno = frame.f_code.co_firstlineno
133 if not lineno in self.breaks[filename]:
134 return False
135
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000136 # flag says ok to delete temp. bp
137 (bp, flag) = effective(filename, lineno, frame)
138 if bp:
139 self.currentbp = bp.number
140 if (flag and bp.temporary):
141 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000142 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000143 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000144 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000145
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000146 def do_clear(self, arg):
147 raise NotImplementedError, "subclass of bdb must implement do_clear()"
148
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000149 def break_anywhere(self, frame):
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000150 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000151
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000152 # Derived classes should override the user_* methods
153 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000154
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000155 def user_call(self, frame, argument_list):
156 """This method is called when there is the remote possibility
157 that we ever need to stop in this function."""
158 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000159
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000160 def user_line(self, frame):
161 """This method is called when we stop or break at this line."""
162 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000163
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000164 def user_return(self, frame, return_value):
165 """This method is called when a return trap is set here."""
166 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000167
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000168 def user_exception(self, frame, exc_info):
169 exc_type, exc_value, exc_traceback = exc_info
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000170 """This method is called if an exception occurs,
171 but only if we are to stop at or just below this level."""
172 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000173
Georg Brandl50775992010-08-01 19:33:15 +0000174 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
Benjamin Peterson98353942008-05-11 14:13:25 +0000175 self.stopframe = stopframe
176 self.returnframe = returnframe
177 self.quitting = 0
Georg Brandl50775992010-08-01 19:33:15 +0000178 # stoplineno >= 0 means: stop at line >= the stoplineno
179 # stoplineno -1 means: don't stop at all
Benjamin Peterson98353942008-05-11 14:13:25 +0000180 self.stoplineno = stoplineno
181
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000182 # Derived classes and clients can call the following methods
183 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000184
Benjamin Peterson98353942008-05-11 14:13:25 +0000185 def set_until(self, frame): #the name "until" is borrowed from gdb
186 """Stop when the line with the line no greater than the current one is
187 reached or when returning from current frame"""
188 self._set_stopinfo(frame, frame, frame.f_lineno+1)
189
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000190 def set_step(self):
191 """Stop after one line of code."""
Senthil Kumaran7f6d4e12012-05-01 10:36:28 +0800192 # Issue #13183: pdb skips frames after hitting a breakpoint and running
193 # step commands.
194 # Restore the trace function in the caller (that may not have been set
195 # for performance reasons) when returning from the current frame.
196 if self.frame_returning:
197 caller_frame = self.frame_returning.f_back
198 if caller_frame and not caller_frame.f_trace:
199 caller_frame.f_trace = self.trace_dispatch
Georg Brandl50775992010-08-01 19:33:15 +0000200 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000201
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000202 def set_next(self, frame):
203 """Stop on the next line in or below the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000204 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000205
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000206 def set_return(self, frame):
207 """Stop when returning from the given frame."""
Benjamin Peterson98353942008-05-11 14:13:25 +0000208 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000209
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000210 def set_trace(self, frame=None):
211 """Start debugging from `frame`.
212
213 If frame is not specified, debugging starts from caller's frame.
214 """
215 if frame is None:
216 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000217 self.reset()
218 while frame:
219 frame.f_trace = self.trace_dispatch
220 self.botframe = frame
221 frame = frame.f_back
222 self.set_step()
223 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000225 def set_continue(self):
226 # Don't stop except at breakpoints or when finished
Georg Brandl50775992010-08-01 19:33:15 +0000227 self._set_stopinfo(self.botframe, None, -1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000228 if not self.breaks:
229 # no breakpoints; run without debugger overhead
230 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000231 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000232 while frame and frame is not self.botframe:
233 del frame.f_trace
234 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000235
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000236 def set_quit(self):
237 self.stopframe = self.botframe
238 self.returnframe = None
239 self.quitting = 1
240 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000241
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000242 # Derived classes and clients can call the following methods
243 # to manipulate breakpoints. These methods return an
244 # error message is something went wrong, None if all is well.
245 # Set_break prints out the breakpoint line and file:lineno.
246 # Call self.get_*break*() to see the breakpoints or better
247 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000248
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000249 def set_break(self, filename, lineno, temporary=0, cond = None,
250 funcname=None):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000251 filename = self.canonic(filename)
252 import linecache # Import as late as possible
253 line = linecache.getline(filename, lineno)
254 if not line:
255 return 'Line %s:%d does not exist' % (filename,
256 lineno)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000257 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000258 self.breaks[filename] = []
259 list = self.breaks[filename]
260 if not lineno in list:
261 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000262 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000263
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000264 def _prune_breaks(self, filename, lineno):
265 if (filename, lineno) not in Breakpoint.bplist:
266 self.breaks[filename].remove(lineno)
267 if not self.breaks[filename]:
268 del self.breaks[filename]
269
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000270 def clear_break(self, filename, lineno):
271 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000272 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000273 return 'There are no breakpoints in %s' % filename
274 if lineno not in self.breaks[filename]:
275 return 'There is no breakpoint at %s:%d' % (filename,
276 lineno)
277 # If there's only one bp in the list for that file,line
278 # pair, then remove the breaks entry
279 for bp in Breakpoint.bplist[filename, lineno][:]:
280 bp.deleteMe()
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000281 self._prune_breaks(filename, lineno)
Tim Peters11cf6052001-01-14 21:54:20 +0000282
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000283 def clear_bpbynumber(self, arg):
284 try:
285 number = int(arg)
286 except:
287 return 'Non-numeric breakpoint number (%s)' % arg
288 try:
289 bp = Breakpoint.bpbynumber[number]
290 except IndexError:
291 return 'Breakpoint number (%d) out of range' % number
292 if not bp:
293 return 'Breakpoint (%d) already deleted' % number
Senthil Kumaran9a5897b2010-11-29 12:41:03 +0000294 bp.deleteMe()
295 self._prune_breaks(bp.file, bp.line)
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000296
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000297 def clear_all_file_breaks(self, filename):
298 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000299 if not filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000300 return 'There are no breakpoints in %s' % filename
301 for line in self.breaks[filename]:
302 blist = Breakpoint.bplist[filename, line]
303 for bp in blist:
304 bp.deleteMe()
305 del self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000306
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000307 def clear_all_breaks(self):
308 if not self.breaks:
309 return 'There are no breakpoints'
310 for bp in Breakpoint.bpbynumber:
311 if bp:
312 bp.deleteMe()
313 self.breaks = {}
Tim Peters11cf6052001-01-14 21:54:20 +0000314
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000315 def get_break(self, filename, lineno):
316 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000317 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000318 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000319
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000320 def get_breaks(self, filename, lineno):
321 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000322 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000323 lineno in self.breaks[filename] and \
324 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000325
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000326 def get_file_breaks(self, filename):
327 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000328 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000329 return self.breaks[filename]
330 else:
331 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000332
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000333 def get_all_breaks(self):
334 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000335
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000336 # Derived classes and clients can call the following method
337 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000338
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000339 def get_stack(self, f, t):
340 stack = []
341 if t and t.tb_frame is f:
342 t = t.tb_next
343 while f is not None:
344 stack.append((f, f.f_lineno))
345 if f is self.botframe:
346 break
347 f = f.f_back
348 stack.reverse()
349 i = max(0, len(stack) - 1)
350 while t is not None:
351 stack.append((t.tb_frame, t.tb_lineno))
352 t = t.tb_next
Benjamin Petersonc18574c2008-10-22 21:16:34 +0000353 if f is None:
354 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000355 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000356
357 #
358
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000359 def format_stack_entry(self, frame_lineno, lprefix=': '):
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000360 import linecache, repr
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000361 frame, lineno = frame_lineno
362 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000363 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000364 if frame.f_code.co_name:
365 s = s + frame.f_code.co_name
366 else:
367 s = s + "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000368 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000369 args = frame.f_locals['__args__']
370 else:
371 args = None
372 if args:
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000373 s = s + repr.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000374 else:
375 s = s + '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000376 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000377 rv = frame.f_locals['__return__']
378 s = s + '->'
Brett Cannon2ee0e8e2008-05-23 05:03:59 +0000379 s = s + repr.repr(rv)
Nick Coghlana2053472008-12-14 10:54:50 +0000380 line = linecache.getline(filename, lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000381 if line: s = s + lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000382 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000383
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000384 # The following two methods can be called by clients to use
385 # a debugger to debug a statement, given as a string.
Tim Peters11cf6052001-01-14 21:54:20 +0000386
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000387 def run(self, cmd, globals=None, locals=None):
388 if globals is None:
389 import __main__
390 globals = __main__.__dict__
391 if locals is None:
392 locals = globals
393 self.reset()
394 sys.settrace(self.trace_dispatch)
395 if not isinstance(cmd, types.CodeType):
396 cmd = cmd+'\n'
397 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000398 exec cmd in globals, locals
399 except BdbQuit:
400 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000401 finally:
402 self.quitting = 1
403 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000404
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000405 def runeval(self, expr, globals=None, locals=None):
406 if globals is None:
407 import __main__
408 globals = __main__.__dict__
409 if locals is None:
410 locals = globals
411 self.reset()
412 sys.settrace(self.trace_dispatch)
413 if not isinstance(expr, types.CodeType):
414 expr = expr+'\n'
415 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000416 return eval(expr, globals, locals)
417 except BdbQuit:
418 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000419 finally:
420 self.quitting = 1
421 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000422
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000423 def runctx(self, cmd, globals, locals):
424 # B/W compatibility
425 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000426
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000427 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000428
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000429 def runcall(self, func, *args, **kwds):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000430 self.reset()
431 sys.settrace(self.trace_dispatch)
432 res = None
433 try:
Benjamin Peterson41cf50d2008-03-28 20:56:00 +0000434 res = func(*args, **kwds)
435 except BdbQuit:
436 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000437 finally:
438 self.quitting = 1
439 sys.settrace(None)
440 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000441
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000442
Guido van Rossumb6775db1994-08-01 11:34:53 +0000443def set_trace():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000444 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445
Guido van Rossumd93643f1998-09-11 22:38:35 +0000446
447class Breakpoint:
448
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000449 """Breakpoint class
Guido van Rossumd93643f1998-09-11 22:38:35 +0000450
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000451 Implements temporary breakpoints, ignore counts, disabling and
452 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000453
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000454 Breakpoints are indexed by number through bpbynumber and by
455 the file,line tuple using bplist. The former points to a
456 single instance of class Breakpoint. The latter points to a
457 list of such instances since there may be more than one
458 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000459
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000460 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000461
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000462 # XXX Keeping state in the class is a mistake -- this means
463 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000464
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000465 next = 1 # Next bp to be assigned
466 bplist = {} # indexed by (file, lineno) tuple
467 bpbynumber = [None] # Each entry is None or an instance of Bpt
468 # index 0 is unused, except for marking an
469 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000470
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000471 def __init__(self, file, line, temporary=0, cond=None, funcname=None):
472 self.funcname = funcname
473 # Needed if funcname is not None.
474 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000475 self.file = file # This better be in canonical form!
476 self.line = line
477 self.temporary = temporary
478 self.cond = cond
479 self.enabled = 1
480 self.ignore = 0
481 self.hits = 0
482 self.number = Breakpoint.next
483 Breakpoint.next = Breakpoint.next + 1
484 # Build the two lists
485 self.bpbynumber.append(self)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000486 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000487 self.bplist[file, line].append(self)
488 else:
489 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000490
Tim Peters11cf6052001-01-14 21:54:20 +0000491
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000492 def deleteMe(self):
493 index = (self.file, self.line)
494 self.bpbynumber[self.number] = None # No longer in list
495 self.bplist[index].remove(self)
496 if not self.bplist[index]:
497 # No more bp for this f:l combo
498 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000499
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000500 def enable(self):
501 self.enabled = 1
Guido van Rossumd93643f1998-09-11 22:38:35 +0000502
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000503 def disable(self):
504 self.enabled = 0
Guido van Rossumd93643f1998-09-11 22:38:35 +0000505
Georg Brandl19564802006-05-10 17:13:20 +0000506 def bpprint(self, out=None):
507 if out is None:
508 out = sys.stdout
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000509 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000510 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000511 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000512 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000513 if self.enabled:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000514 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000515 else:
Martin v. Löwis4b501e62006-04-15 08:41:11 +0000516 disp = disp + 'no '
Georg Brandl19564802006-05-10 17:13:20 +0000517 print >>out, '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
518 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000519 if self.cond:
Georg Brandl19564802006-05-10 17:13:20 +0000520 print >>out, '\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000521 if self.ignore:
Georg Brandl19564802006-05-10 17:13:20 +0000522 print >>out, '\tignore next %d hits' % (self.ignore)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000523 if (self.hits):
524 if (self.hits > 1): ss = 's'
525 else: ss = ''
Georg Brandl19564802006-05-10 17:13:20 +0000526 print >>out, ('\tbreakpoint already hit %d time%s' %
527 (self.hits, ss))
Guido van Rossumd93643f1998-09-11 22:38:35 +0000528
529# -----------end of Breakpoint class----------
530
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000531def checkfuncname(b, frame):
532 """Check whether we should break here because of `b.funcname`."""
533 if not b.funcname:
534 # Breakpoint was set via line number.
535 if b.line != frame.f_lineno:
536 # Breakpoint was set at a line with a def statement and the function
537 # defined is called: don't break.
538 return False
539 return True
540
541 # Breakpoint set via function name.
542
543 if frame.f_code.co_name != b.funcname:
544 # It's not a function call, but rather execution of def statement.
545 return False
546
547 # We are in the right frame.
548 if not b.func_first_executable_line:
549 # The function is entered for the 1st time.
550 b.func_first_executable_line = frame.f_lineno
551
552 if b.func_first_executable_line != frame.f_lineno:
553 # But we are not at the first line number: don't break.
554 return False
555 return True
556
Guido van Rossumd93643f1998-09-11 22:38:35 +0000557# Determines if there is an effective (active) breakpoint at this
558# line of code. Returns breakpoint number or 0 if none
559def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000560 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000561
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000562 Called only if we know there is a bpt at this
563 location. Returns breakpoint that was triggered and a flag
564 that indicates if it is ok to delete a temporary bp.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000565
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000566 """
567 possibles = Breakpoint.bplist[file,line]
568 for i in range(0, len(possibles)):
569 b = possibles[i]
570 if b.enabled == 0:
571 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000572 if not checkfuncname(b, frame):
573 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000574 # Count every hit when bp is enabled
575 b.hits = b.hits + 1
576 if not b.cond:
577 # If unconditional, and ignoring,
578 # go on to next, else break
579 if b.ignore > 0:
580 b.ignore = b.ignore -1
581 continue
582 else:
583 # breakpoint and marker that's ok
584 # to delete if temporary
585 return (b,1)
586 else:
587 # Conditional bp.
588 # Ignore count applies only to those bpt hits where the
589 # condition evaluates to true.
590 try:
591 val = eval(b.cond, frame.f_globals,
Tim Peters11cf6052001-01-14 21:54:20 +0000592 frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000593 if val:
594 if b.ignore > 0:
595 b.ignore = b.ignore -1
596 # continue
597 else:
598 return (b,1)
599 # else:
600 # continue
601 except:
602 # if eval fails, most conservative
603 # thing is to stop on breakpoint
Tim Peters11cf6052001-01-14 21:54:20 +0000604 # regardless of ignore count.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000605 # Don't delete temporary,
606 # as another hint to user.
607 return (b,0)
608 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000609
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000610# -------------------- testing --------------------
611
612class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000613 def user_call(self, frame, args):
614 name = frame.f_code.co_name
615 if not name: name = '???'
616 print '+++ call', name, args
617 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000618 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000619 name = frame.f_code.co_name
620 if not name: name = '???'
621 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlana2053472008-12-14 10:54:50 +0000622 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000623 print '+++', fn, frame.f_lineno, name, ':', line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000624 def user_return(self, frame, retval):
625 print '+++ return', retval
626 def user_exception(self, frame, exc_stuff):
627 print '+++ exception', exc_stuff
628 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000629
630def foo(n):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000631 print 'foo(', n, ')'
632 x = bar(n*10)
633 print 'bar returned', x
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000634
635def bar(a):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000636 print 'bar(', a, ')'
637 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000638
639def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000640 t = Tdb()
641 t.run('import bdb; bdb.foo(10)')
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000642
643# end