blob: 50d9eece89ad722e3fb23f2709fee96e039e7ed2 [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
Miss Islington (bot)4bd1d052019-08-30 13:42:54 -070041 case insensitive filesystems) absolute path. 'Filenames' with
csabella0774e792017-05-16 18:28:02 -040042 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.
Stéphane Wirtel07fbbfd2018-10-05 16:17:18 +020077 c_return: A C function has returned.
csabella0774e792017-05-16 18:28:02 -040078 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."
Anthony Sottile86900a42019-03-12 20:57:09 -0700193 if module_name is None: # some modules do not have names
194 return False
Georg Brandl243ad662009-05-05 09:00:19 +0000195 for pattern in self.skip:
196 if fnmatch.fnmatch(module_name, pattern):
197 return True
198 return False
199
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000200 def stop_here(self, frame):
csabella0774e792017-05-16 18:28:02 -0400201 "Return True if frame is below the starting frame in the stack."
Neal Norwitz72a2b4d2002-05-29 00:54:38 +0000202 # (CT) stopframe may now also be None, see dispatch_call.
203 # (CT) the former test for None is therefore removed from here.
Georg Brandl243ad662009-05-05 09:00:19 +0000204 if self.skip and \
205 self.is_skipped_module(frame.f_globals.get('__name__')):
206 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000207 if frame is self.stopframe:
Georg Brandl3f940892010-07-30 10:29:19 +0000208 if self.stoplineno == -1:
209 return False
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000210 return frame.f_lineno >= self.stoplineno
Guido van Rossum8820c232013-11-21 11:30:06 -0800211 if not self.stopframe:
212 return True
Tim Petersbc0e9102002-04-04 22:55:58 +0000213 return False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000214
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000215 def break_here(self, frame):
csabella0774e792017-05-16 18:28:02 -0400216 """Return True if there is an effective breakpoint for this line.
217
218 Check for line or function breakpoint and if in effect.
219 Delete temporary breakpoints if effective() says to.
220 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000221 filename = self.canonic(frame.f_code.co_filename)
Georg Brandl26607472010-11-29 20:12:24 +0000222 if filename not in self.breaks:
Tim Petersbc0e9102002-04-04 22:55:58 +0000223 return False
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000224 lineno = frame.f_lineno
Georg Brandl26607472010-11-29 20:12:24 +0000225 if lineno not in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000226 # The line itself has no breakpoint, but maybe the line is the
227 # first line of a function with breakpoint set by function name.
228 lineno = frame.f_code.co_firstlineno
Georg Brandl26607472010-11-29 20:12:24 +0000229 if lineno not in self.breaks[filename]:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000230 return False
231
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000232 # flag says ok to delete temp. bp
233 (bp, flag) = effective(filename, lineno, frame)
234 if bp:
235 self.currentbp = bp.number
236 if (flag and bp.temporary):
237 self.do_clear(str(bp.number))
Tim Petersbc0e9102002-04-04 22:55:58 +0000238 return True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000239 else:
Tim Petersbc0e9102002-04-04 22:55:58 +0000240 return False
Tim Peters11cf6052001-01-14 21:54:20 +0000241
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000242 def do_clear(self, arg):
csabella0774e792017-05-16 18:28:02 -0400243 """Remove temporary breakpoint.
244
245 Must implement in derived classes or get NotImplementedError.
246 """
Collin Winterce36ad82007-08-30 01:19:48 +0000247 raise NotImplementedError("subclass of bdb must implement do_clear()")
Guido van Rossum9cec8fb2001-04-08 15:05:16 +0000248
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000249 def break_anywhere(self, frame):
csabella0774e792017-05-16 18:28:02 -0400250 """Return True if there is any breakpoint for frame's filename.
251 """
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000252 return self.canonic(frame.f_code.co_filename) in self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000253
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000254 # Derived classes should override the user_* methods
255 # to gain control.
Tim Peters11cf6052001-01-14 21:54:20 +0000256
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000257 def user_call(self, frame, argument_list):
csabella0774e792017-05-16 18:28:02 -0400258 """Called if we might stop in a function."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000259 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000260
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000261 def user_line(self, frame):
Eitan Adlerb5c246f2018-06-02 07:16:19 -0700262 """Called when we stop or break at a line."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000263 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000264
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000265 def user_return(self, frame, return_value):
csabella0774e792017-05-16 18:28:02 -0400266 """Called when a return trap is set here."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000267 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000268
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000269 def user_exception(self, frame, exc_info):
csabella0774e792017-05-16 18:28:02 -0400270 """Called when we stop on an exception."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000271 pass
Tim Peters11cf6052001-01-14 21:54:20 +0000272
Georg Brandl3f940892010-07-30 10:29:19 +0000273 def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
csabella0774e792017-05-16 18:28:02 -0400274 """Set the attributes for stopping.
275
276 If stoplineno is greater than or equal to 0, then stop at line
277 greater than or equal to the stopline. If stoplineno is -1, then
278 don't stop at all.
279 """
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000280 self.stopframe = stopframe
281 self.returnframe = returnframe
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000282 self.quitting = False
Georg Brandl3f940892010-07-30 10:29:19 +0000283 # stoplineno >= 0 means: stop at line >= the stoplineno
284 # stoplineno -1 means: don't stop at all
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000285 self.stoplineno = stoplineno
286
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000287 # Derived classes and clients can call the following methods
288 # to affect the stepping state.
Tim Peters11cf6052001-01-14 21:54:20 +0000289
Georg Brandl2dfec552010-07-30 08:43:32 +0000290 def set_until(self, frame, lineno=None):
csabella0774e792017-05-16 18:28:02 -0400291 """Stop when the line with the lineno greater than the current one is
292 reached or when returning from current frame."""
Georg Brandl2dfec552010-07-30 08:43:32 +0000293 # the name "until" is borrowed from gdb
294 if lineno is None:
295 lineno = frame.f_lineno + 1
296 self._set_stopinfo(frame, frame, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000297
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000298 def set_step(self):
299 """Stop after one line of code."""
Senthil Kumaran42d70812012-05-01 10:07:49 +0800300 # Issue #13183: pdb skips frames after hitting a breakpoint and running
301 # step commands.
302 # Restore the trace function in the caller (that may not have been set
303 # for performance reasons) when returning from the current frame.
304 if self.frame_returning:
305 caller_frame = self.frame_returning.f_back
306 if caller_frame and not caller_frame.f_trace:
307 caller_frame.f_trace = self.trace_dispatch
Georg Brandl3f940892010-07-30 10:29:19 +0000308 self._set_stopinfo(None, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000309
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000310 def set_next(self, frame):
311 """Stop on the next line in or below the given frame."""
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000312 self._set_stopinfo(frame, None)
Tim Peters11cf6052001-01-14 21:54:20 +0000313
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000314 def set_return(self, frame):
315 """Stop when returning from the given frame."""
Pablo Galindoc7ab5812018-01-29 01:31:00 +0000316 if frame.f_code.co_flags & GENERATOR_AND_COROUTINE_FLAGS:
Guido van Rossum8820c232013-11-21 11:30:06 -0800317 self._set_stopinfo(frame, None, -1)
318 else:
319 self._set_stopinfo(frame.f_back, frame)
Tim Peters11cf6052001-01-14 21:54:20 +0000320
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000321 def set_trace(self, frame=None):
csabella0774e792017-05-16 18:28:02 -0400322 """Start debugging from frame.
Johannes Gijsbers84a6c202004-11-07 11:35:30 +0000323
324 If frame is not specified, debugging starts from caller's frame.
325 """
326 if frame is None:
327 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000328 self.reset()
329 while frame:
330 frame.f_trace = self.trace_dispatch
331 self.botframe = frame
332 frame = frame.f_back
333 self.set_step()
334 sys.settrace(self.trace_dispatch)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000335
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000336 def set_continue(self):
csabella0774e792017-05-16 18:28:02 -0400337 """Stop only at breakpoints or when finished.
338
339 If there are no breakpoints, set the system trace function to None.
340 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000341 # Don't stop except at breakpoints or when finished
Georg Brandl3f940892010-07-30 10:29:19 +0000342 self._set_stopinfo(self.botframe, None, -1)
Georg Brandlf8b893e2010-12-04 16:22:44 +0000343 if not self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000344 # no breakpoints; run without debugger overhead
345 sys.settrace(None)
Christian Tismer313a7512002-05-28 08:04:00 +0000346 frame = sys._getframe().f_back
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000347 while frame and frame is not self.botframe:
348 del frame.f_trace
349 frame = frame.f_back
Tim Peters11cf6052001-01-14 21:54:20 +0000350
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000351 def set_quit(self):
csabella0774e792017-05-16 18:28:02 -0400352 """Set quitting attribute to True.
353
354 Raises BdbQuit exception in the next call to a dispatch_*() method.
355 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000356 self.stopframe = self.botframe
357 self.returnframe = None
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000358 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000359 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000360
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000361 # Derived classes and clients can call the following methods
362 # to manipulate breakpoints. These methods return an
csabella0774e792017-05-16 18:28:02 -0400363 # error message if something went wrong, None if all is well.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000364 # Set_break prints out the breakpoint line and file:lineno.
365 # Call self.get_*break*() to see the breakpoints or better
366 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
Tim Peters11cf6052001-01-14 21:54:20 +0000367
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000368 def set_break(self, filename, lineno, temporary=False, cond=None,
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000369 funcname=None):
csabella0774e792017-05-16 18:28:02 -0400370 """Set a new breakpoint for filename:lineno.
371
372 If lineno doesn't exist for the filename, return an error message.
373 The filename should be in canonical form.
374 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000375 filename = self.canonic(filename)
376 import linecache # Import as late as possible
377 line = linecache.getline(filename, lineno)
378 if not line:
Georg Brandl26607472010-11-29 20:12:24 +0000379 return 'Line %s:%d does not exist' % (filename, lineno)
380 list = self.breaks.setdefault(filename, [])
381 if lineno not in list:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000382 list.append(lineno)
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000383 bp = Breakpoint(filename, lineno, temporary, cond, funcname)
csabella0774e792017-05-16 18:28:02 -0400384 return None
Guido van Rossumd93643f1998-09-11 22:38:35 +0000385
Senthil Kumaran6f107042010-11-29 11:54:17 +0000386 def _prune_breaks(self, filename, lineno):
Xtreak0d702272019-06-03 04:42:33 +0530387 """Prune breakpoints for filename:lineno.
csabella0774e792017-05-16 18:28:02 -0400388
389 A list of breakpoints is maintained in the Bdb instance and in
390 the Breakpoint class. If a breakpoint in the Bdb instance no
391 longer exists in the Breakpoint class, then it's removed from the
392 Bdb instance.
393 """
Senthil Kumaran6f107042010-11-29 11:54:17 +0000394 if (filename, lineno) not in Breakpoint.bplist:
395 self.breaks[filename].remove(lineno)
396 if not self.breaks[filename]:
397 del self.breaks[filename]
398
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000399 def clear_break(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400400 """Delete breakpoints for filename:lineno.
401
402 If no breakpoints were set, return an error message.
403 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000404 filename = self.canonic(filename)
Georg Brandl26607472010-11-29 20:12:24 +0000405 if filename not in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000406 return 'There are no breakpoints in %s' % filename
407 if lineno not in self.breaks[filename]:
Georg Brandl26607472010-11-29 20:12:24 +0000408 return 'There is no breakpoint at %s:%d' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000409 # If there's only one bp in the list for that file,line
410 # pair, then remove the breaks entry
411 for bp in Breakpoint.bplist[filename, lineno][:]:
412 bp.deleteMe()
Senthil Kumaran6f107042010-11-29 11:54:17 +0000413 self._prune_breaks(filename, lineno)
csabella0774e792017-05-16 18:28:02 -0400414 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000415
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000416 def clear_bpbynumber(self, arg):
csabella0774e792017-05-16 18:28:02 -0400417 """Delete a breakpoint by its index in Breakpoint.bpbynumber.
418
419 If arg is invalid, return an error message.
420 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000421 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000422 bp = self.get_bpbynumber(arg)
423 except ValueError as err:
424 return str(err)
Senthil Kumaran6f107042010-11-29 11:54:17 +0000425 bp.deleteMe()
426 self._prune_breaks(bp.file, bp.line)
csabella0774e792017-05-16 18:28:02 -0400427 return None
Guido van Rossum6ea27cc1999-01-25 20:51:34 +0000428
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000429 def clear_all_file_breaks(self, filename):
csabella0774e792017-05-16 18:28:02 -0400430 """Delete all breakpoints in filename.
431
432 If none were set, return an error message.
433 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000434 filename = self.canonic(filename)
Georg Brandl26607472010-11-29 20:12:24 +0000435 if filename not in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000436 return 'There are no breakpoints in %s' % filename
437 for line in self.breaks[filename]:
438 blist = Breakpoint.bplist[filename, line]
439 for bp in blist:
440 bp.deleteMe()
441 del self.breaks[filename]
csabella0774e792017-05-16 18:28:02 -0400442 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000443
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000444 def clear_all_breaks(self):
csabella0774e792017-05-16 18:28:02 -0400445 """Delete all existing breakpoints.
446
447 If none were set, return an error message.
448 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000449 if not self.breaks:
450 return 'There are no breakpoints'
451 for bp in Breakpoint.bpbynumber:
452 if bp:
453 bp.deleteMe()
454 self.breaks = {}
csabella0774e792017-05-16 18:28:02 -0400455 return None
Tim Peters11cf6052001-01-14 21:54:20 +0000456
Georg Brandl7410dd12010-07-30 12:01:20 +0000457 def get_bpbynumber(self, arg):
csabella0774e792017-05-16 18:28:02 -0400458 """Return a breakpoint by its index in Breakpoint.bybpnumber.
459
460 For invalid arg values or if the breakpoint doesn't exist,
461 raise a ValueError.
462 """
Georg Brandl7410dd12010-07-30 12:01:20 +0000463 if not arg:
464 raise ValueError('Breakpoint number expected')
465 try:
466 number = int(arg)
467 except ValueError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300468 raise ValueError('Non-numeric breakpoint number %s' % arg) from None
Georg Brandl7410dd12010-07-30 12:01:20 +0000469 try:
470 bp = Breakpoint.bpbynumber[number]
471 except IndexError:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300472 raise ValueError('Breakpoint number %d out of range' % number) from None
Georg Brandl7410dd12010-07-30 12:01:20 +0000473 if bp is None:
474 raise ValueError('Breakpoint %d already deleted' % number)
475 return bp
476
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000477 def get_break(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400478 """Return True if there is a breakpoint for filename:lineno."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000479 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000480 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000481 lineno in self.breaks[filename]
Tim Peters11cf6052001-01-14 21:54:20 +0000482
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000483 def get_breaks(self, filename, lineno):
csabella0774e792017-05-16 18:28:02 -0400484 """Return all breakpoints for filename:lineno.
485
486 If no breakpoints are set, return an empty list.
487 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000488 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000489 return filename in self.breaks and \
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000490 lineno in self.breaks[filename] and \
491 Breakpoint.bplist[filename, lineno] or []
Tim Peters11cf6052001-01-14 21:54:20 +0000492
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000493 def get_file_breaks(self, filename):
csabella0774e792017-05-16 18:28:02 -0400494 """Return all lines with breakpoints for filename.
495
496 If no breakpoints are set, return an empty list.
497 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000498 filename = self.canonic(filename)
Raymond Hettinger54f02222002-06-01 14:18:47 +0000499 if filename in self.breaks:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000500 return self.breaks[filename]
501 else:
502 return []
Tim Peters11cf6052001-01-14 21:54:20 +0000503
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000504 def get_all_breaks(self):
csabella0774e792017-05-16 18:28:02 -0400505 """Return all breakpoints that are set."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000506 return self.breaks
Tim Peters11cf6052001-01-14 21:54:20 +0000507
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000508 # Derived classes and clients can call the following method
509 # to get a data structure representing a stack trace.
Tim Peters11cf6052001-01-14 21:54:20 +0000510
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000511 def get_stack(self, f, t):
csabella0774e792017-05-16 18:28:02 -0400512 """Return a list of (frame, lineno) in a stack trace and a size.
513
514 List starts with original calling frame, if there is one.
515 Size may be number of frames above or below f.
516 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000517 stack = []
518 if t and t.tb_frame is f:
519 t = t.tb_next
520 while f is not None:
521 stack.append((f, f.f_lineno))
522 if f is self.botframe:
523 break
524 f = f.f_back
525 stack.reverse()
526 i = max(0, len(stack) - 1)
527 while t is not None:
528 stack.append((t.tb_frame, t.tb_lineno))
529 t = t.tb_next
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +0000530 if f is None:
531 i = max(0, len(stack) - 1)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000532 return stack, i
Tim Peters11cf6052001-01-14 21:54:20 +0000533
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000534 def format_stack_entry(self, frame_lineno, lprefix=': '):
csabella0774e792017-05-16 18:28:02 -0400535 """Return a string with information about a stack entry.
536
537 The stack entry frame_lineno is a (frame, lineno) tuple. The
538 return string contains the canonical filename, the function name
539 or '<lambda>', the input arguments, the return value, and the
540 line of code (if it exists).
541
542 """
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +0000543 import linecache, reprlib
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000544 frame, lineno = frame_lineno
545 filename = self.canonic(frame.f_code.co_filename)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000546 s = '%s(%r)' % (filename, lineno)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000547 if frame.f_code.co_name:
Georg Brandl26607472010-11-29 20:12:24 +0000548 s += frame.f_code.co_name
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000549 else:
Georg Brandl26607472010-11-29 20:12:24 +0000550 s += "<lambda>"
Raymond Hettinger54f02222002-06-01 14:18:47 +0000551 if '__args__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000552 args = frame.f_locals['__args__']
553 else:
554 args = None
555 if args:
Georg Brandl26607472010-11-29 20:12:24 +0000556 s += reprlib.repr(args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000557 else:
Georg Brandl26607472010-11-29 20:12:24 +0000558 s += '()'
Raymond Hettinger54f02222002-06-01 14:18:47 +0000559 if '__return__' in frame.f_locals:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000560 rv = frame.f_locals['__return__']
Georg Brandl26607472010-11-29 20:12:24 +0000561 s += '->'
562 s += reprlib.repr(rv)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000563 line = linecache.getline(filename, lineno, frame.f_globals)
Georg Brandl26607472010-11-29 20:12:24 +0000564 if line:
565 s += lprefix + line.strip()
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000566 return s
Tim Peters11cf6052001-01-14 21:54:20 +0000567
Georg Brandl46b9afc2010-07-30 09:14:20 +0000568 # The following methods can be called by clients to use
569 # a debugger to debug a statement or an expression.
570 # Both can be given as a string, or a code object.
Tim Peters11cf6052001-01-14 21:54:20 +0000571
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000572 def run(self, cmd, globals=None, locals=None):
csabella0774e792017-05-16 18:28:02 -0400573 """Debug a statement executed via the exec() function.
574
575 globals defaults to __main__.dict; locals defaults to globals.
576 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000577 if globals is None:
578 import __main__
579 globals = __main__.__dict__
580 if locals is None:
581 locals = globals
582 self.reset()
Victor Stinner4bd81722011-01-06 00:49:38 +0000583 if isinstance(cmd, str):
584 cmd = compile(cmd, "<string>", "exec")
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000585 sys.settrace(self.trace_dispatch)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000586 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000587 exec(cmd, globals, locals)
588 except BdbQuit:
589 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000590 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000591 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000592 sys.settrace(None)
Tim Peters11cf6052001-01-14 21:54:20 +0000593
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000594 def runeval(self, expr, globals=None, locals=None):
csabella0774e792017-05-16 18:28:02 -0400595 """Debug an expression executed via the eval() function.
596
597 globals defaults to __main__.dict; locals defaults to globals.
598 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000599 if globals is None:
600 import __main__
601 globals = __main__.__dict__
602 if locals is None:
603 locals = globals
604 self.reset()
605 sys.settrace(self.trace_dispatch)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000606 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000607 return eval(expr, globals, locals)
608 except BdbQuit:
609 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000610 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000611 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000612 sys.settrace(None)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000613
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000614 def runctx(self, cmd, globals, locals):
csabella0774e792017-05-16 18:28:02 -0400615 """For backwards-compatibility. Defers to run()."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000616 # B/W compatibility
617 self.run(cmd, globals, locals)
Guido van Rossum4e160981992-09-02 20:43:20 +0000618
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000619 # This method is more useful to debug a single function call.
Guido van Rossum4e160981992-09-02 20:43:20 +0000620
Serhiy Storchaka42a139e2019-04-01 09:16:35 +0300621 def runcall(*args, **kwds):
csabella0774e792017-05-16 18:28:02 -0400622 """Debug a single function call.
623
624 Return the result of the function call.
625 """
Serhiy Storchaka42a139e2019-04-01 09:16:35 +0300626 if len(args) >= 2:
627 self, func, *args = args
628 elif not args:
629 raise TypeError("descriptor 'runcall' of 'Bdb' object "
630 "needs an argument")
631 elif 'func' in kwds:
632 func = kwds.pop('func')
633 self, *args = args
634 import warnings
635 warnings.warn("Passing 'func' as keyword argument is deprecated",
636 DeprecationWarning, stacklevel=2)
637 else:
638 raise TypeError('runcall expected at least 1 positional argument, '
639 'got %d' % (len(args)-1))
640
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000641 self.reset()
642 sys.settrace(self.trace_dispatch)
643 res = None
644 try:
Martin v. Löwisede8ffb2008-03-30 20:43:50 +0000645 res = func(*args, **kwds)
646 except BdbQuit:
647 pass
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000648 finally:
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000649 self.quitting = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000650 sys.settrace(None)
651 return res
Serhiy Storchakad53cf992019-05-06 22:40:27 +0300652 runcall.__text_signature__ = '($self, func, /, *args, **kwds)'
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000653
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000654
Guido van Rossumb6775db1994-08-01 11:34:53 +0000655def set_trace():
csabella0774e792017-05-16 18:28:02 -0400656 """Start debugging with a Bdb instance from the caller's frame."""
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000657 Bdb().set_trace()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000658
Guido van Rossumd93643f1998-09-11 22:38:35 +0000659
660class Breakpoint:
Georg Brandl26607472010-11-29 20:12:24 +0000661 """Breakpoint class.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000662
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000663 Implements temporary breakpoints, ignore counts, disabling and
664 (re)-enabling, and conditionals.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000665
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000666 Breakpoints are indexed by number through bpbynumber and by
csabella0774e792017-05-16 18:28:02 -0400667 the (file, line) tuple using bplist. The former points to a
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000668 single instance of class Breakpoint. The latter points to a
669 list of such instances since there may be more than one
670 breakpoint per line.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000671
csabella0774e792017-05-16 18:28:02 -0400672 When creating a breakpoint, its associated filename should be
673 in canonical form. If funcname is defined, a breakpoint hit will be
674 counted when the first line of that function is executed. A
675 conditional breakpoint always counts a hit.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000676 """
Guido van Rossumd93643f1998-09-11 22:38:35 +0000677
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000678 # XXX Keeping state in the class is a mistake -- this means
679 # you cannot have more than one active Bdb instance.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000680
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000681 next = 1 # Next bp to be assigned
682 bplist = {} # indexed by (file, lineno) tuple
683 bpbynumber = [None] # Each entry is None or an instance of Bpt
684 # index 0 is unused, except for marking an
685 # effective break .... see effective()
Guido van Rossumd93643f1998-09-11 22:38:35 +0000686
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000687 def __init__(self, file, line, temporary=False, cond=None, funcname=None):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000688 self.funcname = funcname
689 # Needed if funcname is not None.
690 self.func_first_executable_line = None
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000691 self.file = file # This better be in canonical form!
692 self.line = line
693 self.temporary = temporary
694 self.cond = cond
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000695 self.enabled = True
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000696 self.ignore = 0
697 self.hits = 0
698 self.number = Breakpoint.next
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000699 Breakpoint.next += 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000700 # Build the two lists
701 self.bpbynumber.append(self)
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000702 if (file, line) in self.bplist:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000703 self.bplist[file, line].append(self)
704 else:
705 self.bplist[file, line] = [self]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000706
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000707 def deleteMe(self):
csabella0774e792017-05-16 18:28:02 -0400708 """Delete the breakpoint from the list associated to a file:line.
709
710 If it is the last breakpoint in that position, it also deletes
711 the entry for the file:line.
712 """
713
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000714 index = (self.file, self.line)
715 self.bpbynumber[self.number] = None # No longer in list
716 self.bplist[index].remove(self)
717 if not self.bplist[index]:
718 # No more bp for this f:l combo
719 del self.bplist[index]
Guido van Rossumd93643f1998-09-11 22:38:35 +0000720
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000721 def enable(self):
csabella0774e792017-05-16 18:28:02 -0400722 """Mark the breakpoint as enabled."""
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000723 self.enabled = True
Guido van Rossumd93643f1998-09-11 22:38:35 +0000724
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000725 def disable(self):
csabella0774e792017-05-16 18:28:02 -0400726 """Mark the breakpoint as disabled."""
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000727 self.enabled = False
Guido van Rossumd93643f1998-09-11 22:38:35 +0000728
Thomas Wouters477c8d52006-05-27 19:21:47 +0000729 def bpprint(self, out=None):
csabella0774e792017-05-16 18:28:02 -0400730 """Print the output of bpformat().
731
732 The optional out argument directs where the output is sent
733 and defaults to standard output.
734 """
Thomas Wouters477c8d52006-05-27 19:21:47 +0000735 if out is None:
736 out = sys.stdout
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000737 print(self.bpformat(), file=out)
738
739 def bpformat(self):
csabella0774e792017-05-16 18:28:02 -0400740 """Return a string with information about the breakpoint.
741
742 The information includes the breakpoint number, temporary
743 status, file:line position, break condition, number of times to
744 ignore, and number of times hit.
745
746 """
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000747 if self.temporary:
Tim Peters11cf6052001-01-14 21:54:20 +0000748 disp = 'del '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000749 else:
Tim Peters11cf6052001-01-14 21:54:20 +0000750 disp = 'keep '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000751 if self.enabled:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000752 disp = disp + 'yes '
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000753 else:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000754 disp = disp + 'no '
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000755 ret = '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
756 self.file, self.line)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000757 if self.cond:
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000758 ret += '\n\tstop only if %s' % (self.cond,)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000759 if self.ignore:
Georg Brandld2fd4ca2010-07-30 15:01:23 +0000760 ret += '\n\tignore next %d hits' % (self.ignore,)
761 if self.hits:
762 if self.hits > 1:
763 ss = 's'
764 else:
765 ss = ''
766 ret += '\n\tbreakpoint already hit %d time%s' % (self.hits, ss)
767 return ret
Guido van Rossumd93643f1998-09-11 22:38:35 +0000768
Georg Brandl7410dd12010-07-30 12:01:20 +0000769 def __str__(self):
csabella0774e792017-05-16 18:28:02 -0400770 "Return a condensed description of the breakpoint."
Georg Brandl7410dd12010-07-30 12:01:20 +0000771 return 'breakpoint %s at %s:%s' % (self.number, self.file, self.line)
772
Guido van Rossumd93643f1998-09-11 22:38:35 +0000773# -----------end of Breakpoint class----------
774
csabella0774e792017-05-16 18:28:02 -0400775
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000776def checkfuncname(b, frame):
csabella0774e792017-05-16 18:28:02 -0400777 """Return True if break should happen here.
778
779 Whether a break should happen depends on the way that b (the breakpoint)
780 was set. If it was set via line number, check if b.line is the same as
781 the one in the frame. If it was set via function name, check if this is
782 the right function and if it is on the first executable line.
783 """
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000784 if not b.funcname:
785 # Breakpoint was set via line number.
786 if b.line != frame.f_lineno:
787 # Breakpoint was set at a line with a def statement and the function
788 # defined is called: don't break.
789 return False
790 return True
791
792 # Breakpoint set via function name.
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000793 if frame.f_code.co_name != b.funcname:
794 # It's not a function call, but rather execution of def statement.
795 return False
796
797 # We are in the right frame.
798 if not b.func_first_executable_line:
799 # The function is entered for the 1st time.
800 b.func_first_executable_line = frame.f_lineno
801
csabella0774e792017-05-16 18:28:02 -0400802 if b.func_first_executable_line != frame.f_lineno:
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000803 # But we are not at the first line number: don't break.
804 return False
805 return True
806
csabella0774e792017-05-16 18:28:02 -0400807
Guido van Rossumd93643f1998-09-11 22:38:35 +0000808# Determines if there is an effective (active) breakpoint at this
809# line of code. Returns breakpoint number or 0 if none
810def effective(file, line, frame):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000811 """Determine which breakpoint for this file:line is to be acted upon.
Guido van Rossumd93643f1998-09-11 22:38:35 +0000812
csabella0774e792017-05-16 18:28:02 -0400813 Called only if we know there is a breakpoint at this location. Return
814 the breakpoint that was triggered and a boolean that indicates if it is
815 ok to delete a temporary breakpoint. Return (None, None) if there is no
816 matching breakpoint.
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000817 """
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000818 possibles = Breakpoint.bplist[file, line]
819 for b in possibles:
820 if not b.enabled:
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000821 continue
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000822 if not checkfuncname(b, frame):
823 continue
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000824 # Count every hit when bp is enabled
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000825 b.hits += 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000826 if not b.cond:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000827 # If unconditional, and ignoring go on to next, else break
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000828 if b.ignore > 0:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000829 b.ignore -= 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000830 continue
831 else:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000832 # breakpoint and marker that it's ok to delete if temporary
833 return (b, True)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000834 else:
835 # Conditional bp.
836 # Ignore count applies only to those bpt hits where the
837 # condition evaluates to true.
838 try:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000839 val = eval(b.cond, frame.f_globals, frame.f_locals)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000840 if val:
841 if b.ignore > 0:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000842 b.ignore -= 1
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000843 # continue
844 else:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000845 return (b, True)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000846 # else:
847 # continue
848 except:
Georg Brandl9aed6cc2010-11-26 12:05:27 +0000849 # if eval fails, most conservative thing is to stop on
850 # breakpoint regardless of ignore count. Don't delete
851 # temporary, as another hint to user.
852 return (b, False)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000853 return (None, None)
Guido van Rossumd93643f1998-09-11 22:38:35 +0000854
Georg Brandl26607472010-11-29 20:12:24 +0000855
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000856# -------------------- testing --------------------
857
858class Tdb(Bdb):
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000859 def user_call(self, frame, args):
860 name = frame.f_code.co_name
861 if not name: name = '???'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000862 print('+++ call', name, args)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000863 def user_line(self, frame):
Eric S. Raymondb49f4a42001-02-09 05:07:04 +0000864 import linecache
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000865 name = frame.f_code.co_name
866 if not name: name = '???'
867 fn = self.canonic(frame.f_code.co_filename)
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000868 line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000869 print('+++', fn, frame.f_lineno, name, ':', line.strip())
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000870 def user_return(self, frame, retval):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000871 print('+++ return', retval)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000872 def user_exception(self, frame, exc_stuff):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000873 print('+++ exception', exc_stuff)
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000874 self.set_continue()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000875
876def foo(n):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000877 print('foo(', n, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000878 x = bar(n*10)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000879 print('bar returned', x)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000880
881def bar(a):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000882 print('bar(', a, ')')
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000883 return a/2
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000884
885def test():
Guido van Rossum4acc25b2000-02-02 15:10:15 +0000886 t = Tdb()
887 t.run('import bdb; bdb.foo(10)')