blob: 943211158ac41e417496bdccbbcfb8a113504ae0 [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
jsnkllnd5938812019-11-12 17:42:47 -050071import io
Georg Brandl44f2b642010-12-04 16:00:47 +000072import re
Guido van Rossum921c8241992-01-10 14:54:42 +000073import sys
Guido van Rossum23efba41992-01-27 16:58:47 +000074import cmd
75import bdb
Georg Brandl0a9c3e92010-07-30 18:46:38 +000076import dis
Georg Brandl1acb7462010-12-04 11:20:26 +000077import code
Georg Brandl4c7c3c52012-03-10 22:36:48 +010078import glob
Barry Warsaw210bd202002-11-05 22:40:20 +000079import pprint
Georg Brandl44f2b642010-12-04 16:00:47 +000080import signal
Georg Brandle59ca2a2010-07-30 17:04:28 +000081import inspect
Serhiy Storchaka19fcffa2020-06-21 11:07:50 +030082import tokenize
Georg Brandl1acb7462010-12-04 11:20:26 +000083import traceback
84import linecache
Guido van Rossumd8faa362007-04-27 19:54:29 +000085
86
87class Restart(Exception):
88 """Causes a debugger to be restarted for the debugged python program."""
89 pass
90
Skip Montanaro352674d2001-02-07 23:14:30 +000091__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
92 "post_mortem", "help"]
93
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000094def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000095 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000096 try:
Serhiy Storchaka19fcffa2020-06-21 11:07:50 +030097 fp = tokenize.open(filename)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020098 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +000099 return None
100 # consumer of this info expects the first line to be 1
Georg Brandl6e220552013-10-13 20:51:47 +0200101 with fp:
102 for lineno, line in enumerate(fp, start=1):
103 if cre.match(line):
104 return funcname, filename, lineno
105 return None
Guido van Rossum921c8241992-01-10 14:54:42 +0000106
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000107def getsourcelines(obj):
108 lines, lineno = inspect.findsource(obj)
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000109 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000110 # must be a module frame: do not try to cut a block out of it
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000111 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000112 elif inspect.ismodule(obj):
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000113 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000114 return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum921c8241992-01-10 14:54:42 +0000115
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000116def lasti2lineno(code, lasti):
117 linestarts = list(dis.findlinestarts(code))
118 linestarts.reverse()
119 for i, lineno in linestarts:
120 if lasti >= i:
121 return lineno
122 return 0
123
124
Georg Brandlcbc79c72010-12-04 16:21:42 +0000125class _rstr(str):
126 """String that doesn't quote its repr."""
127 def __repr__(self):
128 return self
129
130
Guido van Rossuma558e371994-11-10 22:27:35 +0000131# Interaction prompt line will separate file and call info from code
132# text using value of line_prefix string. A newline and arrow may
133# be to your liking. You can set it once pdb is imported using the
134# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +0000135# line_prefix = ': ' # Use this to get the old situation back
136line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +0000137
Guido van Rossum23efba41992-01-27 16:58:47 +0000138class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +0000139
Xavier de Gaye10e54ae2016-10-12 20:13:24 +0200140 _previous_sigint_handler = None
141
Georg Brandl44f2b642010-12-04 16:00:47 +0000142 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700143 nosigint=False, readrc=True):
Georg Brandl243ad662009-05-05 09:00:19 +0000144 bdb.Bdb.__init__(self, skip=skip)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000145 cmd.Cmd.__init__(self, completekey, stdin, stdout)
Steve Dower60419a72019-06-24 08:42:54 -0700146 sys.audit("pdb.Pdb")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000147 if stdout:
148 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000149 self.prompt = '(Pdb) '
150 self.aliases = {}
Georg Brandlcbc79c72010-12-04 16:21:42 +0000151 self.displaying = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000152 self.mainpyfile = ''
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000153 self._wait_for_mainpyfile = False
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000154 self.tb_lineno = {}
Tim Peters2344fae2001-01-15 00:50:52 +0000155 # Try to load readline if it exists
156 try:
157 import readline
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100158 # remove some common file name delimiters
159 readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
Brett Cannoncd171c82013-07-04 17:43:24 -0400160 except ImportError:
Tim Peters2344fae2001-01-15 00:50:52 +0000161 pass
Georg Brandl44f2b642010-12-04 16:00:47 +0000162 self.allow_kbdint = False
163 self.nosigint = nosigint
Guido van Rossum2424f851998-09-11 22:50:09 +0000164
Timothy Hopper7ea9a852019-08-02 18:20:14 -0400165 # Read ~/.pdbrc and ./.pdbrc
Tim Peters2344fae2001-01-15 00:50:52 +0000166 self.rcLines = []
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700167 if readrc:
Timothy Hopper7ea9a852019-08-02 18:20:14 -0400168 try:
169 with open(os.path.expanduser('~/.pdbrc')) as rcFile:
170 self.rcLines.extend(rcFile)
171 except OSError:
172 pass
Tim Peters2344fae2001-01-15 00:50:52 +0000173 try:
Ɓukasz Langa2eb6eca2016-09-09 22:21:17 -0700174 with open(".pdbrc") as rcFile:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000175 self.rcLines.extend(rcFile)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200176 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +0000177 pass
Guido van Rossum23efba41992-01-27 16:58:47 +0000178
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000179 self.commands = {} # associates a command list to breakpoint numbers
Benjamin Petersond23f8222009-04-05 19:13:16 +0000180 self.commands_doprompt = {} # for each bp num, tells if the prompt
181 # must be disp. after execing the cmd list
182 self.commands_silent = {} # for each bp num, tells if the stack trace
183 # must be disp. after execing the cmd list
184 self.commands_defining = False # True while in the process of defining
185 # a command list
186 self.commands_bnum = None # The breakpoint number for which we are
187 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000188
Georg Brandl44f2b642010-12-04 16:00:47 +0000189 def sigint_handler(self, signum, frame):
190 if self.allow_kbdint:
191 raise KeyboardInterrupt
192 self.message("\nProgram interrupted. (Use 'cont' to resume).")
193 self.set_step()
194 self.set_trace(frame)
Georg Brandl44f2b642010-12-04 16:00:47 +0000195
Tim Peters2344fae2001-01-15 00:50:52 +0000196 def reset(self):
197 bdb.Bdb.reset(self)
198 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000199
Tim Peters2344fae2001-01-15 00:50:52 +0000200 def forget(self):
201 self.lineno = None
202 self.stack = []
203 self.curindex = 0
204 self.curframe = None
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000205 self.tb_lineno.clear()
Guido van Rossum2424f851998-09-11 22:50:09 +0000206
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000207 def setup(self, f, tb):
Tim Peters2344fae2001-01-15 00:50:52 +0000208 self.forget()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000209 self.stack, self.curindex = self.get_stack(f, tb)
210 while tb:
211 # when setting up post-mortem debugging with a traceback, save all
212 # the original line numbers to be displayed along the current line
213 # numbers (which can be different, e.g. due to finally clauses)
214 lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
215 self.tb_lineno[tb.tb_frame] = lineno
216 tb = tb.tb_next
Tim Peters2344fae2001-01-15 00:50:52 +0000217 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000218 # The f_locals dictionary is updated from the actual frame
219 # locals whenever the .f_locals accessor is called, so we
220 # cache it here to ensure that modifications are not overwritten.
221 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000222 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223
Tim Peters2344fae2001-01-15 00:50:52 +0000224 # Can be executed earlier than 'setup' if desired
225 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000226 if not self.rcLines:
227 return
228 # local copy because of recursion
229 rcLines = self.rcLines
230 rcLines.reverse()
231 # execute every line only once
232 self.rcLines = []
233 while rcLines:
234 line = rcLines.pop().strip()
235 if line and line[0] != '#':
236 if self.onecmd(line):
237 # if onecmd returns True, the command wants to exit
238 # from the interaction, save leftover rc lines
239 # to execute before next interaction
240 self.rcLines += reversed(rcLines)
241 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000242
Tim Peters280488b2002-08-23 18:19:30 +0000243 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000244
245 def user_call(self, frame, argument_list):
246 """This method is called when there is the remote possibility
247 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000248 if self._wait_for_mainpyfile:
249 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000250 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000251 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000252 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000253
Tim Peters2344fae2001-01-15 00:50:52 +0000254 def user_line(self, frame):
255 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000256 if self._wait_for_mainpyfile:
257 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000258 or frame.f_lineno <= 0):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000259 return
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000260 self._wait_for_mainpyfile = False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000261 if self.bp_commands(frame):
262 self.interaction(frame, None)
263
Georg Brandle0230912010-07-30 08:29:39 +0000264 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000265 """Call every command that was set for the current active breakpoint
266 (if there is one).
267
268 Returns True if the normal interaction function must be called,
269 False otherwise."""
270 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
271 if getattr(self, "currentbp", False) and \
272 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000273 currentbp = self.currentbp
274 self.currentbp = 0
275 lastcmd_back = self.lastcmd
276 self.setup(frame, None)
277 for line in self.commands[currentbp]:
278 self.onecmd(line)
279 self.lastcmd = lastcmd_back
280 if not self.commands_silent[currentbp]:
281 self.print_stack_entry(self.stack[self.curindex])
282 if self.commands_doprompt[currentbp]:
Georg Brandl44f2b642010-12-04 16:00:47 +0000283 self._cmdloop()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000284 self.forget()
285 return
286 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000287
Tim Peters2344fae2001-01-15 00:50:52 +0000288 def user_return(self, frame, return_value):
289 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000290 if self._wait_for_mainpyfile:
291 return
Tim Peters2344fae2001-01-15 00:50:52 +0000292 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000293 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000294 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000295
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000296 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000297 """This function is called if an exception occurs,
298 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000299 if self._wait_for_mainpyfile:
300 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000301 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000302 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum8820c232013-11-21 11:30:06 -0800303
304 # An 'Internal StopIteration' exception is an exception debug event
305 # issued by the interpreter when handling a subgenerator run with
Martin Panter46f50722016-05-26 05:35:26 +0000306 # 'yield from' or a generator controlled by a for loop. No exception has
Berker Peksagf23530f2014-10-19 18:04:38 +0300307 # actually occurred in this case. The debugger uses this debug event to
Guido van Rossum8820c232013-11-21 11:30:06 -0800308 # stop when the debuggee is returning from such generators.
309 prefix = 'Internal ' if (not exc_traceback
310 and exc_type is StopIteration) else ''
311 self.message('%s%s' % (prefix,
312 traceback.format_exception_only(exc_type, exc_value)[-1].strip()))
Tim Peters2344fae2001-01-15 00:50:52 +0000313 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000314
Tim Peters2344fae2001-01-15 00:50:52 +0000315 # General interaction function
Georg Brandl44f2b642010-12-04 16:00:47 +0000316 def _cmdloop(self):
317 while True:
318 try:
319 # keyboard interrupts allow for an easy way to cancel
320 # the current command, so allow them during interactive input
321 self.allow_kbdint = True
322 self.cmdloop()
323 self.allow_kbdint = False
324 break
325 except KeyboardInterrupt:
326 self.message('--KeyboardInterrupt--')
Tim Peters2344fae2001-01-15 00:50:52 +0000327
Georg Brandlcbc79c72010-12-04 16:21:42 +0000328 # Called before loop, handles display expressions
329 def preloop(self):
330 displaying = self.displaying.get(self.curframe)
331 if displaying:
332 for expr, oldvalue in displaying.items():
333 newvalue = self._getval_except(expr)
334 # check for identity first; this prevents custom __eq__ to
335 # be called at every loop, and also prevents instances whose
336 # fields are changed to be displayed
337 if newvalue is not oldvalue and newvalue != oldvalue:
338 displaying[expr] = newvalue
339 self.message('display %s: %r [old: %r]' %
340 (expr, newvalue, oldvalue))
341
Tim Peters2344fae2001-01-15 00:50:52 +0000342 def interaction(self, frame, traceback):
Xavier de Gaye10e54ae2016-10-12 20:13:24 +0200343 # Restore the previous signal handler at the Pdb prompt.
344 if Pdb._previous_sigint_handler:
Daniel Hahler8d64bfa2019-09-09 12:45:58 +0200345 try:
346 signal.signal(signal.SIGINT, Pdb._previous_sigint_handler)
347 except ValueError: # ValueError: signal only works in main thread
348 pass
349 else:
350 Pdb._previous_sigint_handler = None
Georg Brandle0230912010-07-30 08:29:39 +0000351 if self.setup(frame, traceback):
352 # no interaction desired at this time (happens if .pdbrc contains
353 # a command like "continue")
354 self.forget()
355 return
Tim Peters2344fae2001-01-15 00:50:52 +0000356 self.print_stack_entry(self.stack[self.curindex])
Georg Brandl44f2b642010-12-04 16:00:47 +0000357 self._cmdloop()
Tim Peters2344fae2001-01-15 00:50:52 +0000358 self.forget()
359
Benjamin Petersond23f8222009-04-05 19:13:16 +0000360 def displayhook(self, obj):
361 """Custom displayhook for the exec in default(), which prevents
362 assignment of the _ variable in the builtins.
363 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000364 # reproduce the behavior of the standard displayhook, not printing None
365 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000366 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000367
Tim Peters2344fae2001-01-15 00:50:52 +0000368 def default(self, line):
369 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000370 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000371 globals = self.curframe.f_globals
372 try:
373 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000374 save_stdout = sys.stdout
375 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000376 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000377 try:
378 sys.stdin = self.stdin
379 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000380 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000381 exec(code, globals, locals)
382 finally:
383 sys.stdout = save_stdout
384 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000385 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000386 except:
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -0700387 self._error_exc()
Tim Peters2344fae2001-01-15 00:50:52 +0000388
389 def precmd(self, line):
390 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000391 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000392 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000393 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000394 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000395 line = self.aliases[args[0]]
396 ii = 1
397 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000398 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000399 tmpArg)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000400 ii += 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000401 line = line.replace("%*", ' '.join(args[1:]))
402 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000403 # split into ';;' separated commands
404 # unless it's an alias command
405 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000406 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000407 if marker >= 0:
408 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000409 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000410 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000411 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000412 return line
413
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000414 def onecmd(self, line):
415 """Interpret the argument as though it had been typed in response
416 to the prompt.
417
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000418 Checks whether this line is typed at the normal prompt or in
419 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000420 """
421 if not self.commands_defining:
422 return cmd.Cmd.onecmd(self, line)
423 else:
424 return self.handle_command_def(line)
425
Georg Brandlb90ffd82010-07-30 22:20:16 +0000426 def handle_command_def(self, line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000427 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000428 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000429 if not cmd:
430 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000431 if cmd == 'silent':
432 self.commands_silent[self.commands_bnum] = True
433 return # continue to handle other cmd def in the cmd list
434 elif cmd == 'end':
435 self.cmdqueue = []
436 return 1 # end of cmd list
437 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000438 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000439 cmdlist.append(cmd+' '+arg)
440 else:
441 cmdlist.append(cmd)
442 # Determine if we must stop
443 try:
444 func = getattr(self, 'do_' + cmd)
445 except AttributeError:
446 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000447 # one of the resuming commands
448 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000449 self.commands_doprompt[self.commands_bnum] = False
450 self.cmdqueue = []
451 return 1
452 return
453
Georg Brandl0d089622010-07-30 16:00:46 +0000454 # interface abstraction functions
455
456 def message(self, msg):
457 print(msg, file=self.stdout)
458
459 def error(self, msg):
460 print('***', msg, file=self.stdout)
461
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100462 # Generic completion functions. Individual complete_foo methods can be
463 # assigned below to one of these functions.
464
465 def _complete_location(self, text, line, begidx, endidx):
466 # Complete a file/module/function location for break/tbreak/clear.
467 if line.strip().endswith((':', ',')):
468 # Here comes a line number or a condition which we can't complete.
469 return []
470 # First, try to find matching functions (i.e. expressions).
471 try:
472 ret = self._complete_expression(text, line, begidx, endidx)
473 except Exception:
474 ret = []
475 # Then, try to complete file names as well.
Serhiy Storchaka93558682020-06-20 11:10:31 +0300476 globs = glob.glob(glob.escape(text) + '*')
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100477 for fn in globs:
478 if os.path.isdir(fn):
479 ret.append(fn + '/')
480 elif os.path.isfile(fn) and fn.lower().endswith(('.py', '.pyw')):
481 ret.append(fn + ':')
482 return ret
483
484 def _complete_bpnumber(self, text, line, begidx, endidx):
485 # Complete a breakpoint number. (This would be more helpful if we could
486 # display additional info along with the completions, such as file/line
487 # of the breakpoint.)
488 return [str(i) for i, bp in enumerate(bdb.Breakpoint.bpbynumber)
489 if bp is not None and str(i).startswith(text)]
490
491 def _complete_expression(self, text, line, begidx, endidx):
492 # Complete an arbitrary expression.
493 if not self.curframe:
494 return []
495 # Collect globals and locals. It is usually not really sensible to also
496 # complete builtins, and they clutter the namespace quite heavily, so we
497 # leave them out.
Serhiy Storchakada084702019-03-27 08:02:28 +0200498 ns = {**self.curframe.f_globals, **self.curframe_locals}
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100499 if '.' in text:
500 # Walk an attribute chain up to the last part, similar to what
501 # rlcompleter does. This will bail if any of the parts are not
502 # simple attribute access, which is what we want.
503 dotted = text.split('.')
504 try:
505 obj = ns[dotted[0]]
506 for part in dotted[1:-1]:
507 obj = getattr(obj, part)
508 except (KeyError, AttributeError):
509 return []
510 prefix = '.'.join(dotted[:-1]) + '.'
511 return [prefix + n for n in dir(obj) if n.startswith(dotted[-1])]
512 else:
513 # Complete a simple name.
514 return [n for n in ns.keys() if n.startswith(text)]
515
Tim Peters2344fae2001-01-15 00:50:52 +0000516 # Command definitions, called by cmdloop()
517 # The argument is the remaining string on the command line
518 # Return true to exit from the command loop
519
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000520 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000521 """commands [bpnumber]
522 (com) ...
523 (com) end
524 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000525
Georg Brandl0d089622010-07-30 16:00:46 +0000526 Specify a list of commands for breakpoint number bpnumber.
527 The commands themselves are entered on the following lines.
528 Type a line containing just 'end' to terminate the commands.
529 The commands are executed when the breakpoint is hit.
530
531 To remove all commands from a breakpoint, type commands and
532 follow it immediately with end; that is, give no commands.
533
534 With no bpnumber argument, commands refers to the last
535 breakpoint set.
536
537 You can use breakpoint commands to start your program up
538 again. Simply use the continue command, or step, or any other
539 command that resumes execution.
540
541 Specifying any command resuming execution (currently continue,
542 step, next, return, jump, quit and their abbreviations)
543 terminates the command list (as if that command was
544 immediately followed by end). This is because any time you
545 resume execution (even with a simple next or step), you may
546 encounter another breakpoint -- which could have its own
547 command list, leading to ambiguities about which list to
548 execute.
549
550 If you use the 'silent' command in the command list, the usual
551 message about stopping at a breakpoint is not printed. This
552 may be desirable for breakpoints that are to print a specific
553 message and then continue. If none of the other commands
554 print anything, you will see no sign that the breakpoint was
555 reached.
556 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000557 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000558 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000559 else:
560 try:
561 bnum = int(arg)
562 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000563 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000564 return
565 self.commands_bnum = bnum
Georg Brandlb90ffd82010-07-30 22:20:16 +0000566 # Save old definitions for the case of a keyboard interrupt.
567 if bnum in self.commands:
568 old_command_defs = (self.commands[bnum],
569 self.commands_doprompt[bnum],
570 self.commands_silent[bnum])
571 else:
572 old_command_defs = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000573 self.commands[bnum] = []
574 self.commands_doprompt[bnum] = True
575 self.commands_silent[bnum] = False
Georg Brandlb90ffd82010-07-30 22:20:16 +0000576
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000577 prompt_back = self.prompt
578 self.prompt = '(com) '
579 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000580 try:
581 self.cmdloop()
Georg Brandlb90ffd82010-07-30 22:20:16 +0000582 except KeyboardInterrupt:
583 # Restore old definitions.
584 if old_command_defs:
585 self.commands[bnum] = old_command_defs[0]
586 self.commands_doprompt[bnum] = old_command_defs[1]
587 self.commands_silent[bnum] = old_command_defs[2]
588 else:
589 del self.commands[bnum]
590 del self.commands_doprompt[bnum]
591 del self.commands_silent[bnum]
592 self.error('command definition aborted, old commands restored')
Georg Brandl44f8bf92010-07-30 08:54:49 +0000593 finally:
594 self.commands_defining = False
595 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000596
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100597 complete_commands = _complete_bpnumber
598
Tim Peters2344fae2001-01-15 00:50:52 +0000599 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000600 """b(reak) [ ([filename:]lineno | function) [, condition] ]
601 Without argument, list all breaks.
602
603 With a line number argument, set a break at this line in the
604 current file. With a function name, set a break at the first
605 executable line of that function. If a second argument is
606 present, it is a string specifying an expression which must
607 evaluate to true before the breakpoint is honored.
608
609 The line number may be prefixed with a filename and a colon,
610 to specify a breakpoint in another file (probably one that
611 hasn't been loaded yet). The file is searched for on
612 sys.path; the .py suffix may be omitted.
613 """
Tim Peters2344fae2001-01-15 00:50:52 +0000614 if not arg:
615 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000616 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000617 for bp in bdb.Breakpoint.bpbynumber:
618 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000619 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000620 return
621 # parse arguments; comma has lowest precedence
622 # and cannot occur in filename
623 filename = None
624 lineno = None
625 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000626 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000627 if comma > 0:
628 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000629 cond = arg[comma+1:].lstrip()
630 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000631 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000632 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000633 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000634 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000635 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000636 f = self.lookupmodule(filename)
637 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000638 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000639 return
640 else:
641 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000642 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000643 try:
644 lineno = int(arg)
Georg Brandlf93390a2010-10-14 07:17:44 +0000645 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000646 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000647 return
648 else:
649 # no colon; can be lineno or function
650 try:
651 lineno = int(arg)
652 except ValueError:
653 try:
654 func = eval(arg,
655 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000656 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000657 except:
658 func = arg
659 try:
Christian Heimesff737952007-11-27 10:40:20 +0000660 if hasattr(func, '__func__'):
661 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000662 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000663 #use co_name to identify the bkpt (function names
664 #could be aliased, but co_name is invariant)
665 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000666 lineno = code.co_firstlineno
667 filename = code.co_filename
668 except:
669 # last thing to try
670 (ok, filename, ln) = self.lineinfo(arg)
671 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000672 self.error('The specified object %r is not a function '
673 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000674 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000675 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000676 lineno = int(ln)
677 if not filename:
678 filename = self.defaultFile()
679 # Check for reasonable breakpoint
680 line = self.checkline(filename, lineno)
681 if line:
682 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000683 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000684 if err:
Berker Peksagad5ffd42014-07-12 18:24:32 +0300685 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000686 else:
687 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000688 self.message("Breakpoint %d at %s:%d" %
689 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000690
691 # To be overridden in derived debuggers
692 def defaultFile(self):
693 """Produce a reasonable default."""
694 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000695 if filename == '<string>' and self.mainpyfile:
696 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000697 return filename
698
699 do_b = do_break
700
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100701 complete_break = _complete_location
702 complete_b = _complete_location
703
Tim Peters2344fae2001-01-15 00:50:52 +0000704 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000705 """tbreak [ ([filename:]lineno | function) [, condition] ]
706 Same arguments as break, but sets a temporary breakpoint: it
707 is automatically deleted when first hit.
708 """
Tim Peters2344fae2001-01-15 00:50:52 +0000709 self.do_break(arg, 1)
710
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100711 complete_tbreak = _complete_location
712
Tim Peters2344fae2001-01-15 00:50:52 +0000713 def lineinfo(self, identifier):
714 failed = (None, None, None)
715 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000716 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000717 if len(idstring) == 1:
718 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000719 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000720 elif len(idstring) == 3:
721 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000722 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000723 else:
724 return failed
725 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000726 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000727 # Protection for derived debuggers
728 if parts[0] == 'self':
729 del parts[0]
730 if len(parts) == 0:
731 return failed
732 # Best first guess at file to look at
733 fname = self.defaultFile()
734 if len(parts) == 1:
735 item = parts[0]
736 else:
737 # More than one part.
738 # First is module, second is method/class
739 f = self.lookupmodule(parts[0])
740 if f:
741 fname = f
742 item = parts[1]
743 answer = find_function(item, fname)
744 return answer or failed
745
746 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000747 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000748
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000749 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
750 line or EOF). Warning: testing is not comprehensive.
751 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000752 # this method should be callable before starting debugging, so default
753 # to "no globals" if there is no current frame
Miss Islington (bot)c90ed8e2021-05-11 16:48:05 -0700754 frame = getattr(self, 'curframe', None)
755 globs = frame.f_globals if frame else None
Georg Brandl1e30bd32010-07-30 07:21:26 +0000756 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000757 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000758 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000759 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000760 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000761 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000762 if (not line or (line[0] == '#') or
763 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000764 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000765 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000766 return lineno
767
768 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000769 """enable bpnumber [bpnumber ...]
770 Enables the breakpoints given as a space separated list of
771 breakpoint numbers.
772 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000773 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000774 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000775 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000776 bp = self.get_bpbynumber(i)
777 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000778 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000779 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000780 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000781 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000782
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100783 complete_enable = _complete_bpnumber
784
Tim Peters2344fae2001-01-15 00:50:52 +0000785 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000786 """disable bpnumber [bpnumber ...]
787 Disables the breakpoints given as a space separated list of
788 breakpoint numbers. Disabling a breakpoint means it cannot
789 cause the program to stop execution, but unlike clearing a
790 breakpoint, it remains in the list of breakpoints and can be
791 (re-)enabled.
792 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000793 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000794 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000795 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000796 bp = self.get_bpbynumber(i)
797 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000798 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000799 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000800 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000801 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000802
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100803 complete_disable = _complete_bpnumber
804
Tim Peters2344fae2001-01-15 00:50:52 +0000805 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000806 """condition bpnumber [condition]
807 Set a new condition for the breakpoint, an expression which
808 must evaluate to true before the breakpoint is honored. If
809 condition is absent, any existing condition is removed; i.e.,
810 the breakpoint is made unconditional.
811 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000812 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000813 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000814 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000815 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000816 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000817 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000818 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200819 except IndexError:
820 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000821 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000822 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000823 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000824 bp.cond = cond
825 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000826 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000827 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000828 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000829
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100830 complete_condition = _complete_bpnumber
831
Georg Brandl7410dd12010-07-30 12:01:20 +0000832 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000833 """ignore bpnumber [count]
834 Set the ignore count for the given breakpoint number. If
835 count is omitted, the ignore count is set to 0. A breakpoint
836 becomes active when the ignore count is zero. When non-zero,
837 the count is decremented each time the breakpoint is reached
838 and the breakpoint is not disabled and any associated
839 condition evaluates to true.
840 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000841 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000842 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000843 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000844 except:
845 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000846 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000847 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200848 except IndexError:
849 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000850 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000851 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000852 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000853 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000854 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000855 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000856 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000857 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000858 countstr = '1 crossing'
859 self.message('Will ignore next %s of breakpoint %d.' %
860 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000861 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000862 self.message('Will stop next time breakpoint %d is reached.'
863 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000864
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100865 complete_ignore = _complete_bpnumber
866
Tim Peters2344fae2001-01-15 00:50:52 +0000867 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000868 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
869 With a space separated list of breakpoint numbers, clear
870 those breakpoints. Without argument, clear all breaks (but
871 first ask confirmation). With a filename:lineno argument,
872 clear all breaks at that line in that file.
873 """
Tim Peters2344fae2001-01-15 00:50:52 +0000874 if not arg:
875 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000876 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000877 except EOFError:
878 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000879 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000880 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000881 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000882 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000883 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000884 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000885 return
886 if ':' in arg:
887 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000888 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000889 filename = arg[:i]
890 arg = arg[i+1:]
891 try:
892 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000893 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000894 err = "Invalid line number (%s)" % arg
895 else:
Miss Islington (bot)9c0180a2021-06-11 09:18:19 -0700896 bplist = self.get_breaks(filename, lineno)[:]
Tim Peters2344fae2001-01-15 00:50:52 +0000897 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000898 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000899 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000900 else:
901 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000902 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000903 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000904 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000905 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000906 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000907 bp = self.get_bpbynumber(i)
908 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000909 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000910 else:
Senthil Kumaran6f107042010-11-29 11:54:17 +0000911 self.clear_bpbynumber(i)
Georg Brandl0d089622010-07-30 16:00:46 +0000912 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000913 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
914
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100915 complete_clear = _complete_location
916 complete_cl = _complete_location
917
Tim Peters2344fae2001-01-15 00:50:52 +0000918 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000919 """w(here)
920 Print a stack trace, with the most recent frame at the bottom.
921 An arrow indicates the "current frame", which determines the
922 context of most commands. 'bt' is an alias for this command.
923 """
Tim Peters2344fae2001-01-15 00:50:52 +0000924 self.print_stack_trace()
925 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000926 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000927
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000928 def _select_frame(self, number):
929 assert 0 <= number < len(self.stack)
930 self.curindex = number
931 self.curframe = self.stack[self.curindex][0]
932 self.curframe_locals = self.curframe.f_locals
933 self.print_stack_entry(self.stack[self.curindex])
934 self.lineno = None
935
Tim Peters2344fae2001-01-15 00:50:52 +0000936 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000937 """u(p) [count]
938 Move the current frame count (default one) levels up in the
939 stack trace (to an older frame).
940 """
Tim Peters2344fae2001-01-15 00:50:52 +0000941 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000942 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000943 return
944 try:
945 count = int(arg or 1)
946 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000947 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000948 return
949 if count < 0:
950 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000951 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000952 newframe = max(0, self.curindex - count)
953 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000954 do_u = do_up
955
956 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000957 """d(own) [count]
958 Move the current frame count (default one) levels down in the
959 stack trace (to a newer frame).
960 """
Tim Peters2344fae2001-01-15 00:50:52 +0000961 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000962 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000963 return
964 try:
965 count = int(arg or 1)
966 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000967 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000968 return
969 if count < 0:
970 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000971 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000972 newframe = min(len(self.stack) - 1, self.curindex + count)
973 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000974 do_d = do_down
975
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000976 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000977 """unt(il) [lineno]
978 Without argument, continue execution until the line with a
979 number greater than the current one is reached. With a line
980 number, continue execution until a line with a number greater
981 or equal to that is reached. In both cases, also stop when
982 the current frame returns.
983 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000984 if arg:
985 try:
986 lineno = int(arg)
987 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000988 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000989 return
990 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000991 self.error('"until" line number is smaller than current '
992 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000993 return
994 else:
995 lineno = None
996 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000997 return 1
998 do_unt = do_until
999
Tim Peters2344fae2001-01-15 00:50:52 +00001000 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001001 """s(tep)
1002 Execute the current line, stop at the first possible occasion
1003 (either in a function that is called or in the current
1004 function).
1005 """
Tim Peters2344fae2001-01-15 00:50:52 +00001006 self.set_step()
1007 return 1
1008 do_s = do_step
1009
1010 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001011 """n(ext)
1012 Continue execution until the next line in the current function
1013 is reached or it returns.
1014 """
Tim Peters2344fae2001-01-15 00:50:52 +00001015 self.set_next(self.curframe)
1016 return 1
1017 do_n = do_next
1018
Guido van Rossumd8faa362007-04-27 19:54:29 +00001019 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001020 """run [args...]
1021 Restart the debugged python program. If a string is supplied
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001022 it is split with "shlex", and the result is used as the new
Georg Brandl0d089622010-07-30 16:00:46 +00001023 sys.argv. History, breakpoints, actions and debugger options
1024 are preserved. "restart" is an alias for "run".
1025 """
Guido van Rossumd8faa362007-04-27 19:54:29 +00001026 if arg:
1027 import shlex
1028 argv0 = sys.argv[0:1]
Irit Katriel33022f92021-07-03 17:28:46 +01001029 try:
1030 sys.argv = shlex.split(arg)
1031 except ValueError as e:
1032 self.error('Cannot run %s: %s' % (arg, e))
1033 return
Guido van Rossumd8faa362007-04-27 19:54:29 +00001034 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +00001035 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +00001036 raise Restart
1037
1038 do_restart = do_run
1039
Tim Peters2344fae2001-01-15 00:50:52 +00001040 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001041 """r(eturn)
1042 Continue execution until the current function returns.
1043 """
Tim Peters2344fae2001-01-15 00:50:52 +00001044 self.set_return(self.curframe)
1045 return 1
1046 do_r = do_return
1047
1048 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001049 """c(ont(inue))
1050 Continue execution, only stop when a breakpoint is encountered.
1051 """
Georg Brandl44f2b642010-12-04 16:00:47 +00001052 if not self.nosigint:
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001053 try:
Xavier de Gaye10e54ae2016-10-12 20:13:24 +02001054 Pdb._previous_sigint_handler = \
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001055 signal.signal(signal.SIGINT, self.sigint_handler)
1056 except ValueError:
1057 # ValueError happens when do_continue() is invoked from
1058 # a non-main thread in which case we just continue without
1059 # SIGINT set. Would printing a message here (once) make
1060 # sense?
1061 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001062 self.set_continue()
1063 return 1
1064 do_c = do_cont = do_continue
1065
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001066 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001067 """j(ump) lineno
1068 Set the next line that will be executed. Only available in
1069 the bottom-most frame. This lets you jump back and execute
1070 code again, or jump forward to skip code that you don't want
1071 to run.
1072
1073 It should be noted that not all jumps are allowed -- for
1074 instance it is not possible to jump into the middle of a
1075 for loop or out of a finally clause.
1076 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001077 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +00001078 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001079 return
1080 try:
1081 arg = int(arg)
1082 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +00001083 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001084 else:
1085 try:
1086 # Do the jump, fix up our copy of the stack, and display the
1087 # new position
1088 self.curframe.f_lineno = arg
1089 self.stack[self.curindex] = self.stack[self.curindex][0], arg
1090 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +00001091 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +00001092 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001093 do_j = do_jump
1094
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001095 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001096 """debug code
1097 Enter a recursive debugger that steps through the code
1098 argument (which is an arbitrary expression or statement to be
1099 executed in the current environment).
1100 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001101 sys.settrace(None)
1102 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +00001103 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001104 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +00001105 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +00001106 self.message("ENTERING RECURSIVE DEBUGGER")
Daniel Hahler3e936432019-03-12 04:29:04 +01001107 try:
1108 sys.call_tracing(p.run, (arg, globals, locals))
1109 except Exception:
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -07001110 self._error_exc()
Georg Brandl0d089622010-07-30 16:00:46 +00001111 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001112 sys.settrace(self.trace_dispatch)
1113 self.lastcmd = p.lastcmd
1114
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001115 complete_debug = _complete_expression
1116
Tim Peters2344fae2001-01-15 00:50:52 +00001117 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001118 """q(uit)\nexit
1119 Quit from the debugger. The program being executed is aborted.
1120 """
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001121 self._user_requested_quit = True
Tim Peters2344fae2001-01-15 00:50:52 +00001122 self.set_quit()
1123 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001124
Tim Peters2344fae2001-01-15 00:50:52 +00001125 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001126 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +00001127
Guido van Rossumeef26072003-01-13 21:13:55 +00001128 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001129 """EOF
1130 Handles the receipt of EOF as a command.
1131 """
1132 self.message('')
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001133 self._user_requested_quit = True
Guido van Rossumeef26072003-01-13 21:13:55 +00001134 self.set_quit()
1135 return 1
1136
Tim Peters2344fae2001-01-15 00:50:52 +00001137 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001138 """a(rgs)
1139 Print the argument list of the current function.
1140 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001141 co = self.curframe.f_code
1142 dict = self.curframe_locals
Pablo Galindocd74e662019-06-01 18:08:04 +01001143 n = co.co_argcount + co.co_kwonlyargcount
Rémi Lapeyrebf457c72019-05-21 00:17:30 +02001144 if co.co_flags & inspect.CO_VARARGS: n = n+1
1145 if co.co_flags & inspect.CO_VARKEYWORDS: n = n+1
Tim Peters2344fae2001-01-15 00:50:52 +00001146 for i in range(n):
1147 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +00001148 if name in dict:
1149 self.message('%s = %r' % (name, dict[name]))
1150 else:
1151 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +00001152 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +00001153
Tim Peters2344fae2001-01-15 00:50:52 +00001154 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001155 """retval
1156 Print the return value for the last return of a function.
1157 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001158 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +00001159 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +00001160 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001161 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +00001162 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +00001163
Barry Warsaw210bd202002-11-05 22:40:20 +00001164 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +00001165 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +00001166 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +00001167 except:
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -07001168 self._error_exc()
Barry Warsaw210bd202002-11-05 22:40:20 +00001169 raise
Guido van Rossum2424f851998-09-11 22:50:09 +00001170
Georg Brandlcbc79c72010-12-04 16:21:42 +00001171 def _getval_except(self, arg, frame=None):
1172 try:
1173 if frame is None:
1174 return eval(arg, self.curframe.f_globals, self.curframe_locals)
1175 else:
1176 return eval(arg, frame.f_globals, frame.f_locals)
1177 except:
1178 exc_info = sys.exc_info()[:2]
1179 err = traceback.format_exception_only(*exc_info)[-1].strip()
1180 return _rstr('** raised %s **' % err)
1181
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -07001182 def _error_exc(self):
1183 exc_info = sys.exc_info()[:2]
1184 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
1185
1186 def _msg_val_func(self, arg, func):
1187 try:
1188 val = self._getval(arg)
1189 except:
1190 return # _getval() has displayed the error
1191 try:
1192 self.message(func(val))
1193 except:
1194 self._error_exc()
1195
Barry Warsaw210bd202002-11-05 22:40:20 +00001196 def do_p(self, arg):
R David Murray78d692f2013-10-10 17:23:26 -04001197 """p expression
Georg Brandl0d089622010-07-30 16:00:46 +00001198 Print the value of the expression.
1199 """
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -07001200 self._msg_val_func(arg, repr)
Barry Warsaw210bd202002-11-05 22:40:20 +00001201
1202 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001203 """pp expression
1204 Pretty-print the value of the expression.
1205 """
Miss Islington (bot)e3bc32f2021-06-10 13:56:57 -07001206 self._msg_val_func(arg, pprint.pformat)
Guido van Rossum2424f851998-09-11 22:50:09 +00001207
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001208 complete_print = _complete_expression
1209 complete_p = _complete_expression
1210 complete_pp = _complete_expression
1211
Tim Peters2344fae2001-01-15 00:50:52 +00001212 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001213 """l(ist) [first [,last] | .]
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001214
1215 List source code for the current file. Without arguments,
1216 list 11 lines around the current line or continue the previous
1217 listing. With . as argument, list 11 lines around the current
1218 line. With one argument, list 11 lines starting at that line.
1219 With two arguments, list the given range; if the second
1220 argument is less than the first, it is a count.
1221
1222 The current line in the current frame is indicated by "->".
1223 If an exception is being debugged, the line where the
1224 exception was originally raised or propagated is indicated by
1225 ">>", if it differs from the current line.
Georg Brandl0d089622010-07-30 16:00:46 +00001226 """
Tim Peters2344fae2001-01-15 00:50:52 +00001227 self.lastcmd = 'list'
1228 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001229 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001230 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001231 if ',' in arg:
1232 first, last = arg.split(',')
1233 first = int(first.strip())
1234 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001235 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001236 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001237 last = first + last
1238 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001239 first = int(arg.strip())
1240 first = max(1, first - 5)
1241 except ValueError:
1242 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001243 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001244 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001245 first = max(1, self.curframe.f_lineno - 5)
1246 else:
1247 first = self.lineno + 1
1248 if last is None:
1249 last = first + 10
1250 filename = self.curframe.f_code.co_filename
1251 breaklist = self.get_file_breaks(filename)
1252 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001253 lines = linecache.getlines(filename, self.curframe.f_globals)
1254 self._print_lines(lines[first-1:last], first, breaklist,
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001255 self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001256 self.lineno = min(last, len(lines))
1257 if len(lines) < last:
1258 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001259 except KeyboardInterrupt:
1260 pass
1261 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001262
Georg Brandle59ca2a2010-07-30 17:04:28 +00001263 def do_longlist(self, arg):
1264 """longlist | ll
1265 List the whole source code for the current function or frame.
1266 """
1267 filename = self.curframe.f_code.co_filename
1268 breaklist = self.get_file_breaks(filename)
1269 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001270 lines, lineno = getsourcelines(self.curframe)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001271 except OSError 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, breaklist, self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001275 do_ll = do_longlist
1276
1277 def do_source(self, arg):
1278 """source expression
1279 Try to get source code for the given object and display it.
1280 """
1281 try:
1282 obj = self._getval(arg)
1283 except:
1284 return
1285 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001286 lines, lineno = getsourcelines(obj)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001287 except (OSError, TypeError) as err:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001288 self.error(err)
1289 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001290 self._print_lines(lines, lineno)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001291
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001292 complete_source = _complete_expression
1293
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001294 def _print_lines(self, lines, start, breaks=(), frame=None):
Georg Brandle59ca2a2010-07-30 17:04:28 +00001295 """Print a range of lines."""
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001296 if frame:
1297 current_lineno = frame.f_lineno
1298 exc_lineno = self.tb_lineno.get(frame, -1)
1299 else:
1300 current_lineno = exc_lineno = -1
Georg Brandle59ca2a2010-07-30 17:04:28 +00001301 for lineno, line in enumerate(lines, start):
1302 s = str(lineno).rjust(3)
1303 if len(s) < 4:
1304 s += ' '
1305 if lineno in breaks:
1306 s += 'B'
1307 else:
1308 s += ' '
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001309 if lineno == current_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001310 s += '->'
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001311 elif lineno == exc_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001312 s += '>>'
1313 self.message(s + '\t' + line.rstrip())
1314
Tim Peters2344fae2001-01-15 00:50:52 +00001315 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001316 """whatis arg
1317 Print the type of the argument.
1318 """
Tim Peters2344fae2001-01-15 00:50:52 +00001319 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001320 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001321 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001322 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001323 return
1324 code = None
Tim Peters2344fae2001-01-15 00:50:52 +00001325 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001326 try:
1327 code = value.__func__.__code__
1328 except Exception:
1329 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001330 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001331 self.message('Method %s' % code.co_name)
1332 return
Irit Katriel022bc752020-08-27 01:51:12 +01001333 # Is it a function?
1334 try:
1335 code = value.__code__
1336 except Exception:
1337 pass
1338 if code:
1339 self.message('Function %s' % code.co_name)
1340 return
Georg Brandl0d089622010-07-30 16:00:46 +00001341 # Is it a class?
1342 if value.__class__ is type:
Serhiy Storchaka521e5862014-07-22 15:00:37 +03001343 self.message('Class %s.%s' % (value.__module__, value.__qualname__))
Tim Peters2344fae2001-01-15 00:50:52 +00001344 return
1345 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001346 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001347
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001348 complete_whatis = _complete_expression
1349
Georg Brandlcbc79c72010-12-04 16:21:42 +00001350 def do_display(self, arg):
1351 """display [expression]
1352
1353 Display the value of the expression if it changed, each time execution
1354 stops in the current frame.
1355
1356 Without expression, list all display expressions for the current frame.
1357 """
1358 if not arg:
1359 self.message('Currently displaying:')
1360 for item in self.displaying.get(self.curframe, {}).items():
1361 self.message('%s: %r' % item)
1362 else:
1363 val = self._getval_except(arg)
1364 self.displaying.setdefault(self.curframe, {})[arg] = val
1365 self.message('display %s: %r' % (arg, val))
1366
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001367 complete_display = _complete_expression
1368
Georg Brandlcbc79c72010-12-04 16:21:42 +00001369 def do_undisplay(self, arg):
1370 """undisplay [expression]
1371
1372 Do not display the expression any more in the current frame.
1373
1374 Without expression, clear all display expressions for the current frame.
1375 """
1376 if arg:
1377 try:
1378 del self.displaying.get(self.curframe, {})[arg]
1379 except KeyError:
1380 self.error('not displaying %s' % arg)
1381 else:
1382 self.displaying.pop(self.curframe, None)
1383
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001384 def complete_undisplay(self, text, line, begidx, endidx):
1385 return [e for e in self.displaying.get(self.curframe, {})
1386 if e.startswith(text)]
1387
Georg Brandl1acb7462010-12-04 11:20:26 +00001388 def do_interact(self, arg):
1389 """interact
1390
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001391 Start an interactive interpreter whose global namespace
Georg Brandl1acb7462010-12-04 11:20:26 +00001392 contains all the (global and local) names found in the current scope.
1393 """
Serhiy Storchakada084702019-03-27 08:02:28 +02001394 ns = {**self.curframe.f_globals, **self.curframe_locals}
Georg Brandl1acb7462010-12-04 11:20:26 +00001395 code.interact("*interactive*", local=ns)
1396
Tim Peters2344fae2001-01-15 00:50:52 +00001397 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001398 """alias [name [command [parameter parameter ...] ]]
1399 Create an alias called 'name' that executes 'command'. The
1400 command must *not* be enclosed in quotes. Replaceable
1401 parameters can be indicated by %1, %2, and so on, while %* is
1402 replaced by all the parameters. If no command is given, the
1403 current alias for name is shown. If no name is given, all
1404 aliases are listed.
1405
1406 Aliases may be nested and can contain anything that can be
1407 legally typed at the pdb prompt. Note! You *can* override
1408 internal pdb commands with aliases! Those internal commands
1409 are then hidden until the alias is removed. Aliasing is
1410 recursively applied to the first word of the command line; all
1411 other words in the line are left alone.
1412
1413 As an example, here are two useful aliases (especially when
1414 placed in the .pdbrc file):
1415
1416 # Print instance variables (usage "pi classInst")
R David Murray78d692f2013-10-10 17:23:26 -04001417 alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
Georg Brandl0d089622010-07-30 16:00:46 +00001418 # Print instance variables in self
1419 alias ps pi self
1420 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001421 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001422 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001423 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001424 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001425 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001426 return
Guido van Rossum08454592002-07-12 13:10:53 +00001427 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001428 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001429 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001430 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001431
Tim Peters2344fae2001-01-15 00:50:52 +00001432 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001433 """unalias name
1434 Delete the specified alias.
1435 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001436 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001437 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001438 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001439 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001440
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001441 def complete_unalias(self, text, line, begidx, endidx):
1442 return [a for a in self.aliases if a.startswith(text)]
1443
Georg Brandl0d089622010-07-30 16:00:46 +00001444 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001445 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1446 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001447
Tim Peters2344fae2001-01-15 00:50:52 +00001448 # Print a traceback starting at the top stack frame.
1449 # The most recently entered frame is printed last;
1450 # this is different from dbx and gdb, but consistent with
1451 # the Python interpreter's stack trace.
1452 # It is also consistent with the up/down commands (which are
1453 # compatible with dbx and gdb: up moves towards 'main()'
1454 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001455
Tim Peters2344fae2001-01-15 00:50:52 +00001456 def print_stack_trace(self):
1457 try:
1458 for frame_lineno in self.stack:
1459 self.print_stack_entry(frame_lineno)
1460 except KeyboardInterrupt:
1461 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001462
Tim Peters2344fae2001-01-15 00:50:52 +00001463 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1464 frame, lineno = frame_lineno
1465 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001466 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001467 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001468 prefix = ' '
1469 self.message(prefix +
1470 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001471
Georg Brandl0d089622010-07-30 16:00:46 +00001472 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001473
Georg Brandl0d089622010-07-30 16:00:46 +00001474 def do_help(self, arg):
1475 """h(elp)
1476 Without argument, print the list of available commands.
1477 With a command name as argument, print help about that command.
1478 "help pdb" shows the full pdb documentation.
1479 "help exec" gives help on the ! command.
1480 """
1481 if not arg:
1482 return cmd.Cmd.do_help(self, arg)
1483 try:
1484 try:
1485 topic = getattr(self, 'help_' + arg)
1486 return topic()
1487 except AttributeError:
1488 command = getattr(self, 'do_' + arg)
1489 except AttributeError:
1490 self.error('No help for %r' % arg)
1491 else:
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001492 if sys.flags.optimize >= 2:
1493 self.error('No help for %r; please do not run Python with -OO '
1494 'if you need command help' % arg)
1495 return
Georg Brandl0d089622010-07-30 16:00:46 +00001496 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001497
Georg Brandl0d089622010-07-30 16:00:46 +00001498 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001499
Tim Peters2344fae2001-01-15 00:50:52 +00001500 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001501 """(!) statement
1502 Execute the (one-line) statement in the context of the current
1503 stack frame. The exclamation point can be omitted unless the
1504 first word of the statement resembles a debugger command. To
1505 assign to a global variable you must always prefix the command
1506 with a 'global' command, e.g.:
1507 (Pdb) global list_options; list_options = ['-l']
1508 (Pdb)
1509 """
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001510 self.message((self.help_exec.__doc__ or '').strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001511
Tim Peters2344fae2001-01-15 00:50:52 +00001512 def help_pdb(self):
1513 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001514
Georg Brandl0d089622010-07-30 16:00:46 +00001515 # other helper functions
1516
Tim Peters2344fae2001-01-15 00:50:52 +00001517 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001518 """Helper function for break/clear parsing -- may be overridden.
1519
1520 lookupmodule() translates (possibly incomplete) file or module name
1521 into an absolute file name.
1522 """
1523 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001524 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001525 f = os.path.join(sys.path[0], filename)
1526 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1527 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001528 root, ext = os.path.splitext(filename)
1529 if ext == '':
1530 filename = filename + '.py'
1531 if os.path.isabs(filename):
1532 return filename
1533 for dirname in sys.path:
1534 while os.path.islink(dirname):
1535 dirname = os.readlink(dirname)
1536 fullname = os.path.join(dirname, filename)
1537 if os.path.exists(fullname):
1538 return fullname
1539 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001540
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001541 def _runmodule(self, module_name):
1542 self._wait_for_mainpyfile = True
1543 self._user_requested_quit = False
1544 import runpy
1545 mod_name, mod_spec, code = runpy._get_module_details(module_name)
1546 self.mainpyfile = self.canonic(code.co_filename)
1547 import __main__
1548 __main__.__dict__.clear()
1549 __main__.__dict__.update({
1550 "__name__": "__main__",
1551 "__file__": self.mainpyfile,
Mario Corchero38bfa842018-02-03 06:40:11 +00001552 "__package__": mod_spec.parent,
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001553 "__loader__": mod_spec.loader,
1554 "__spec__": mod_spec,
1555 "__builtins__": __builtins__,
1556 })
1557 self.run(code)
1558
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001559 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001560 # The script has to run in __main__ namespace (or imports from
1561 # __main__ will break).
1562 #
1563 # So we clear up the __main__ and set several special variables
1564 # (this gets rid of pdb's globals and cleans old variables on restarts).
1565 import __main__
1566 __main__.__dict__.clear()
1567 __main__.__dict__.update({"__name__" : "__main__",
1568 "__file__" : filename,
1569 "__builtins__": __builtins__,
1570 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001571
1572 # When bdb sets tracing, a number of call and line events happens
1573 # BEFORE debugger even reaches user's code (and the exact sequence of
1574 # events depends on python version). So we take special measures to
1575 # avoid stopping before we reach the main script (see user_line and
1576 # user_call for details).
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001577 self._wait_for_mainpyfile = True
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001578 self.mainpyfile = self.canonic(filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001579 self._user_requested_quit = False
jsnkllnd5938812019-11-12 17:42:47 -05001580 with io.open_code(filename) as fp:
Georg Brandld07ac642009-08-13 07:50:57 +00001581 statement = "exec(compile(%r, %r, 'exec'))" % \
1582 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001584
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001585# Collect all command help into docstring, if not run with -OO
Georg Brandl0d089622010-07-30 16:00:46 +00001586
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001587if __doc__ is not None:
1588 # unfortunately we can't guess this order from the class definition
1589 _help_order = [
1590 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1591 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
1592 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
R David Murray78d692f2013-10-10 17:23:26 -04001593 'args', 'p', 'pp', 'whatis', 'source', 'display', 'undisplay',
Georg Brandlcbc79c72010-12-04 16:21:42 +00001594 'interact', 'alias', 'unalias', 'debug', 'quit',
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001595 ]
Georg Brandl0d089622010-07-30 16:00:46 +00001596
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001597 for _command in _help_order:
1598 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1599 __doc__ += Pdb.help_exec.__doc__
Georg Brandl0d089622010-07-30 16:00:46 +00001600
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001601 del _help_order, _command
1602
Georg Brandl0d089622010-07-30 16:00:46 +00001603
Guido van Rossum35771131992-09-08 11:59:04 +00001604# Simplified interface
1605
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001606def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001607 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001608
1609def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001610 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001611
1612def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001613 # B/W compatibility
1614 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001615
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001616def runcall(*args, **kwds):
1617 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001618
Barry Warsaw35425d62017-09-22 12:29:42 -04001619def set_trace(*, header=None):
1620 pdb = Pdb()
1621 if header is not None:
1622 pdb.message(header)
1623 pdb.set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001624
1625# Post-Mortem interface
1626
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001627def post_mortem(t=None):
1628 # handling the default
1629 if t is None:
1630 # sys.exc_info() returns (type, value, traceback) if an exception is
1631 # being handled, otherwise it returns None
1632 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001633 if t is None:
1634 raise ValueError("A valid traceback must be passed if no "
1635 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001636
Tim Peters2344fae2001-01-15 00:50:52 +00001637 p = Pdb()
1638 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001639 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001640
1641def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001642 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001643
1644
1645# Main program for testing
1646
Guido van Rossum23efba41992-01-27 16:58:47 +00001647TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001648
Guido van Rossum921c8241992-01-10 14:54:42 +00001649def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001650 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001651
1652# print help
1653def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001654 import pydoc
1655 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001656
Georg Brandle0230912010-07-30 08:29:39 +00001657_usage = """\
Mario Corcherofcf8b4c2018-01-28 04:58:47 +00001658usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ...
Georg Brandle0230912010-07-30 08:29:39 +00001659
Mario Corcherofcf8b4c2018-01-28 04:58:47 +00001660Debug the Python program given by pyfile. Alternatively,
1661an executable module or package to debug can be specified using
1662the -m switch.
Georg Brandle0230912010-07-30 08:29:39 +00001663
1664Initial commands are read from .pdbrc files in your home directory
1665and in the current directory, if they exist. Commands supplied with
1666-c are executed after commands from .pdbrc files.
1667
1668To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001669To let the script run up to a given line X in the debugged file, use
1670"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001671
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001672def main():
Georg Brandle0230912010-07-30 08:29:39 +00001673 import getopt
1674
Daniel Hahler855df7f2019-09-12 17:46:37 +02001675 opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['help', 'command='])
Georg Brandle0230912010-07-30 08:29:39 +00001676
1677 if not args:
1678 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001679 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001680
Georg Brandle0230912010-07-30 08:29:39 +00001681 commands = []
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001682 run_as_module = False
Georg Brandle0230912010-07-30 08:29:39 +00001683 for opt, optarg in opts:
1684 if opt in ['-h', '--help']:
1685 print(_usage)
1686 sys.exit()
1687 elif opt in ['-c', '--command']:
1688 commands.append(optarg)
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001689 elif opt in ['-m']:
1690 run_as_module = True
Georg Brandle0230912010-07-30 08:29:39 +00001691
1692 mainpyfile = args[0] # Get script filename
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001693 if not run_as_module and not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001694 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001695 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001696
Jason R. Coombs684eb5c2021-07-28 09:04:38 -04001697 if run_as_module:
1698 import runpy
1699 try:
1700 runpy._get_module_details(mainpyfile)
1701 except Exception:
1702 traceback.print_exc()
1703 sys.exit(1)
1704
Georg Brandle0230912010-07-30 08:29:39 +00001705 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001706
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001707 if not run_as_module:
Andrey Bienkowski8603dfb2021-01-22 01:19:51 +00001708 mainpyfile = os.path.realpath(mainpyfile)
1709 # Replace pdb's dir with script's dir in front of module search path.
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001710 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001711
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001712 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1713 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001714 # changed by the user from the command line. There is a "restart" command
1715 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001716 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001717 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001718 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001719 try:
Mario Corchero9f1e5f12018-01-06 07:53:05 +00001720 if run_as_module:
1721 pdb._runmodule(mainpyfile)
1722 else:
1723 pdb._runscript(mainpyfile)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001724 if pdb._user_requested_quit:
1725 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001726 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001727 except Restart:
1728 print("Restarting", mainpyfile, "with arguments:")
Irit Katriel652bfde2021-04-01 16:25:59 +01001729 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001730 except SystemExit:
1731 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001732 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001733 print(sys.exc_info()[1])
Terry Jan Reedyca3f4352015-09-05 19:13:26 -04001734 except SyntaxError:
1735 traceback.print_exc()
1736 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001737 except:
1738 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001739 print("Uncaught exception. Entering post mortem debugging")
1740 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001741 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001742 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001743 print("Post mortem debugger finished. The " + mainpyfile +
1744 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001745
1746
1747# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001748if __name__ == '__main__':
1749 import pdb
1750 pdb.main()