blob: 69fd8bd6efb0e53f5ce44ba9e12243b12715a5bc [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossumf17361d1996-07-30 16:28:13 +00002
Georg Brandl02053ee2010-07-18 10:11:03 +00003"""
4The Python Debugger Pdb
5=======================
Guido van Rossum92df0c61992-01-14 18:30:15 +00006
Georg Brandl02053ee2010-07-18 10:11:03 +00007To use the debugger in its simplest form:
8
9 >>> import pdb
10 >>> pdb.run('<a statement>')
11
12The debugger's prompt is '(Pdb) '. This will stop in the first
13function call in <a statement>.
14
15Alternatively, if a statement terminated with an unhandled exception,
16you can use pdb's post-mortem facility to inspect the contents of the
17traceback:
18
19 >>> <a statement>
20 <exception traceback>
21 >>> import pdb
22 >>> pdb.pm()
23
24The commands recognized by the debugger are listed in the next
25section. Most can be abbreviated as indicated; e.g., h(elp) means
26that 'help' can be typed as 'h' or 'help' (but not as 'he' or 'hel',
27nor as 'H' or 'Help' or 'HELP'). Optional arguments are enclosed in
28square brackets. Alternatives in the command syntax are separated
29by a vertical bar (|).
30
31A blank line repeats the previous command literally, except for
32'list', where it lists the next 11 lines.
33
34Commands that the debugger doesn't recognize are assumed to be Python
35statements and are executed in the context of the program being
36debugged. Python statements can also be prefixed with an exclamation
37point ('!'). This is a powerful way to inspect the program being
38debugged; it is even possible to change variables or call functions.
39When an exception occurs in such a statement, the exception name is
40printed but the debugger's state is not changed.
41
42The debugger supports aliases, which can save typing. And aliases can
43have parameters (see the alias help entry) which allows one a certain
44level of adaptability to the context under examination.
45
46Multiple commands may be entered on a single line, separated by the
47pair ';;'. No intelligence is applied to separating the commands; the
48input is split at the first ';;', even if it is in the middle of a
49quoted string.
50
51If a file ".pdbrc" exists in your home directory or in the current
52directory, it is read in and executed as if it had been typed at the
53debugger prompt. This is particularly useful for aliases. If both
54files exist, the one in the home directory is read first and aliases
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -070055defined there can be overridden by the local file. This behavior can be
56disabled by passing the "readrc=False" argument to the Pdb constructor.
Georg Brandl02053ee2010-07-18 10:11:03 +000057
58Aside from aliases, the debugger is not directly programmable; but it
59is implemented as a class from which you can derive your own debugger
60class, which you can make as fancy as you like.
61
62
63Debugger commands
64=================
65
Georg Brandl02053ee2010-07-18 10:11:03 +000066"""
Georg Brandl0d089622010-07-30 16:00:46 +000067# NOTE: the actual command documentation is collected from docstrings of the
68# commands and is appended to __doc__ after the class has been defined.
Guido van Rossum921c8241992-01-10 14:54:42 +000069
Georg Brandl44f2b642010-12-04 16:00:47 +000070import os
71import re
Guido van Rossum921c8241992-01-10 14:54:42 +000072import sys
Guido van Rossum23efba41992-01-27 16:58:47 +000073import cmd
74import bdb
Georg Brandl0a9c3e92010-07-30 18:46:38 +000075import dis
Georg Brandl1acb7462010-12-04 11:20:26 +000076import code
Georg Brandl4c7c3c52012-03-10 22:36:48 +010077import glob
Barry Warsaw210bd202002-11-05 22:40:20 +000078import pprint
Georg Brandl44f2b642010-12-04 16:00:47 +000079import signal
Georg Brandle59ca2a2010-07-30 17:04:28 +000080import inspect
Georg Brandl1acb7462010-12-04 11:20:26 +000081import traceback
82import linecache
Guido van Rossumd8faa362007-04-27 19:54:29 +000083
84
85class Restart(Exception):
86 """Causes a debugger to be restarted for the debugged python program."""
87 pass
88
Skip Montanaro352674d2001-02-07 23:14:30 +000089__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
90 "post_mortem", "help"]
91
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000092def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000093 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000094 try:
95 fp = open(filename)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020096 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +000097 return None
98 # consumer of this info expects the first line to be 1
Georg Brandl6e220552013-10-13 20:51:47 +020099 with fp:
100 for lineno, line in enumerate(fp, start=1):
101 if cre.match(line):
102 return funcname, filename, lineno
103 return None
Guido van Rossum921c8241992-01-10 14:54:42 +0000104
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000105def getsourcelines(obj):
106 lines, lineno = inspect.findsource(obj)
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000107 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000108 # must be a module frame: do not try to cut a block out of it
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000109 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000110 elif inspect.ismodule(obj):
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000111 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000112 return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum921c8241992-01-10 14:54:42 +0000113
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000114def lasti2lineno(code, lasti):
115 linestarts = list(dis.findlinestarts(code))
116 linestarts.reverse()
117 for i, lineno in linestarts:
118 if lasti >= i:
119 return lineno
120 return 0
121
122
Georg Brandlcbc79c72010-12-04 16:21:42 +0000123class _rstr(str):
124 """String that doesn't quote its repr."""
125 def __repr__(self):
126 return self
127
128
Guido van Rossuma558e371994-11-10 22:27:35 +0000129# Interaction prompt line will separate file and call info from code
130# text using value of line_prefix string. A newline and arrow may
131# be to your liking. You can set it once pdb is imported using the
132# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +0000133# line_prefix = ': ' # Use this to get the old situation back
134line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +0000135
Guido van Rossum23efba41992-01-27 16:58:47 +0000136class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +0000137
Xavier de Gaye10e54ae2016-10-12 20:13:24 +0200138 _previous_sigint_handler = None
139
Georg Brandl44f2b642010-12-04 16:00:47 +0000140 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700141 nosigint=False, readrc=True):
Georg Brandl243ad662009-05-05 09:00:19 +0000142 bdb.Bdb.__init__(self, skip=skip)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000143 cmd.Cmd.__init__(self, completekey, stdin, stdout)
Steve Dower60419a72019-06-24 08:42:54 -0700144 sys.audit("pdb.Pdb")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000145 if stdout:
146 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000147 self.prompt = '(Pdb) '
148 self.aliases = {}
Georg Brandlcbc79c72010-12-04 16:21:42 +0000149 self.displaying = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000150 self.mainpyfile = ''
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000151 self._wait_for_mainpyfile = False
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000152 self.tb_lineno = {}
Tim Peters2344fae2001-01-15 00:50:52 +0000153 # Try to load readline if it exists
154 try:
155 import readline
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100156 # remove some common file name delimiters
157 readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
Brett Cannoncd171c82013-07-04 17:43:24 -0400158 except ImportError:
Tim Peters2344fae2001-01-15 00:50:52 +0000159 pass
Georg Brandl44f2b642010-12-04 16:00:47 +0000160 self.allow_kbdint = False
161 self.nosigint = nosigint
Guido van Rossum2424f851998-09-11 22:50:09 +0000162
Timothy Hopper7ea9a852019-08-02 18:20:14 -0400163 # Read ~/.pdbrc and ./.pdbrc
Tim Peters2344fae2001-01-15 00:50:52 +0000164 self.rcLines = []
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700165 if readrc:
Timothy Hopper7ea9a852019-08-02 18:20:14 -0400166 try:
167 with open(os.path.expanduser('~/.pdbrc')) as rcFile:
168 self.rcLines.extend(rcFile)
169 except OSError:
170 pass
Tim Peters2344fae2001-01-15 00:50:52 +0000171 try:
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700172 with open(".pdbrc") as rcFile:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000173 self.rcLines.extend(rcFile)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200174 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +0000175 pass
Guido van Rossum23efba41992-01-27 16:58:47 +0000176
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000177 self.commands = {} # associates a command list to breakpoint numbers
Benjamin Petersond23f8222009-04-05 19:13:16 +0000178 self.commands_doprompt = {} # for each bp num, tells if the prompt
179 # must be disp. after execing the cmd list
180 self.commands_silent = {} # for each bp num, tells if the stack trace
181 # must be disp. after execing the cmd list
182 self.commands_defining = False # True while in the process of defining
183 # a command list
184 self.commands_bnum = None # The breakpoint number for which we are
185 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000186
Georg Brandl44f2b642010-12-04 16:00:47 +0000187 def sigint_handler(self, signum, frame):
188 if self.allow_kbdint:
189 raise KeyboardInterrupt
190 self.message("\nProgram interrupted. (Use 'cont' to resume).")
191 self.set_step()
192 self.set_trace(frame)
Georg Brandl44f2b642010-12-04 16:00:47 +0000193
Tim Peters2344fae2001-01-15 00:50:52 +0000194 def reset(self):
195 bdb.Bdb.reset(self)
196 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000197
Tim Peters2344fae2001-01-15 00:50:52 +0000198 def forget(self):
199 self.lineno = None
200 self.stack = []
201 self.curindex = 0
202 self.curframe = None
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000203 self.tb_lineno.clear()
Guido van Rossum2424f851998-09-11 22:50:09 +0000204
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000205 def setup(self, f, tb):
Tim Peters2344fae2001-01-15 00:50:52 +0000206 self.forget()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000207 self.stack, self.curindex = self.get_stack(f, tb)
208 while tb:
209 # when setting up post-mortem debugging with a traceback, save all
210 # the original line numbers to be displayed along the current line
211 # numbers (which can be different, e.g. due to finally clauses)
212 lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
213 self.tb_lineno[tb.tb_frame] = lineno
214 tb = tb.tb_next
Tim Peters2344fae2001-01-15 00:50:52 +0000215 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000216 # The f_locals dictionary is updated from the actual frame
217 # locals whenever the .f_locals accessor is called, so we
218 # cache it here to ensure that modifications are not overwritten.
219 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000220 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221
Tim Peters2344fae2001-01-15 00:50:52 +0000222 # Can be executed earlier than 'setup' if desired
223 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000224 if not self.rcLines:
225 return
226 # local copy because of recursion
227 rcLines = self.rcLines
228 rcLines.reverse()
229 # execute every line only once
230 self.rcLines = []
231 while rcLines:
232 line = rcLines.pop().strip()
233 if line and line[0] != '#':
234 if self.onecmd(line):
235 # if onecmd returns True, the command wants to exit
236 # from the interaction, save leftover rc lines
237 # to execute before next interaction
238 self.rcLines += reversed(rcLines)
239 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000240
Tim Peters280488b2002-08-23 18:19:30 +0000241 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000242
243 def user_call(self, frame, argument_list):
244 """This method is called when there is the remote possibility
245 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000246 if self._wait_for_mainpyfile:
247 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000248 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000249 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000250 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000251
Tim Peters2344fae2001-01-15 00:50:52 +0000252 def user_line(self, frame):
253 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000254 if self._wait_for_mainpyfile:
255 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000256 or frame.f_lineno <= 0):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000257 return
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000258 self._wait_for_mainpyfile = False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000259 if self.bp_commands(frame):
260 self.interaction(frame, None)
261
Georg Brandle0230912010-07-30 08:29:39 +0000262 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000263 """Call every command that was set for the current active breakpoint
264 (if there is one).
265
266 Returns True if the normal interaction function must be called,
267 False otherwise."""
268 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
269 if getattr(self, "currentbp", False) and \
270 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000271 currentbp = self.currentbp
272 self.currentbp = 0
273 lastcmd_back = self.lastcmd
274 self.setup(frame, None)
275 for line in self.commands[currentbp]:
276 self.onecmd(line)
277 self.lastcmd = lastcmd_back
278 if not self.commands_silent[currentbp]:
279 self.print_stack_entry(self.stack[self.curindex])
280 if self.commands_doprompt[currentbp]:
Georg Brandl44f2b642010-12-04 16:00:47 +0000281 self._cmdloop()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000282 self.forget()
283 return
284 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000285
Tim Peters2344fae2001-01-15 00:50:52 +0000286 def user_return(self, frame, return_value):
287 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000288 if self._wait_for_mainpyfile:
289 return
Tim Peters2344fae2001-01-15 00:50:52 +0000290 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000291 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000292 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000293
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000294 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000295 """This function is called if an exception occurs,
296 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000297 if self._wait_for_mainpyfile:
298 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000299 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000300 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum8820c232013-11-21 11:30:06 -0800301
302 # An 'Internal StopIteration' exception is an exception debug event
303 # issued by the interpreter when handling a subgenerator run with
Martin Panter46f50722016-05-26 05:35:26 +0000304 # 'yield from' or a generator controlled by a for loop. No exception has
Berker Peksagf23530f2014-10-19 18:04:38 +0300305 # actually occurred in this case. The debugger uses this debug event to
Guido van Rossum8820c232013-11-21 11:30:06 -0800306 # stop when the debuggee is returning from such generators.
307 prefix = 'Internal ' if (not exc_traceback
308 and exc_type is StopIteration) else ''
309 self.message('%s%s' % (prefix,
310 traceback.format_exception_only(exc_type, exc_value)[-1].strip()))
Tim Peters2344fae2001-01-15 00:50:52 +0000311 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000312
Tim Peters2344fae2001-01-15 00:50:52 +0000313 # General interaction function
Georg Brandl44f2b642010-12-04 16:00:47 +0000314 def _cmdloop(self):
315 while True:
316 try:
317 # keyboard interrupts allow for an easy way to cancel
318 # the current command, so allow them during interactive input
319 self.allow_kbdint = True
320 self.cmdloop()
321 self.allow_kbdint = False
322 break
323 except KeyboardInterrupt:
324 self.message('--KeyboardInterrupt--')
Tim Peters2344fae2001-01-15 00:50:52 +0000325
Georg Brandlcbc79c72010-12-04 16:21:42 +0000326 # Called before loop, handles display expressions
327 def preloop(self):
328 displaying = self.displaying.get(self.curframe)
329 if displaying:
330 for expr, oldvalue in displaying.items():
331 newvalue = self._getval_except(expr)
332 # check for identity first; this prevents custom __eq__ to
333 # be called at every loop, and also prevents instances whose
334 # fields are changed to be displayed
335 if newvalue is not oldvalue and newvalue != oldvalue:
336 displaying[expr] = newvalue
337 self.message('display %s: %r [old: %r]' %
338 (expr, newvalue, oldvalue))
339
Tim Peters2344fae2001-01-15 00:50:52 +0000340 def interaction(self, frame, traceback):
Xavier de Gaye10e54ae2016-10-12 20:13:24 +0200341 # Restore the previous signal handler at the Pdb prompt.
342 if Pdb._previous_sigint_handler:
343 signal.signal(signal.SIGINT, Pdb._previous_sigint_handler)
344 Pdb._previous_sigint_handler = None
Georg Brandle0230912010-07-30 08:29:39 +0000345 if self.setup(frame, traceback):
346 # no interaction desired at this time (happens if .pdbrc contains
347 # a command like "continue")
348 self.forget()
349 return
Tim Peters2344fae2001-01-15 00:50:52 +0000350 self.print_stack_entry(self.stack[self.curindex])
Georg Brandl44f2b642010-12-04 16:00:47 +0000351 self._cmdloop()
Tim Peters2344fae2001-01-15 00:50:52 +0000352 self.forget()
353
Benjamin Petersond23f8222009-04-05 19:13:16 +0000354 def displayhook(self, obj):
355 """Custom displayhook for the exec in default(), which prevents
356 assignment of the _ variable in the builtins.
357 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000358 # reproduce the behavior of the standard displayhook, not printing None
359 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000360 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000361
Tim Peters2344fae2001-01-15 00:50:52 +0000362 def default(self, line):
363 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000364 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000365 globals = self.curframe.f_globals
366 try:
367 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000368 save_stdout = sys.stdout
369 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000370 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000371 try:
372 sys.stdin = self.stdin
373 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000374 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000375 exec(code, globals, locals)
376 finally:
377 sys.stdout = save_stdout
378 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000379 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000380 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000381 exc_info = sys.exc_info()[:2]
382 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000383
384 def precmd(self, line):
385 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000386 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000387 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000388 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000389 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000390 line = self.aliases[args[0]]
391 ii = 1
392 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000393 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000394 tmpArg)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000395 ii += 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000396 line = line.replace("%*", ' '.join(args[1:]))
397 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000398 # split into ';;' separated commands
399 # unless it's an alias command
400 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000401 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000402 if marker >= 0:
403 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000404 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000405 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000406 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000407 return line
408
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000409 def onecmd(self, line):
410 """Interpret the argument as though it had been typed in response
411 to the prompt.
412
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000413 Checks whether this line is typed at the normal prompt or in
414 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000415 """
416 if not self.commands_defining:
417 return cmd.Cmd.onecmd(self, line)
418 else:
419 return self.handle_command_def(line)
420
Georg Brandlb90ffd82010-07-30 22:20:16 +0000421 def handle_command_def(self, line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000422 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000423 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000424 if not cmd:
425 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000426 if cmd == 'silent':
427 self.commands_silent[self.commands_bnum] = True
428 return # continue to handle other cmd def in the cmd list
429 elif cmd == 'end':
430 self.cmdqueue = []
431 return 1 # end of cmd list
432 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000433 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000434 cmdlist.append(cmd+' '+arg)
435 else:
436 cmdlist.append(cmd)
437 # Determine if we must stop
438 try:
439 func = getattr(self, 'do_' + cmd)
440 except AttributeError:
441 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000442 # one of the resuming commands
443 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000444 self.commands_doprompt[self.commands_bnum] = False
445 self.cmdqueue = []
446 return 1
447 return
448
Georg Brandl0d089622010-07-30 16:00:46 +0000449 # interface abstraction functions
450
451 def message(self, msg):
452 print(msg, file=self.stdout)
453
454 def error(self, msg):
455 print('***', msg, file=self.stdout)
456
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100457 # Generic completion functions. Individual complete_foo methods can be
458 # assigned below to one of these functions.
459
460 def _complete_location(self, text, line, begidx, endidx):
461 # Complete a file/module/function location for break/tbreak/clear.
462 if line.strip().endswith((':', ',')):
463 # Here comes a line number or a condition which we can't complete.
464 return []
465 # First, try to find matching functions (i.e. expressions).
466 try:
467 ret = self._complete_expression(text, line, begidx, endidx)
468 except Exception:
469 ret = []
470 # Then, try to complete file names as well.
471 globs = glob.glob(text + '*')
472 for fn in globs:
473 if os.path.isdir(fn):
474 ret.append(fn + '/')
475 elif os.path.isfile(fn) and fn.lower().endswith(('.py', '.pyw')):
476 ret.append(fn + ':')
477 return ret
478
479 def _complete_bpnumber(self, text, line, begidx, endidx):
480 # Complete a breakpoint number. (This would be more helpful if we could
481 # display additional info along with the completions, such as file/line
482 # of the breakpoint.)
483 return [str(i) for i, bp in enumerate(bdb.Breakpoint.bpbynumber)
484 if bp is not None and str(i).startswith(text)]
485
486 def _complete_expression(self, text, line, begidx, endidx):
487 # Complete an arbitrary expression.
488 if not self.curframe:
489 return []
490 # Collect globals and locals. It is usually not really sensible to also
491 # complete builtins, and they clutter the namespace quite heavily, so we
492 # leave them out.
Serhiy Storchakada084702019-03-27 08:02:28 +0200493 ns = {**self.curframe.f_globals, **self.curframe_locals}
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100494 if '.' in text:
495 # Walk an attribute chain up to the last part, similar to what
496 # rlcompleter does. This will bail if any of the parts are not
497 # simple attribute access, which is what we want.
498 dotted = text.split('.')
499 try:
500 obj = ns[dotted[0]]
501 for part in dotted[1:-1]:
502 obj = getattr(obj, part)
503 except (KeyError, AttributeError):
504 return []
505 prefix = '.'.join(dotted[:-1]) + '.'
506 return [prefix + n for n in dir(obj) if n.startswith(dotted[-1])]
507 else:
508 # Complete a simple name.
509 return [n for n in ns.keys() if n.startswith(text)]
510
Tim Peters2344fae2001-01-15 00:50:52 +0000511 # Command definitions, called by cmdloop()
512 # The argument is the remaining string on the command line
513 # Return true to exit from the command loop
514
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000515 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000516 """commands [bpnumber]
517 (com) ...
518 (com) end
519 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000520
Georg Brandl0d089622010-07-30 16:00:46 +0000521 Specify a list of commands for breakpoint number bpnumber.
522 The commands themselves are entered on the following lines.
523 Type a line containing just 'end' to terminate the commands.
524 The commands are executed when the breakpoint is hit.
525
526 To remove all commands from a breakpoint, type commands and
527 follow it immediately with end; that is, give no commands.
528
529 With no bpnumber argument, commands refers to the last
530 breakpoint set.
531
532 You can use breakpoint commands to start your program up
533 again. Simply use the continue command, or step, or any other
534 command that resumes execution.
535
536 Specifying any command resuming execution (currently continue,
537 step, next, return, jump, quit and their abbreviations)
538 terminates the command list (as if that command was
539 immediately followed by end). This is because any time you
540 resume execution (even with a simple next or step), you may
541 encounter another breakpoint -- which could have its own
542 command list, leading to ambiguities about which list to
543 execute.
544
545 If you use the 'silent' command in the command list, the usual
546 message about stopping at a breakpoint is not printed. This
547 may be desirable for breakpoints that are to print a specific
548 message and then continue. If none of the other commands
549 print anything, you will see no sign that the breakpoint was
550 reached.
551 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000552 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000553 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000554 else:
555 try:
556 bnum = int(arg)
557 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000558 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000559 return
560 self.commands_bnum = bnum
Georg Brandlb90ffd82010-07-30 22:20:16 +0000561 # Save old definitions for the case of a keyboard interrupt.
562 if bnum in self.commands:
563 old_command_defs = (self.commands[bnum],
564 self.commands_doprompt[bnum],
565 self.commands_silent[bnum])
566 else:
567 old_command_defs = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000568 self.commands[bnum] = []
569 self.commands_doprompt[bnum] = True
570 self.commands_silent[bnum] = False
Georg Brandlb90ffd82010-07-30 22:20:16 +0000571
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000572 prompt_back = self.prompt
573 self.prompt = '(com) '
574 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000575 try:
576 self.cmdloop()
Georg Brandlb90ffd82010-07-30 22:20:16 +0000577 except KeyboardInterrupt:
578 # Restore old definitions.
579 if old_command_defs:
580 self.commands[bnum] = old_command_defs[0]
581 self.commands_doprompt[bnum] = old_command_defs[1]
582 self.commands_silent[bnum] = old_command_defs[2]
583 else:
584 del self.commands[bnum]
585 del self.commands_doprompt[bnum]
586 del self.commands_silent[bnum]
587 self.error('command definition aborted, old commands restored')
Georg Brandl44f8bf92010-07-30 08:54:49 +0000588 finally:
589 self.commands_defining = False
590 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000591
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100592 complete_commands = _complete_bpnumber
593
Tim Peters2344fae2001-01-15 00:50:52 +0000594 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000595 """b(reak) [ ([filename:]lineno | function) [, condition] ]
596 Without argument, list all breaks.
597
598 With a line number argument, set a break at this line in the
599 current file. With a function name, set a break at the first
600 executable line of that function. If a second argument is
601 present, it is a string specifying an expression which must
602 evaluate to true before the breakpoint is honored.
603
604 The line number may be prefixed with a filename and a colon,
605 to specify a breakpoint in another file (probably one that
606 hasn't been loaded yet). The file is searched for on
607 sys.path; the .py suffix may be omitted.
608 """
Tim Peters2344fae2001-01-15 00:50:52 +0000609 if not arg:
610 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000611 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000612 for bp in bdb.Breakpoint.bpbynumber:
613 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000614 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000615 return
616 # parse arguments; comma has lowest precedence
617 # and cannot occur in filename
618 filename = None
619 lineno = None
620 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000621 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000622 if comma > 0:
623 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000624 cond = arg[comma+1:].lstrip()
625 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000626 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000627 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000628 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000629 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000630 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000631 f = self.lookupmodule(filename)
632 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000633 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000634 return
635 else:
636 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000637 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000638 try:
639 lineno = int(arg)
Georg Brandlf93390a2010-10-14 07:17:44 +0000640 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000641 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000642 return
643 else:
644 # no colon; can be lineno or function
645 try:
646 lineno = int(arg)
647 except ValueError:
648 try:
649 func = eval(arg,
650 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000651 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000652 except:
653 func = arg
654 try:
Christian Heimesff737952007-11-27 10:40:20 +0000655 if hasattr(func, '__func__'):
656 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000657 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000658 #use co_name to identify the bkpt (function names
659 #could be aliased, but co_name is invariant)
660 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000661 lineno = code.co_firstlineno
662 filename = code.co_filename
663 except:
664 # last thing to try
665 (ok, filename, ln) = self.lineinfo(arg)
666 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000667 self.error('The specified object %r is not a function '
668 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000669 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000670 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000671 lineno = int(ln)
672 if not filename:
673 filename = self.defaultFile()
674 # Check for reasonable breakpoint
675 line = self.checkline(filename, lineno)
676 if line:
677 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000678 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000679 if err:
Berker Peksagad5ffd42014-07-12 18:24:32 +0300680 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000681 else:
682 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000683 self.message("Breakpoint %d at %s:%d" %
684 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000685
686 # To be overridden in derived debuggers
687 def defaultFile(self):
688 """Produce a reasonable default."""
689 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000690 if filename == '<string>' and self.mainpyfile:
691 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000692 return filename
693
694 do_b = do_break
695
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100696 complete_break = _complete_location
697 complete_b = _complete_location
698
Tim Peters2344fae2001-01-15 00:50:52 +0000699 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000700 """tbreak [ ([filename:]lineno | function) [, condition] ]
701 Same arguments as break, but sets a temporary breakpoint: it
702 is automatically deleted when first hit.
703 """
Tim Peters2344fae2001-01-15 00:50:52 +0000704 self.do_break(arg, 1)
705
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100706 complete_tbreak = _complete_location
707
Tim Peters2344fae2001-01-15 00:50:52 +0000708 def lineinfo(self, identifier):
709 failed = (None, None, None)
710 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000711 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000712 if len(idstring) == 1:
713 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000714 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000715 elif len(idstring) == 3:
716 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000717 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000718 else:
719 return failed
720 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000721 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000722 # Protection for derived debuggers
723 if parts[0] == 'self':
724 del parts[0]
725 if len(parts) == 0:
726 return failed
727 # Best first guess at file to look at
728 fname = self.defaultFile()
729 if len(parts) == 1:
730 item = parts[0]
731 else:
732 # More than one part.
733 # First is module, second is method/class
734 f = self.lookupmodule(parts[0])
735 if f:
736 fname = f
737 item = parts[1]
738 answer = find_function(item, fname)
739 return answer or failed
740
741 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000742 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000743
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000744 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
745 line or EOF). Warning: testing is not comprehensive.
746 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000747 # this method should be callable before starting debugging, so default
748 # to "no globals" if there is no current frame
749 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
750 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000751 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000752 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000753 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000754 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000755 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000756 if (not line or (line[0] == '#') or
757 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000758 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000759 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000760 return lineno
761
762 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000763 """enable bpnumber [bpnumber ...]
764 Enables the breakpoints given as a space separated list of
765 breakpoint numbers.
766 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000767 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000768 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000769 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000770 bp = self.get_bpbynumber(i)
771 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000772 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000773 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000774 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000775 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000776
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100777 complete_enable = _complete_bpnumber
778
Tim Peters2344fae2001-01-15 00:50:52 +0000779 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000780 """disable bpnumber [bpnumber ...]
781 Disables the breakpoints given as a space separated list of
782 breakpoint numbers. Disabling a breakpoint means it cannot
783 cause the program to stop execution, but unlike clearing a
784 breakpoint, it remains in the list of breakpoints and can be
785 (re-)enabled.
786 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000787 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000788 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000789 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000790 bp = self.get_bpbynumber(i)
791 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000792 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000793 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000794 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000795 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000796
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100797 complete_disable = _complete_bpnumber
798
Tim Peters2344fae2001-01-15 00:50:52 +0000799 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000800 """condition bpnumber [condition]
801 Set a new condition for the breakpoint, an expression which
802 must evaluate to true before the breakpoint is honored. If
803 condition is absent, any existing condition is removed; i.e.,
804 the breakpoint is made unconditional.
805 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000806 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000807 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000808 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000809 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000810 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000811 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000812 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200813 except IndexError:
814 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000815 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000816 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000817 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000818 bp.cond = cond
819 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000820 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000821 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000822 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000823
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100824 complete_condition = _complete_bpnumber
825
Georg Brandl7410dd12010-07-30 12:01:20 +0000826 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000827 """ignore bpnumber [count]
828 Set the ignore count for the given breakpoint number. If
829 count is omitted, the ignore count is set to 0. A breakpoint
830 becomes active when the ignore count is zero. When non-zero,
831 the count is decremented each time the breakpoint is reached
832 and the breakpoint is not disabled and any associated
833 condition evaluates to true.
834 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000835 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000836 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000837 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000838 except:
839 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000840 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000841 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200842 except IndexError:
843 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000844 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000845 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000846 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000847 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000848 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000849 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000850 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000851 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000852 countstr = '1 crossing'
853 self.message('Will ignore next %s of breakpoint %d.' %
854 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000855 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000856 self.message('Will stop next time breakpoint %d is reached.'
857 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000858
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100859 complete_ignore = _complete_bpnumber
860
Tim Peters2344fae2001-01-15 00:50:52 +0000861 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000862 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
863 With a space separated list of breakpoint numbers, clear
864 those breakpoints. Without argument, clear all breaks (but
865 first ask confirmation). With a filename:lineno argument,
866 clear all breaks at that line in that file.
867 """
Tim Peters2344fae2001-01-15 00:50:52 +0000868 if not arg:
869 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000870 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000871 except EOFError:
872 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000873 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000874 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000875 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000876 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000877 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000878 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000879 return
880 if ':' in arg:
881 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000882 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000883 filename = arg[:i]
884 arg = arg[i+1:]
885 try:
886 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000887 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000888 err = "Invalid line number (%s)" % arg
889 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000890 bplist = self.get_breaks(filename, lineno)
Tim Peters2344fae2001-01-15 00:50:52 +0000891 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000892 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000893 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000894 else:
895 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000896 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000897 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000898 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000899 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000900 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000901 bp = self.get_bpbynumber(i)
902 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000903 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000904 else:
Senthil Kumaran6f107042010-11-29 11:54:17 +0000905 self.clear_bpbynumber(i)
Georg Brandl0d089622010-07-30 16:00:46 +0000906 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000907 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
908
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100909 complete_clear = _complete_location
910 complete_cl = _complete_location
911
Tim Peters2344fae2001-01-15 00:50:52 +0000912 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000913 """w(here)
914 Print a stack trace, with the most recent frame at the bottom.
915 An arrow indicates the "current frame", which determines the
916 context of most commands. 'bt' is an alias for this command.
917 """
Tim Peters2344fae2001-01-15 00:50:52 +0000918 self.print_stack_trace()
919 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000920 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000921
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000922 def _select_frame(self, number):
923 assert 0 <= number < len(self.stack)
924 self.curindex = number
925 self.curframe = self.stack[self.curindex][0]
926 self.curframe_locals = self.curframe.f_locals
927 self.print_stack_entry(self.stack[self.curindex])
928 self.lineno = None
929
Tim Peters2344fae2001-01-15 00:50:52 +0000930 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000931 """u(p) [count]
932 Move the current frame count (default one) levels up in the
933 stack trace (to an older frame).
934 """
Tim Peters2344fae2001-01-15 00:50:52 +0000935 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000936 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000937 return
938 try:
939 count = int(arg or 1)
940 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000941 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000942 return
943 if count < 0:
944 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000945 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000946 newframe = max(0, self.curindex - count)
947 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000948 do_u = do_up
949
950 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000951 """d(own) [count]
952 Move the current frame count (default one) levels down in the
953 stack trace (to a newer frame).
954 """
Tim Peters2344fae2001-01-15 00:50:52 +0000955 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000956 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000957 return
958 try:
959 count = int(arg or 1)
960 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000961 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000962 return
963 if count < 0:
964 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000965 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000966 newframe = min(len(self.stack) - 1, self.curindex + count)
967 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000968 do_d = do_down
969
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000970 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000971 """unt(il) [lineno]
972 Without argument, continue execution until the line with a
973 number greater than the current one is reached. With a line
974 number, continue execution until a line with a number greater
975 or equal to that is reached. In both cases, also stop when
976 the current frame returns.
977 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000978 if arg:
979 try:
980 lineno = int(arg)
981 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000982 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000983 return
984 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000985 self.error('"until" line number is smaller than current '
986 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000987 return
988 else:
989 lineno = None
990 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000991 return 1
992 do_unt = do_until
993
Tim Peters2344fae2001-01-15 00:50:52 +0000994 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000995 """s(tep)
996 Execute the current line, stop at the first possible occasion
997 (either in a function that is called or in the current
998 function).
999 """
Tim Peters2344fae2001-01-15 00:50:52 +00001000 self.set_step()
1001 return 1
1002 do_s = do_step
1003
1004 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001005 """n(ext)
1006 Continue execution until the next line in the current function
1007 is reached or it returns.
1008 """
Tim Peters2344fae2001-01-15 00:50:52 +00001009 self.set_next(self.curframe)
1010 return 1
1011 do_n = do_next
1012
Guido van Rossumd8faa362007-04-27 19:54:29 +00001013 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001014 """run [args...]
1015 Restart the debugged python program. If a string is supplied
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001016 it is split with "shlex", and the result is used as the new
Georg Brandl0d089622010-07-30 16:00:46 +00001017 sys.argv. History, breakpoints, actions and debugger options
1018 are preserved. "restart" is an alias for "run".
1019 """
Guido van Rossumd8faa362007-04-27 19:54:29 +00001020 if arg:
1021 import shlex
1022 argv0 = sys.argv[0:1]
1023 sys.argv = shlex.split(arg)
1024 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +00001025 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +00001026 raise Restart
1027
1028 do_restart = do_run
1029
Tim Peters2344fae2001-01-15 00:50:52 +00001030 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001031 """r(eturn)
1032 Continue execution until the current function returns.
1033 """
Tim Peters2344fae2001-01-15 00:50:52 +00001034 self.set_return(self.curframe)
1035 return 1
1036 do_r = do_return
1037
1038 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001039 """c(ont(inue))
1040 Continue execution, only stop when a breakpoint is encountered.
1041 """
Georg Brandl44f2b642010-12-04 16:00:47 +00001042 if not self.nosigint:
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001043 try:
Xavier de Gaye10e54ae2016-10-12 20:13:24 +02001044 Pdb._previous_sigint_handler = \
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001045 signal.signal(signal.SIGINT, self.sigint_handler)
1046 except ValueError:
1047 # ValueError happens when do_continue() is invoked from
1048 # a non-main thread in which case we just continue without
1049 # SIGINT set. Would printing a message here (once) make
1050 # sense?
1051 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001052 self.set_continue()
1053 return 1
1054 do_c = do_cont = do_continue
1055
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001056 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001057 """j(ump) lineno
1058 Set the next line that will be executed. Only available in
1059 the bottom-most frame. This lets you jump back and execute
1060 code again, or jump forward to skip code that you don't want
1061 to run.
1062
1063 It should be noted that not all jumps are allowed -- for
1064 instance it is not possible to jump into the middle of a
1065 for loop or out of a finally clause.
1066 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001067 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +00001068 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001069 return
1070 try:
1071 arg = int(arg)
1072 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +00001073 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001074 else:
1075 try:
1076 # Do the jump, fix up our copy of the stack, and display the
1077 # new position
1078 self.curframe.f_lineno = arg
1079 self.stack[self.curindex] = self.stack[self.curindex][0], arg
1080 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +00001081 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +00001082 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001083 do_j = do_jump
1084
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001085 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001086 """debug code
1087 Enter a recursive debugger that steps through the code
1088 argument (which is an arbitrary expression or statement to be
1089 executed in the current environment).
1090 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001091 sys.settrace(None)
1092 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +00001093 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001094 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +00001095 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +00001096 self.message("ENTERING RECURSIVE DEBUGGER")
Daniel Hahler3e936432019-03-12 04:29:04 +01001097 try:
1098 sys.call_tracing(p.run, (arg, globals, locals))
1099 except Exception:
1100 exc_info = sys.exc_info()[:2]
1101 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Georg Brandl0d089622010-07-30 16:00:46 +00001102 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001103 sys.settrace(self.trace_dispatch)
1104 self.lastcmd = p.lastcmd
1105
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001106 complete_debug = _complete_expression
1107
Tim Peters2344fae2001-01-15 00:50:52 +00001108 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001109 """q(uit)\nexit
1110 Quit from the debugger. The program being executed is aborted.
1111 """
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001112 self._user_requested_quit = True
Tim Peters2344fae2001-01-15 00:50:52 +00001113 self.set_quit()
1114 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001115
Tim Peters2344fae2001-01-15 00:50:52 +00001116 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001117 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +00001118
Guido van Rossumeef26072003-01-13 21:13:55 +00001119 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001120 """EOF
1121 Handles the receipt of EOF as a command.
1122 """
1123 self.message('')
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001124 self._user_requested_quit = True
Guido van Rossumeef26072003-01-13 21:13:55 +00001125 self.set_quit()
1126 return 1
1127
Tim Peters2344fae2001-01-15 00:50:52 +00001128 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001129 """a(rgs)
1130 Print the argument list of the current function.
1131 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001132 co = self.curframe.f_code
1133 dict = self.curframe_locals
Pablo Galindocd74e662019-06-01 18:08:04 +01001134 n = co.co_argcount + co.co_kwonlyargcount
Rémi Lapeyrebf457c72019-05-21 00:17:30 +02001135 if co.co_flags & inspect.CO_VARARGS: n = n+1
1136 if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1
Tim Peters2344fae2001-01-15 00:50:52 +00001137 for i in range(n):
1138 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +00001139 if name in dict:
1140 self.message('%s = %r' % (name, dict[name]))
1141 else:
1142 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +00001143 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +00001144
Tim Peters2344fae2001-01-15 00:50:52 +00001145 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001146 """retval
1147 Print the return value for the last return of a function.
1148 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001149 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +00001150 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +00001151 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001152 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +00001153 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +00001154
Barry Warsaw210bd202002-11-05 22:40:20 +00001155 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +00001156 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +00001157 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +00001158 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001159 exc_info = sys.exc_info()[:2]
1160 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Barry Warsaw210bd202002-11-05 22:40:20 +00001161 raise
Guido van Rossum2424f851998-09-11 22:50:09 +00001162
Georg Brandlcbc79c72010-12-04 16:21:42 +00001163 def _getval_except(self, arg, frame=None):
1164 try:
1165 if frame is None:
1166 return eval(arg, self.curframe.f_globals, self.curframe_locals)
1167 else:
1168 return eval(arg, frame.f_globals, frame.f_locals)
1169 except:
1170 exc_info = sys.exc_info()[:2]
1171 err = traceback.format_exception_only(*exc_info)[-1].strip()
1172 return _rstr('** raised %s **' % err)
1173
Barry Warsaw210bd202002-11-05 22:40:20 +00001174 def do_p(self, arg):
R David Murray78d692f2013-10-10 17:23:26 -04001175 """p expression
Georg Brandl0d089622010-07-30 16:00:46 +00001176 Print the value of the expression.
1177 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001178 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001179 self.message(repr(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001180 except:
1181 pass
1182
1183 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001184 """pp expression
1185 Pretty-print the value of the expression.
1186 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001187 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001188 self.message(pprint.pformat(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001189 except:
1190 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001191
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001192 complete_print = _complete_expression
1193 complete_p = _complete_expression
1194 complete_pp = _complete_expression
1195
Tim Peters2344fae2001-01-15 00:50:52 +00001196 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001197 """l(ist) [first [,last] | .]
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001198
1199 List source code for the current file. Without arguments,
1200 list 11 lines around the current line or continue the previous
1201 listing. With . as argument, list 11 lines around the current
1202 line. With one argument, list 11 lines starting at that line.
1203 With two arguments, list the given range; if the second
1204 argument is less than the first, it is a count.
1205
1206 The current line in the current frame is indicated by "->".
1207 If an exception is being debugged, the line where the
1208 exception was originally raised or propagated is indicated by
1209 ">>", if it differs from the current line.
Georg Brandl0d089622010-07-30 16:00:46 +00001210 """
Tim Peters2344fae2001-01-15 00:50:52 +00001211 self.lastcmd = 'list'
1212 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001213 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001214 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001215 if ',' in arg:
1216 first, last = arg.split(',')
1217 first = int(first.strip())
1218 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001219 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001220 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001221 last = first + last
1222 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001223 first = int(arg.strip())
1224 first = max(1, first - 5)
1225 except ValueError:
1226 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001227 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001228 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001229 first = max(1, self.curframe.f_lineno - 5)
1230 else:
1231 first = self.lineno + 1
1232 if last is None:
1233 last = first + 10
1234 filename = self.curframe.f_code.co_filename
1235 breaklist = self.get_file_breaks(filename)
1236 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001237 lines = linecache.getlines(filename, self.curframe.f_globals)
1238 self._print_lines(lines[first-1:last], first, breaklist,
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001239 self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001240 self.lineno = min(last, len(lines))
1241 if len(lines) < last:
1242 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001243 except KeyboardInterrupt:
1244 pass
1245 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001246
Georg Brandle59ca2a2010-07-30 17:04:28 +00001247 def do_longlist(self, arg):
1248 """longlist | ll
1249 List the whole source code for the current function or frame.
1250 """
1251 filename = self.curframe.f_code.co_filename
1252 breaklist = self.get_file_breaks(filename)
1253 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001254 lines, lineno = getsourcelines(self.curframe)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001255 except OSError as err:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001256 self.error(err)
1257 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001258 self._print_lines(lines, lineno, breaklist, self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001259 do_ll = do_longlist
1260
1261 def do_source(self, arg):
1262 """source expression
1263 Try to get source code for the given object and display it.
1264 """
1265 try:
1266 obj = self._getval(arg)
1267 except:
1268 return
1269 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001270 lines, lineno = getsourcelines(obj)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001271 except (OSError, TypeError) as err:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001272 self.error(err)
1273 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001274 self._print_lines(lines, lineno)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001275
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001276 complete_source = _complete_expression
1277
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001278 def _print_lines(self, lines, start, breaks=(), frame=None):
Georg Brandle59ca2a2010-07-30 17:04:28 +00001279 """Print a range of lines."""
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001280 if frame:
1281 current_lineno = frame.f_lineno
1282 exc_lineno = self.tb_lineno.get(frame, -1)
1283 else:
1284 current_lineno = exc_lineno = -1
Georg Brandle59ca2a2010-07-30 17:04:28 +00001285 for lineno, line in enumerate(lines, start):
1286 s = str(lineno).rjust(3)
1287 if len(s) < 4:
1288 s += ' '
1289 if lineno in breaks:
1290 s += 'B'
1291 else:
1292 s += ' '
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001293 if lineno == current_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001294 s += '->'
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001295 elif lineno == exc_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001296 s += '>>'
1297 self.message(s + '\t' + line.rstrip())
1298
Tim Peters2344fae2001-01-15 00:50:52 +00001299 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001300 """whatis arg
1301 Print the type of the argument.
1302 """
Tim Peters2344fae2001-01-15 00:50:52 +00001303 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001304 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001305 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001306 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001307 return
1308 code = None
1309 # Is it a function?
Georg Brandl0d089622010-07-30 16:00:46 +00001310 try:
1311 code = value.__code__
1312 except Exception:
1313 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001314 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001315 self.message('Function %s' % code.co_name)
Tim Peters2344fae2001-01-15 00:50:52 +00001316 return
1317 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001318 try:
1319 code = value.__func__.__code__
1320 except Exception:
1321 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001322 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001323 self.message('Method %s' % code.co_name)
1324 return
1325 # Is it a class?
1326 if value.__class__ is type:
Serhiy Storchaka521e5862014-07-22 15:00:37 +03001327 self.message('Class %s.%s' % (value.__module__, value.__qualname__))
Tim Peters2344fae2001-01-15 00:50:52 +00001328 return
1329 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001330 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001331
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001332 complete_whatis = _complete_expression
1333
Georg Brandlcbc79c72010-12-04 16:21:42 +00001334 def do_display(self, arg):
1335 """display [expression]
1336
1337 Display the value of the expression if it changed, each time execution
1338 stops in the current frame.
1339
1340 Without expression, list all display expressions for the current frame.
1341 """
1342 if not arg:
1343 self.message('Currently displaying:')
1344 for item in self.displaying.get(self.curframe, {}).items():
1345 self.message('%s: %r' % item)
1346 else:
1347 val = self._getval_except(arg)
1348 self.displaying.setdefault(self.curframe, {})[arg] = val
1349 self.message('display %s: %r' % (arg, val))
1350
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001351 complete_display = _complete_expression
1352
Georg Brandlcbc79c72010-12-04 16:21:42 +00001353 def do_undisplay(self, arg):
1354 """undisplay [expression]
1355
1356 Do not display the expression any more in the current frame.
1357
1358 Without expression, clear all display expressions for the current frame.
1359 """
1360 if arg:
1361 try:
1362 del self.displaying.get(self.curframe, {})[arg]
1363 except KeyError:
1364 self.error('not displaying %s' % arg)
1365 else:
1366 self.displaying.pop(self.curframe, None)
1367
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001368 def complete_undisplay(self, text, line, begidx, endidx):
1369 return [e for e in self.displaying.get(self.curframe, {})
1370 if e.startswith(text)]
1371
Georg Brandl1acb7462010-12-04 11:20:26 +00001372 def do_interact(self, arg):
1373 """interact
1374
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001375 Start an interactive interpreter whose global namespace
Georg Brandl1acb7462010-12-04 11:20:26 +00001376 contains all the (global and local) names found in the current scope.
1377 """
Serhiy Storchakada084702019-03-27 08:02:28 +02001378 ns = {**self.curframe.f_globals, **self.curframe_locals}
Georg Brandl1acb7462010-12-04 11:20:26 +00001379 code.interact("*interactive*", local=ns)
1380
Tim Peters2344fae2001-01-15 00:50:52 +00001381 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001382 """alias [name [command [parameter parameter ...] ]]
1383 Create an alias called 'name' that executes 'command'. The
1384 command must *not* be enclosed in quotes. Replaceable
1385 parameters can be indicated by %1, %2, and so on, while %* is
1386 replaced by all the parameters. If no command is given, the
1387 current alias for name is shown. If no name is given, all
1388 aliases are listed.
1389
1390 Aliases may be nested and can contain anything that can be
1391 legally typed at the pdb prompt. Note! You *can* override
1392 internal pdb commands with aliases! Those internal commands
1393 are then hidden until the alias is removed. Aliasing is
1394 recursively applied to the first word of the command line; all
1395 other words in the line are left alone.
1396
1397 As an example, here are two useful aliases (especially when
1398 placed in the .pdbrc file):
1399
1400 # Print instance variables (usage "pi classInst")
R David Murray78d692f2013-10-10 17:23:26 -04001401 alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
Georg Brandl0d089622010-07-30 16:00:46 +00001402 # Print instance variables in self
1403 alias ps pi self
1404 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001405 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001406 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001407 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001408 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001409 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001410 return
Guido van Rossum08454592002-07-12 13:10:53 +00001411 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001412 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001413 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001414 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001415
Tim Peters2344fae2001-01-15 00:50:52 +00001416 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001417 """unalias name
1418 Delete the specified alias.
1419 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001420 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001421 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001422 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001423 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001424
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001425 def complete_unalias(self, text, line, begidx, endidx):
1426 return [a for a in self.aliases if a.startswith(text)]
1427
Georg Brandl0d089622010-07-30 16:00:46 +00001428 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001429 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1430 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001431
Tim Peters2344fae2001-01-15 00:50:52 +00001432 # Print a traceback starting at the top stack frame.
1433 # The most recently entered frame is printed last;
1434 # this is different from dbx and gdb, but consistent with
1435 # the Python interpreter's stack trace.
1436 # It is also consistent with the up/down commands (which are
1437 # compatible with dbx and gdb: up moves towards 'main()'
1438 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001439
Tim Peters2344fae2001-01-15 00:50:52 +00001440 def print_stack_trace(self):
1441 try:
1442 for frame_lineno in self.stack:
1443 self.print_stack_entry(frame_lineno)
1444 except KeyboardInterrupt:
1445 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001446
Tim Peters2344fae2001-01-15 00:50:52 +00001447 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1448 frame, lineno = frame_lineno
1449 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001450 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001451 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001452 prefix = ' '
1453 self.message(prefix +
1454 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001455
Georg Brandl0d089622010-07-30 16:00:46 +00001456 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001457
Georg Brandl0d089622010-07-30 16:00:46 +00001458 def do_help(self, arg):
1459 """h(elp)
1460 Without argument, print the list of available commands.
1461 With a command name as argument, print help about that command.
1462 "help pdb" shows the full pdb documentation.
1463 "help exec" gives help on the ! command.
1464 """
1465 if not arg:
1466 return cmd.Cmd.do_help(self, arg)
1467 try:
1468 try:
1469 topic = getattr(self, 'help_' + arg)
1470 return topic()
1471 except AttributeError:
1472 command = getattr(self, 'do_' + arg)
1473 except AttributeError:
1474 self.error('No help for %r' % arg)
1475 else:
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001476 if sys.flags.optimize >= 2:
1477 self.error('No help for %r; please do not run Python with -OO '
1478 'if you need command help' % arg)
1479 return
Georg Brandl0d089622010-07-30 16:00:46 +00001480 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001481
Georg Brandl0d089622010-07-30 16:00:46 +00001482 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001483
Tim Peters2344fae2001-01-15 00:50:52 +00001484 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001485 """(!) statement
1486 Execute the (one-line) statement in the context of the current
1487 stack frame. The exclamation point can be omitted unless the
1488 first word of the statement resembles a debugger command. To
1489 assign to a global variable you must always prefix the command
1490 with a 'global' command, e.g.:
1491 (Pdb) global list_options; list_options = ['-l']
1492 (Pdb)
1493 """
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001494 self.message((self.help_exec.__doc__ or '').strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001495
Tim Peters2344fae2001-01-15 00:50:52 +00001496 def help_pdb(self):
1497 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001498
Georg Brandl0d089622010-07-30 16:00:46 +00001499 # other helper functions
1500
Tim Peters2344fae2001-01-15 00:50:52 +00001501 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001502 """Helper function for break/clear parsing -- may be overridden.
1503
1504 lookupmodule() translates (possibly incomplete) file or module name
1505 into an absolute file name.
1506 """
1507 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001508 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001509 f = os.path.join(sys.path[0], filename)
1510 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1511 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001512 root, ext = os.path.splitext(filename)
1513 if ext == '':
1514 filename = filename + '.py'
1515 if os.path.isabs(filename):
1516 return filename
1517 for dirname in sys.path:
1518 while os.path.islink(dirname):
1519 dirname = os.readlink(dirname)
1520 fullname = os.path.join(dirname, filename)
1521 if os.path.exists(fullname):
1522 return fullname
1523 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001524
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001525 def _runmodule(self, module_name):
1526 self._wait_for_mainpyfile = True
1527 self._user_requested_quit = False
1528 import runpy
1529 mod_name, mod_spec, code = runpy._get_module_details(module_name)
1530 self.mainpyfile = self.canonic(code.co_filename)
1531 import __main__
1532 __main__.__dict__.clear()
1533 __main__.__dict__.update({
1534 "__name__": "__main__",
1535 "__file__": self.mainpyfile,
Mario Corchero38bfa842018-02-03 06:40:11 +00001536 "__package__": mod_spec.parent,
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001537 "__loader__": mod_spec.loader,
1538 "__spec__": mod_spec,
1539 "__builtins__": __builtins__,
1540 })
1541 self.run(code)
1542
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001543 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001544 # The script has to run in __main__ namespace (or imports from
1545 # __main__ will break).
1546 #
1547 # So we clear up the __main__ and set several special variables
1548 # (this gets rid of pdb's globals and cleans old variables on restarts).
1549 import __main__
1550 __main__.__dict__.clear()
1551 __main__.__dict__.update({"__name__" : "__main__",
1552 "__file__" : filename,
1553 "__builtins__": __builtins__,
1554 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001555
1556 # When bdb sets tracing, a number of call and line events happens
1557 # BEFORE debugger even reaches user's code (and the exact sequence of
1558 # events depends on python version). So we take special measures to
1559 # avoid stopping before we reach the main script (see user_line and
1560 # user_call for details).
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001561 self._wait_for_mainpyfile = True
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001562 self.mainpyfile = self.canonic(filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001563 self._user_requested_quit = False
Georg Brandld07ac642009-08-13 07:50:57 +00001564 with open(filename, "rb") as fp:
1565 statement = "exec(compile(%r, %r, 'exec'))" % \
1566 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001567 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001568
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001569# Collect all command help into docstring, if not run with -OO
Georg Brandl0d089622010-07-30 16:00:46 +00001570
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001571if __doc__ is not None:
1572 # unfortunately we can't guess this order from the class definition
1573 _help_order = [
1574 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1575 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
1576 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
R David Murray78d692f2013-10-10 17:23:26 -04001577 'args', 'p', 'pp', 'whatis', 'source', 'display', 'undisplay',
Georg Brandlcbc79c72010-12-04 16:21:42 +00001578 'interact', 'alias', 'unalias', 'debug', 'quit',
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001579 ]
Georg Brandl0d089622010-07-30 16:00:46 +00001580
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001581 for _command in _help_order:
1582 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1583 __doc__ += Pdb.help_exec.__doc__
Georg Brandl0d089622010-07-30 16:00:46 +00001584
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001585 del _help_order, _command
1586
Georg Brandl0d089622010-07-30 16:00:46 +00001587
Guido van Rossum35771131992-09-08 11:59:04 +00001588# Simplified interface
1589
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001590def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001591 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001592
1593def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001594 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001595
1596def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001597 # B/W compatibility
1598 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001599
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001600def runcall(*args, **kwds):
1601 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001602
Barry Warsaw35425d62017-09-22 12:29:42 -04001603def set_trace(*, header=None):
1604 pdb = Pdb()
1605 if header is not None:
1606 pdb.message(header)
1607 pdb.set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001608
1609# Post-Mortem interface
1610
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001611def post_mortem(t=None):
1612 # handling the default
1613 if t is None:
1614 # sys.exc_info() returns (type, value, traceback) if an exception is
1615 # being handled, otherwise it returns None
1616 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001617 if t is None:
1618 raise ValueError("A valid traceback must be passed if no "
1619 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001620
Tim Peters2344fae2001-01-15 00:50:52 +00001621 p = Pdb()
1622 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001623 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001624
1625def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001626 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001627
1628
1629# Main program for testing
1630
Guido van Rossum23efba41992-01-27 16:58:47 +00001631TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001632
Guido van Rossum921c8241992-01-10 14:54:42 +00001633def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001634 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001635
1636# print help
1637def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001638 import pydoc
1639 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001640
Georg Brandle0230912010-07-30 08:29:39 +00001641_usage = """\
Mario Corcherofcf8b4c2018-01-28 04:58:47 +00001642usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ...
Georg Brandle0230912010-07-30 08:29:39 +00001643
Mario Corcherofcf8b4c2018-01-28 04:58:47 +00001644Debug the Python program given by pyfile. Alternatively,
1645an executable module or package to debug can be specified using
1646the -m switch.
Georg Brandle0230912010-07-30 08:29:39 +00001647
1648Initial commands are read from .pdbrc files in your home directory
1649and in the current directory, if they exist. Commands supplied with
1650-c are executed after commands from .pdbrc files.
1651
1652To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001653To let the script run up to a given line X in the debugged file, use
1654"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001655
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001656def main():
Georg Brandle0230912010-07-30 08:29:39 +00001657 import getopt
1658
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001659 opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['--help', '--command='])
Georg Brandle0230912010-07-30 08:29:39 +00001660
1661 if not args:
1662 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001663 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001664
Georg Brandle0230912010-07-30 08:29:39 +00001665 commands = []
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001666 run_as_module = False
Georg Brandle0230912010-07-30 08:29:39 +00001667 for opt, optarg in opts:
1668 if opt in ['-h', '--help']:
1669 print(_usage)
1670 sys.exit()
1671 elif opt in ['-c', '--command']:
1672 commands.append(optarg)
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001673 elif opt in ['-m']:
1674 run_as_module = True
Georg Brandle0230912010-07-30 08:29:39 +00001675
1676 mainpyfile = args[0] # Get script filename
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001677 if not run_as_module and not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001678 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001679 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001680
Georg Brandle0230912010-07-30 08:29:39 +00001681 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001682
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001683 # Replace pdb's dir with script's dir in front of module search path.
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001684 if not run_as_module:
1685 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001686
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001687 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1688 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001689 # changed by the user from the command line. There is a "restart" command
1690 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001691 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001692 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001693 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001694 try:
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001695 if run_as_module:
1696 pdb._runmodule(mainpyfile)
1697 else:
1698 pdb._runscript(mainpyfile)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001699 if pdb._user_requested_quit:
1700 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001701 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001702 except Restart:
1703 print("Restarting", mainpyfile, "with arguments:")
Georg Brandle0230912010-07-30 08:29:39 +00001704 print("\t" + " ".join(args))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001705 except SystemExit:
1706 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001707 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001708 print(sys.exc_info()[1])
Terry Jan Reedyca3f4352015-09-05 19:13:26 -04001709 except SyntaxError:
1710 traceback.print_exc()
1711 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001712 except:
1713 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001714 print("Uncaught exception. Entering post mortem debugging")
1715 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001716 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001717 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001718 print("Post mortem debugger finished. The " + mainpyfile +
1719 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001720
1721
1722# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001723if __name__ == '__main__':
1724 import pdb
1725 pdb.main()