blob: c6a10359ac6fca90f996c5db7ce0e12718b63814 [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
Pablo Galindoc7ab5812018-01-29 01:31:00 +00006from inspect import CO_GENERATOR, CO_COROUTINE, CO_ASYNC_GENERATOR
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00007
Georg Brandl26607472010-11-29 20:12:24 +00008__all__ = ["BdbQuit", "Bdb", "Breakpoint"]
Skip Montanaroe99d5ea2001-01-20 19:54:20 +00009
Pablo Galindoc7ab5812018-01-29 01:31:00 +000010GENERATOR_AND_COROUTINE_FLAGS = CO_GENERATOR | CO_COROUTINE | CO_ASYNC_GENERATOR
11
csabella0774e792017-05-16 18:28:02 -040012
Neal Norwitz93cf79f2002-03-31 14:06:41 +000013class BdbQuit(Exception):
Georg Brandl26607472010-11-29 20:12:24 +000014 """Exception to give up completely."""
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000015
16
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000017class Bdb:
Guido van Rossum4acc25b2000-02-02 15:10:15 +000018 """Generic Python debugger base class.
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000019
Guido van Rossum4acc25b2000-02-02 15:10:15 +000020 This class takes care of details of the trace facility;
21 a derived class should implement user interaction.
22 The standard debugger class (pdb.Pdb) is an example.
csabella0774e792017-05-16 18:28:02 -040023
24 The optional skip argument must be an iterable of glob-style
25 module name patterns. The debugger will not step into frames
26 that originate in a module that matches one of these patterns.
27 Whether a frame is considered to originate in a certain module
28 is determined by the __name__ in the frame globals.
Guido van Rossum4acc25b2000-02-02 15:10:15 +000029 """
Guido van Rossum6ea27cc1999-01-25 20:51:34 +000030
Georg Brandl243ad662009-05-05 09:00:19 +000031 def __init__(self, skip=None):
32 self.skip = set(skip) if skip else None
Guido van Rossum4acc25b2000-02-02 15:10:15 +000033 self.breaks = {}
34 self.fncache = {}
Senthil Kumaran42d70812012-05-01 10:07:49 +080035 self.frame_returning = None
Barry Warsaw148ffbc1999-09-09 23:24:33 +000036
Guido van Rossum4acc25b2000-02-02 15:10:15 +000037 def canonic(self, filename):
csabella0774e792017-05-16 18:28:02 -040038 """Return canonical form of filename.
39
40 For real filenames, the canonical form is a case-normalized (on
41 case insenstive filesystems) absolute path. 'Filenames' with
42 angle brackets, such as "<stdin>", generated in interactive
43 mode, are returned unchanged.
44 """
Guido van Rossum42f53322001-11-29 02:50:15 +000045 if filename == "<" + filename[1:-1] + ">":
46 return filename
Guido van Rossum4acc25b2000-02-02 15:10:15 +000047 canonic = self.fncache.get(filename)
48 if not canonic:
49 canonic = os.path.abspath(filename)
Guido van Rossumbdba3202002-02-25 23:23:24 +000050 canonic = os.path.normcase(canonic)
Guido van Rossum4acc25b2000-02-02 15:10:15 +000051 self.fncache[filename] = canonic
52 return canonic
Tim Peters11cf6052001-01-14 21:54:20 +000053
Guido van Rossum4acc25b2000-02-02 15:10:15 +000054 def reset(self):
csabella0774e792017-05-16 18:28:02 -040055 """Set values of attributes as ready to start debugging."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +000056 import linecache
57 linecache.checkcache()
58 self.botframe = None
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +000059 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +000060
Guido van Rossum4acc25b2000-02-02 15:10:15 +000061 def trace_dispatch(self, frame, event, arg):
csabella0774e792017-05-16 18:28:02 -040062 """Dispatch a trace function for debugged frames based on the event.
63
64 This function is installed as the trace function for debugged
65 frames. Its return value is the new trace function, which is
66 usually itself. The default implementation decides how to
67 dispatch a frame, depending on the type of event (passed in as a
68 string) that is about to be executed.
69
70 The event can be one of the following:
71 line: A new line of code is going to be executed.
72 call: A function is about to be called or another code block
73 is entered.
74 return: A function or other code block is about to return.
75 exception: An exception has occurred.
76 c_call: A C function is about to be called.
77 c_return: A C functon has returned.
78 c_exception: A C function has raised an exception.
79
80 For the Python events, specialized functions (see the dispatch_*()
81 methods) are called. For the C events, no action is taken.
82
83 The arg parameter depends on the previous event.
84 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +000085 if self.quitting:
86 return # None
87 if event == 'line':
88 return self.dispatch_line(frame)
89 if event == 'call':
90 return self.dispatch_call(frame, arg)
91 if event == 'return':
92 return self.dispatch_return(frame, arg)
93 if event == 'exception':
94 return self.dispatch_exception(frame, arg)
Nicholas Bastinc69ebe82004-03-24 21:57:10 +000095 if event == 'c_call':
96 return self.trace_dispatch
97 if event == 'c_exception':
98 return self.trace_dispatch
99 if event == 'c_return':
100 return self.trace_dispatch
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000101 print('bdb.Bdb.dispatch: unknown debugging event:', repr(event))
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000102 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +0000103
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000104 def dispatch_line(self, frame):
csabella0774e792017-05-16 18:28:02 -0400105 """Invoke user function and return trace function for line event.
106
107 If the debugger stops on the current line, invoke
108 self.user_line(). Raise BdbQuit if self.quitting is set.
109 Return self.trace_dispatch to continue tracing in this scope.
110 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000111 if self.stop_here(frame) or self.break_here(frame):
112 self.user_line(frame)
113 if self.quitting: raise BdbQuit
114 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +0000115
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000116 def dispatch_call(self, frame, arg):
csabella0774e792017-05-16 18:28:02 -0400117 """Invoke user function and return trace function for call event.
118
119 If the debugger stops on this function call, invoke
120 self.user_call(). Raise BbdQuit if self.quitting is set.
121 Return self.trace_dispatch to continue tracing in this scope.
122 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000123 # XXX 'arg' is no longer used
124 if self.botframe is None:
125 # First call of dispatch since reset()
Christian Tismer313a7512002-05-28 08:04:00 +0000126 self.botframe = frame.f_back # (CT) Note that this may also be None!
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000127 return self.trace_dispatch
128 if not (self.stop_here(frame) or self.break_anywhere(frame)):
129 # No need to trace this function
130 return # None
Guido van Rossum8820c232013-11-21 11:30:06 -0800131 # Ignore call events in generator except when stepping.
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000132 if self.stopframe and frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS:
Guido van Rossum8820c232013-11-21 11:30:06 -0800133 return self.trace_dispatch
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000134 self.user_call(frame, arg)
135 if self.quitting: raise BdbQuit
136 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +0000137
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000138 def dispatch_return(self, frame, arg):
csabella0774e792017-05-16 18:28:02 -0400139 """Invoke user function and return trace function for return event.
140
141 If the debugger stops on this function return, invoke
142 self.user_return(). Raise BdbQuit if self.quitting is set.
143 Return self.trace_dispatch to continue tracing in this scope.
144 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000145 if self.stop_here(frame) or frame == self.returnframe:
Guido van Rossum8820c232013-11-21 11:30:06 -0800146 # Ignore return events in generator except when stepping.
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000147 if self.stopframe and frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS:
Guido van Rossum8820c232013-11-21 11:30:06 -0800148 return self.trace_dispatch
Senthil Kumaran42d70812012-05-01 10:07:49 +0800149 try:
150 self.frame_returning = frame
151 self.user_return(frame, arg)
152 finally:
153 self.frame_returning = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000154 if self.quitting: raise BdbQuit
Guido van Rossum8820c232013-11-21 11:30:06 -0800155 # The user issued a 'next' or 'until' command.
156 if self.stopframe is frame and self.stoplineno != -1:
157 self._set_stopinfo(None, None)
Just van Rossumae1f65f2001-06-25 18:01:24 +0000158 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +0000159
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000160 def dispatch_exception(self, frame, arg):
csabella0774e792017-05-16 18:28:02 -0400161 """Invoke user function and return trace function for exception event.
162
163 If the debugger stops on this exception, invoke
164 self.user_exception(). Raise BdbQuit if self.quitting is set.
165 Return self.trace_dispatch to continue tracing in this scope.
166 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000167 if self.stop_here(frame):
Guido van Rossum8820c232013-11-21 11:30:06 -0800168 # When stepping with next/until/return in a generator frame, skip
169 # the internal StopIteration exception (with no traceback)
170 # triggered by a subiterator run with the 'yield from' statement.
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000171 if not (frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
Guido van Rossum8820c232013-11-21 11:30:06 -0800172 and arg[0] is StopIteration and arg[2] is None):
173 self.user_exception(frame, arg)
174 if self.quitting: raise BdbQuit
175 # Stop at the StopIteration or GeneratorExit exception when the user
176 # has set stopframe in a generator by issuing a return command, or a
177 # next/until command at the last statement in the generator before the
178 # exception.
179 elif (self.stopframe and frame is not self.stopframe
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000180 and self.stopframe.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS
Guido van Rossum8820c232013-11-21 11:30:06 -0800181 and arg[0] in (StopIteration, GeneratorExit)):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000182 self.user_exception(frame, arg)
183 if self.quitting: raise BdbQuit
Guido van Rossum8820c232013-11-21 11:30:06 -0800184
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000185 return self.trace_dispatch
Tim Peters11cf6052001-01-14 21:54:20 +0000186
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000187 # Normally derived classes don't override the following
188 # methods, but they may if they want to redefine the
189 # definition of stopping and breakpoints.
Tim Peters11cf6052001-01-14 21:54:20 +0000190
Georg Brandl243ad662009-05-05 09:00:19 +0000191 def is_skipped_module(self, module_name):
csabella0774e792017-05-16 18:28:02 -0400192 "Return True if module_name matches any skip pattern."
Georg Brandl243ad662009-05-05 09:00:19 +0000193 for pattern in self.skip:
194 if fnmatch.fnmatch(module_name, pattern):
195 return True
196 return False
197
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000198 def stop_here(self, frame):
csabella0774e792017-05-16 18:28:02 -0400199 "Return True if frame is below the starting frame in the stack."
Neal Norwitz72a2b4d2002-05-29 00:54:38 +0000200 # (CT) stopframe may now also be None, see dispatch_call.
201 # (CT) the former test for None is therefore removed from here.
Georg Brandl243ad662009-05-05 09:00:19 +0000202 if self.skip and \
203 self.is_skipped_module(frame.f_globals.get('__name__')):
204 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000205 if frame is self.stopframe:
Georg Brandl3f940892010-07-30 10:29:19 +0000206 if self.stoplineno == -1:
207 return False
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000208 return frame.f_lineno >= self.stoplineno
Guido van Rossum8820c232013-11-21 11:30:06 -0800209 if not self.stopframe:
210 return True
Tim Petersbc0e9102002-04-04 22:55:58 +0000211 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000212
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000213 def break_here(self, frame):
csabella0774e792017-05-16 18:28:02 -0400214 """Return True if there is an effective breakpoint for this line.
215
216 Check for line or function breakpoint and if in effect.
217 Delete temporary breakpoints if effective() says to.
218 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000219 filename = self.canonic(frame.f_code.co_filename)
Georg Brandl26607472010-11-29 20:12:24 +0000220 if filename not in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000221 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000222 lineno = frame.f_lineno
Georg Brandl26607472010-11-29 20:12:24 +0000223 if lineno not in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000224 # The line itself has no breakpoint, but maybe the line is the
225 # first line of a function with breakpoint set by function name.
226 lineno = frame.f_code.co_firstlineno
Georg Brandl26607472010-11-29 20:12:24 +0000227 if lineno not in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000228 return False
229
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000230 # flag says ok to delete temp. bp
231 (bp, flag) = effective(filename, lineno, frame)
232 if bp:
233 self.currentbp = bp.number
234 if (flag and bp.temporary):
235 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000236 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000237 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000238 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000239
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000240 def do_clear(self, arg):
csabella0774e792017-05-16 18:28:02 -0400241 """Remove temporary breakpoint.
242
243 Must implement in derived classes or get NotImplementedError.
244 """
Collin Winterce36ad82007-08-30 01:19:48 +0000245 raise NotImplementedError("subclass of bdb must implement do_clear()")
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000246
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000247 def break_anywhere(self, frame):
csabella0774e792017-05-16 18:28:02 -0400248 """Return True if there is any breakpoint for frame's filename.
249 """
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000250 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000251
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000252 # Derived classes should override the user_* methods
253 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000254
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000255 def user_call(self, frame, argument_list):
csabella0774e792017-05-16 18:28:02 -0400256 """Called if we might stop in a function."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000257 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000258
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000259 def user_line(self, frame):
csabella0774e792017-05-16 18:28:02 -0400260 """Called when when we stop or break at a line."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000261 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000262
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000263 def user_return(self, frame, return_value):
csabella0774e792017-05-16 18:28:02 -0400264 """Called when a return trap is set here."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000265 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000266
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000267 def user_exception(self, frame, exc_info):
csabella0774e792017-05-16 18:28:02 -0400268 """Called when we stop on an exception."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000269 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000270
Georg Brandl3f940892010-07-30 10:29:19 +0000271 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
csabella0774e792017-05-16 18:28:02 -0400272 """Set the attributes for stopping.
273
274 If stoplineno is greater than or equal to 0, then stop at line
275 greater than or equal to the stopline. If stoplineno is -1, then
276 don't stop at all.
277 """
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000278 self.stopframe = stopframe
279 self.returnframe = returnframe
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000280 self.quitting = False
Georg Brandl3f940892010-07-30 10:29:19 +0000281 # stoplineno >= 0 means: stop at line >= the stoplineno
282 # stoplineno -1 means: don't stop at all
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000283 self.stoplineno = stoplineno
284
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000285 # Derived classes and clients can call the following methods
286 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000287
Georg Brandl2dfec552010-07-30 08:43:32 +0000288 def set_until(self, frame, lineno=None):
csabella0774e792017-05-16 18:28:02 -0400289 """Stop when the line with the lineno greater than the current one is
290 reached or when returning from current frame."""
Georg Brandl2dfec552010-07-30 08:43:32 +0000291 # the name "until" is borrowed from gdb
292 if lineno is None:
293 lineno = frame.f_lineno + 1
294 self._set_stopinfo(frame, frame, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000295
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000296 def set_step(self):
297 """Stop after one line of code."""
Senthil Kumaran42d70812012-05-01 10:07:49 +0800298 # Issue #13183: pdb skips frames after hitting a breakpoint and running
299 # step commands.
300 # Restore the trace function in the caller (that may not have been set
301 # for performance reasons) when returning from the current frame.
302 if self.frame_returning:
303 caller_frame = self.frame_returning.f_back
304 if caller_frame and not caller_frame.f_trace:
305 caller_frame.f_trace = self.trace_dispatch
Georg Brandl3f940892010-07-30 10:29:19 +0000306 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000307
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000308 def set_next(self, frame):
309 """Stop on the next line in or below the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000310 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000311
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000312 def set_return(self, frame):
313 """Stop when returning from the given frame."""
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000314 if frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS:
Guido van Rossum8820c232013-11-21 11:30:06 -0800315 self._set_stopinfo(frame, None, -1)
316 else:
317 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000318
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000319 def set_trace(self, frame=None):
csabella0774e792017-05-16 18:28:02 -0400320 """Start debugging from frame.
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000321
322 If frame is not specified, debugging starts from caller's frame.
323 """
324 if frame is None:
325 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000326 self.reset()
327 while frame:
328 frame.f_trace = self.trace_dispatch
329 self.botframe = frame
330 frame = frame.f_back
331 self.set_step()
332 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000333
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000334 def set_continue(self):
csabella0774e792017-05-16 18:28:02 -0400335 """Stop only at breakpoints or when finished.
336
337 If there are no breakpoints, set the system trace function to None.
338 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000339 # Don't stop except at breakpoints or when finished
Georg Brandl3f940892010-07-30 10:29:19 +0000340 self._set_stopinfo(self.botframe, None, -1)
Georg Brandlf8b893e2010-12-04 16:22:44 +0000341 if not self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000342 # no breakpoints; run without debugger overhead
343 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000344 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000345 while frame and frame is not self.botframe:
346 del frame.f_trace
347 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000348
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000349 def set_quit(self):
csabella0774e792017-05-16 18:28:02 -0400350 """Set quitting attribute to True.
351
352 Raises BdbQuit exception in the next call to a dispatch_*() method.
353 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000354 self.stopframe = self.botframe
355 self.returnframe = None
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000356 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000357 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000358
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000359 # Derived classes and clients can call the following methods
360 # to manipulate breakpoints. These methods return an
csabella0774e792017-05-16 18:28:02 -0400361 # error message if something went wrong, None if all is well.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000362 # Set_break prints out the breakpoint line and file:lineno.
363 # Call self.get_*break*() to see the breakpoints or better
364 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000365
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000366 def set_break(self, filename, lineno, temporary=False, cond=None,
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000367 funcname=None):
csabella0774e792017-05-16 18:28:02 -0400368 """Set a new breakpoint for filename:lineno.
369
370 If lineno doesn't exist for the filename, return an error message.
371 The filename should be in canonical form.
372 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000373 filename = self.canonic(filename)
374 import linecache # Import as late as possible
375 line = linecache.getline(filename, lineno)
376 if not line:
Georg Brandl26607472010-11-29 20:12:24 +0000377 return 'Line %s:%d does not exist' % (filename, lineno)
378 list = self.breaks.setdefault(filename, [])
379 if lineno not in list:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000380 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000381 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
csabella0774e792017-05-16 18:28:02 -0400382 return None
Guido van Rossumd93643f1998-09-11 22:38:35 +0000383
Senthil Kumaran6f107042010-11-29 11:54:17 +0000384 def _prune_breaks(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400385 """Prune breakpoints for filname:lineno.
386
387 A list of breakpoints is maintained in the Bdb instance and in
388 the Breakpoint class. If a breakpoint in the Bdb instance no
389 longer exists in the Breakpoint class, then it's removed from the
390 Bdb instance.
391 """
Senthil Kumaran6f107042010-11-29 11:54:17 +0000392 if (filename, lineno) not in Breakpoint.bplist:
393 self.breaks[filename].remove(lineno)
394 if not self.breaks[filename]:
395 del self.breaks[filename]
396
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000397 def clear_break(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400398 """Delete breakpoints for filename:lineno.
399
400 If no breakpoints were set, return an error message.
401 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000402 filename = self.canonic(filename)
Georg Brandl26607472010-11-29 20:12:24 +0000403 if filename not in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000404 return 'There are no breakpoints in %s' % filename
405 if lineno not in self.breaks[filename]:
Georg Brandl26607472010-11-29 20:12:24 +0000406 return 'There is no breakpoint at %s:%d' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000407 # If there's only one bp in the list for that file,line
408 # pair, then remove the breaks entry
409 for bp in Breakpoint.bplist[filename, lineno][:]:
410 bp.deleteMe()
Senthil Kumaran6f107042010-11-29 11:54:17 +0000411 self._prune_breaks(filename, lineno)
csabella0774e792017-05-16 18:28:02 -0400412 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000413
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000414 def clear_bpbynumber(self, arg):
csabella0774e792017-05-16 18:28:02 -0400415 """Delete a breakpoint by its index in Breakpoint.bpbynumber.
416
417 If arg is invalid, return an error message.
418 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000419 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000420 bp = self.get_bpbynumber(arg)
421 except ValueError as err:
422 return str(err)
Senthil Kumaran6f107042010-11-29 11:54:17 +0000423 bp.deleteMe()
424 self._prune_breaks(bp.file, bp.line)
csabella0774e792017-05-16 18:28:02 -0400425 return None
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000426
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000427 def clear_all_file_breaks(self, filename):
csabella0774e792017-05-16 18:28:02 -0400428 """Delete all breakpoints in filename.
429
430 If none were set, return an error message.
431 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000432 filename = self.canonic(filename)
Georg Brandl26607472010-11-29 20:12:24 +0000433 if filename not in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000434 return 'There are no breakpoints in %s' % filename
435 for line in self.breaks[filename]:
436 blist = Breakpoint.bplist[filename, line]
437 for bp in blist:
438 bp.deleteMe()
439 del self.breaks[filename]
csabella0774e792017-05-16 18:28:02 -0400440 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000441
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000442 def clear_all_breaks(self):
csabella0774e792017-05-16 18:28:02 -0400443 """Delete all existing breakpoints.
444
445 If none were set, return an error message.
446 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000447 if not self.breaks:
448 return 'There are no breakpoints'
449 for bp in Breakpoint.bpbynumber:
450 if bp:
451 bp.deleteMe()
452 self.breaks = {}
csabella0774e792017-05-16 18:28:02 -0400453 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000454
Georg Brandl7410dd12010-07-30 12:01:20 +0000455 def get_bpbynumber(self, arg):
csabella0774e792017-05-16 18:28:02 -0400456 """Return a breakpoint by its index in Breakpoint.bybpnumber.
457
458 For invalid arg values or if the breakpoint doesn't exist,
459 raise a ValueError.
460 """
Georg Brandl7410dd12010-07-30 12:01:20 +0000461 if not arg:
462 raise ValueError('Breakpoint number expected')
463 try:
464 number = int(arg)
465 except ValueError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300466 raise ValueError('Non-numeric breakpoint number %s' % arg) from None
Georg Brandl7410dd12010-07-30 12:01:20 +0000467 try:
468 bp = Breakpoint.bpbynumber[number]
469 except IndexError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300470 raise ValueError('Breakpoint number %d out of range' % number) from None
Georg Brandl7410dd12010-07-30 12:01:20 +0000471 if bp is None:
472 raise ValueError('Breakpoint %d already deleted' % number)
473 return bp
474
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000475 def get_break(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400476 """Return True if there is a breakpoint for filename:lineno."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000477 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000478 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000479 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000480
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000481 def get_breaks(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400482 """Return all breakpoints for filename:lineno.
483
484 If no breakpoints are set, return an empty list.
485 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000486 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000487 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000488 lineno in self.breaks[filename] and \
489 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000490
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000491 def get_file_breaks(self, filename):
csabella0774e792017-05-16 18:28:02 -0400492 """Return all lines with breakpoints for filename.
493
494 If no breakpoints are set, return an empty list.
495 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000496 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000497 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000498 return self.breaks[filename]
499 else:
500 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000501
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000502 def get_all_breaks(self):
csabella0774e792017-05-16 18:28:02 -0400503 """Return all breakpoints that are set."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000504 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000505
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000506 # Derived classes and clients can call the following method
507 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000508
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000509 def get_stack(self, f, t):
csabella0774e792017-05-16 18:28:02 -0400510 """Return a list of (frame, lineno) in a stack trace and a size.
511
512 List starts with original calling frame, if there is one.
513 Size may be number of frames above or below f.
514 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000515 stack = []
516 if t and t.tb_frame is f:
517 t = t.tb_next
518 while f is not None:
519 stack.append((f, f.f_lineno))
520 if f is self.botframe:
521 break
522 f = f.f_back
523 stack.reverse()
524 i = max(0, len(stack) - 1)
525 while t is not None:
526 stack.append((t.tb_frame, t.tb_lineno))
527 t = t.tb_next
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000528 if f is None:
529 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000530 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000531
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000532 def format_stack_entry(self, frame_lineno, lprefix=': '):
csabella0774e792017-05-16 18:28:02 -0400533 """Return a string with information about a stack entry.
534
535 The stack entry frame_lineno is a (frame, lineno) tuple. The
536 return string contains the canonical filename, the function name
537 or '<lambda>', the input arguments, the return value, and the
538 line of code (if it exists).
539
540 """
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000541 import linecache, reprlib
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000542 frame, lineno = frame_lineno
543 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000544 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000545 if frame.f_code.co_name:
Georg Brandl26607472010-11-29 20:12:24 +0000546 s += frame.f_code.co_name
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000547 else:
Georg Brandl26607472010-11-29 20:12:24 +0000548 s += "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000549 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000550 args = frame.f_locals['__args__']
551 else:
552 args = None
553 if args:
Georg Brandl26607472010-11-29 20:12:24 +0000554 s += reprlib.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000555 else:
Georg Brandl26607472010-11-29 20:12:24 +0000556 s += '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000557 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000558 rv = frame.f_locals['__return__']
Georg Brandl26607472010-11-29 20:12:24 +0000559 s += '->'
560 s += reprlib.repr(rv)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000561 line = linecache.getline(filename, lineno, frame.f_globals)
Georg Brandl26607472010-11-29 20:12:24 +0000562 if line:
563 s += lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000564 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000565
Georg Brandl46b9afc2010-07-30 09:14:20 +0000566 # The following methods can be called by clients to use
567 # a debugger to debug a statement or an expression.
568 # Both can be given as a string, or a code object.
Tim Peters11cf6052001-01-14 21:54:20 +0000569
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000570 def run(self, cmd, globals=None, locals=None):
csabella0774e792017-05-16 18:28:02 -0400571 """Debug a statement executed via the exec() function.
572
573 globals defaults to __main__.dict; locals defaults to globals.
574 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000575 if globals is None:
576 import __main__
577 globals = __main__.__dict__
578 if locals is None:
579 locals = globals
580 self.reset()
Victor Stinner4bd81722011-01-06 00:49:38 +0000581 if isinstance(cmd, str):
582 cmd = compile(cmd, "<string>", "exec")
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000583 sys.settrace(self.trace_dispatch)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000584 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000585 exec(cmd, globals, locals)
586 except BdbQuit:
587 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000588 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000589 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000590 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000591
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000592 def runeval(self, expr, globals=None, locals=None):
csabella0774e792017-05-16 18:28:02 -0400593 """Debug an expression executed via the eval() function.
594
595 globals defaults to __main__.dict; locals defaults to globals.
596 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000597 if globals is None:
598 import __main__
599 globals = __main__.__dict__
600 if locals is None:
601 locals = globals
602 self.reset()
603 sys.settrace(self.trace_dispatch)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000604 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000605 return eval(expr, globals, locals)
606 except BdbQuit:
607 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000608 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000609 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000610 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000611
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 def runctx(self, cmd, globals, locals):
csabella0774e792017-05-16 18:28:02 -0400613 """For backwards-compatibility. Defers to run()."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000614 # B/W compatibility
615 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000616
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000617 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000618
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +0000619 def runcall(self, func, *args, **kwds):
csabella0774e792017-05-16 18:28:02 -0400620 """Debug a single function call.
621
622 Return the result of the function call.
623 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000624 self.reset()
625 sys.settrace(self.trace_dispatch)
626 res = None
627 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000628 res = func(*args, **kwds)
629 except BdbQuit:
630 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000631 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000632 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000633 sys.settrace(None)
634 return res
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000635
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000636
Guido van Rossumb6775db1994-08-01 11:34:53 +0000637def set_trace():
csabella0774e792017-05-16 18:28:02 -0400638 """Start debugging with a Bdb instance from the caller's frame."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000639 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640
Guido van Rossumd93643f1998-09-11 22:38:35 +0000641
642class Breakpoint:
Georg Brandl26607472010-11-29 20:12:24 +0000643 """Breakpoint class.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000644
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000645 Implements temporary breakpoints, ignore counts, disabling and
646 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000647
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000648 Breakpoints are indexed by number through bpbynumber and by
csabella0774e792017-05-16 18:28:02 -0400649 the (file, line) tuple using bplist. The former points to a
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000650 single instance of class Breakpoint. The latter points to a
651 list of such instances since there may be more than one
652 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000653
csabella0774e792017-05-16 18:28:02 -0400654 When creating a breakpoint, its associated filename should be
655 in canonical form. If funcname is defined, a breakpoint hit will be
656 counted when the first line of that function is executed. A
657 conditional breakpoint always counts a hit.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000658 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000659
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000660 # XXX Keeping state in the class is a mistake -- this means
661 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000662
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000663 next = 1 # Next bp to be assigned
664 bplist = {} # indexed by (file, lineno) tuple
665 bpbynumber = [None] # Each entry is None or an instance of Bpt
666 # index 0 is unused, except for marking an
667 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000668
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000669 def __init__(self, file, line, temporary=False, cond=None, funcname=None):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000670 self.funcname = funcname
671 # Needed if funcname is not None.
672 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000673 self.file = file # This better be in canonical form!
674 self.line = line
675 self.temporary = temporary
676 self.cond = cond
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000677 self.enabled = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000678 self.ignore = 0
679 self.hits = 0
680 self.number = Breakpoint.next
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000681 Breakpoint.next += 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000682 # Build the two lists
683 self.bpbynumber.append(self)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000684 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000685 self.bplist[file, line].append(self)
686 else:
687 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000688
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000689 def deleteMe(self):
csabella0774e792017-05-16 18:28:02 -0400690 """Delete the breakpoint from the list associated to a file:line.
691
692 If it is the last breakpoint in that position, it also deletes
693 the entry for the file:line.
694 """
695
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000696 index = (self.file, self.line)
697 self.bpbynumber[self.number] = None # No longer in list
698 self.bplist[index].remove(self)
699 if not self.bplist[index]:
700 # No more bp for this f:l combo
701 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000702
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000703 def enable(self):
csabella0774e792017-05-16 18:28:02 -0400704 """Mark the breakpoint as enabled."""
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000705 self.enabled = True
Guido van Rossumd93643f1998-09-11 22:38:35 +0000706
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000707 def disable(self):
csabella0774e792017-05-16 18:28:02 -0400708 """Mark the breakpoint as disabled."""
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000709 self.enabled = False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000710
Thomas Wouters477c8d52006-05-27 19:21:47 +0000711 def bpprint(self, out=None):
csabella0774e792017-05-16 18:28:02 -0400712 """Print the output of bpformat().
713
714 The optional out argument directs where the output is sent
715 and defaults to standard output.
716 """
Thomas Wouters477c8d52006-05-27 19:21:47 +0000717 if out is None:
718 out = sys.stdout
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000719 print(self.bpformat(), file=out)
720
721 def bpformat(self):
csabella0774e792017-05-16 18:28:02 -0400722 """Return a string with information about the breakpoint.
723
724 The information includes the breakpoint number, temporary
725 status, file:line position, break condition, number of times to
726 ignore, and number of times hit.
727
728 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000729 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000730 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000731 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000732 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000733 if self.enabled:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000734 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000735 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000736 disp = disp + 'no '
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000737 ret = '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
738 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000739 if self.cond:
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000740 ret += '\n\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000741 if self.ignore:
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000742 ret += '\n\tignore next %d hits' % (self.ignore,)
743 if self.hits:
744 if self.hits > 1:
745 ss = 's'
746 else:
747 ss = ''
748 ret += '\n\tbreakpoint already hit %d time%s' % (self.hits, ss)
749 return ret
Guido van Rossumd93643f1998-09-11 22:38:35 +0000750
Georg Brandl7410dd12010-07-30 12:01:20 +0000751 def __str__(self):
csabella0774e792017-05-16 18:28:02 -0400752 "Return a condensed description of the breakpoint."
Georg Brandl7410dd12010-07-30 12:01:20 +0000753 return 'breakpoint %s at %s:%s' % (self.number, self.file, self.line)
754
Guido van Rossumd93643f1998-09-11 22:38:35 +0000755# -----------end of Breakpoint class----------
756
csabella0774e792017-05-16 18:28:02 -0400757
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000758def checkfuncname(b, frame):
csabella0774e792017-05-16 18:28:02 -0400759 """Return True if break should happen here.
760
761 Whether a break should happen depends on the way that b (the breakpoint)
762 was set. If it was set via line number, check if b.line is the same as
763 the one in the frame. If it was set via function name, check if this is
764 the right function and if it is on the first executable line.
765 """
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000766 if not b.funcname:
767 # Breakpoint was set via line number.
768 if b.line != frame.f_lineno:
769 # Breakpoint was set at a line with a def statement and the function
770 # defined is called: don't break.
771 return False
772 return True
773
774 # Breakpoint set via function name.
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000775 if frame.f_code.co_name != b.funcname:
776 # It's not a function call, but rather execution of def statement.
777 return False
778
779 # We are in the right frame.
780 if not b.func_first_executable_line:
781 # The function is entered for the 1st time.
782 b.func_first_executable_line = frame.f_lineno
783
csabella0774e792017-05-16 18:28:02 -0400784 if b.func_first_executable_line != frame.f_lineno:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000785 # But we are not at the first line number: don't break.
786 return False
787 return True
788
csabella0774e792017-05-16 18:28:02 -0400789
Guido van Rossumd93643f1998-09-11 22:38:35 +0000790# Determines if there is an effective (active) breakpoint at this
791# line of code. Returns breakpoint number or 0 if none
792def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000793 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000794
csabella0774e792017-05-16 18:28:02 -0400795 Called only if we know there is a breakpoint at this location. Return
796 the breakpoint that was triggered and a boolean that indicates if it is
797 ok to delete a temporary breakpoint. Return (None, None) if there is no
798 matching breakpoint.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000799 """
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000800 possibles = Breakpoint.bplist[file, line]
801 for b in possibles:
802 if not b.enabled:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000803 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000804 if not checkfuncname(b, frame):
805 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000806 # Count every hit when bp is enabled
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000807 b.hits += 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000808 if not b.cond:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000809 # If unconditional, and ignoring go on to next, else break
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000810 if b.ignore > 0:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000811 b.ignore -= 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000812 continue
813 else:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000814 # breakpoint and marker that it's ok to delete if temporary
815 return (b, True)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000816 else:
817 # Conditional bp.
818 # Ignore count applies only to those bpt hits where the
819 # condition evaluates to true.
820 try:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000821 val = eval(b.cond, frame.f_globals, frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000822 if val:
823 if b.ignore > 0:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000824 b.ignore -= 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000825 # continue
826 else:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000827 return (b, True)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000828 # else:
829 # continue
830 except:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000831 # if eval fails, most conservative thing is to stop on
832 # breakpoint regardless of ignore count. Don't delete
833 # temporary, as another hint to user.
834 return (b, False)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000835 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000836
Georg Brandl26607472010-11-29 20:12:24 +0000837
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000838# -------------------- testing --------------------
839
840class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000841 def user_call(self, frame, args):
842 name = frame.f_code.co_name
843 if not name: name = '???'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000844 print('+++ call', name, args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000845 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000846 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000847 name = frame.f_code.co_name
848 if not name: name = '???'
849 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000850 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000851 print('+++', fn, frame.f_lineno, name, ':', line.strip())
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000852 def user_return(self, frame, retval):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000853 print('+++ return', retval)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000854 def user_exception(self, frame, exc_stuff):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000855 print('+++ exception', exc_stuff)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000856 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000857
858def foo(n):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000859 print('foo(', n, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000860 x = bar(n*10)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000861 print('bar returned', x)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000862
863def bar(a):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000864 print('bar(', a, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000865 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000866
867def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000868 t = Tdb()
869 t.run('import bdb; bdb.foo(10)')