blob: 2268d303906c6af6da4b3415b8863a1b66582957 [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
55defined there can be overriden by the local file.
56
57Aside from aliases, the debugger is not directly programmable; but it
58is implemented as a class from which you can derive your own debugger
59class, which you can make as fancy as you like.
60
61
62Debugger commands
63=================
64
Georg Brandl02053ee2010-07-18 10:11:03 +000065"""
Georg Brandl0d089622010-07-30 16:00:46 +000066# NOTE: the actual command documentation is collected from docstrings of the
67# commands and is appended to __doc__ after the class has been defined.
Guido van Rossum921c8241992-01-10 14:54:42 +000068
Georg Brandl44f2b642010-12-04 16:00:47 +000069import os
70import re
Guido van Rossum921c8241992-01-10 14:54:42 +000071import sys
Guido van Rossum23efba41992-01-27 16:58:47 +000072import cmd
73import bdb
Georg Brandl0a9c3e92010-07-30 18:46:38 +000074import dis
Georg Brandl1acb7462010-12-04 11:20:26 +000075import code
Georg Brandl4c7c3c52012-03-10 22:36:48 +010076import glob
Barry Warsaw210bd202002-11-05 22:40:20 +000077import pprint
Georg Brandl44f2b642010-12-04 16:00:47 +000078import signal
Georg Brandle59ca2a2010-07-30 17:04:28 +000079import inspect
Georg Brandl1acb7462010-12-04 11:20:26 +000080import traceback
81import linecache
Guido van Rossumd8faa362007-04-27 19:54:29 +000082
83
84class Restart(Exception):
85 """Causes a debugger to be restarted for the debugged python program."""
86 pass
87
Skip Montanaro352674d2001-02-07 23:14:30 +000088__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
89 "post_mortem", "help"]
90
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000091def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000092 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000093 try:
94 fp = open(filename)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +020095 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +000096 return None
97 # consumer of this info expects the first line to be 1
Georg Brandl6e220552013-10-13 20:51:47 +020098 with fp:
99 for lineno, line in enumerate(fp, start=1):
100 if cre.match(line):
101 return funcname, filename, lineno
102 return None
Guido van Rossum921c8241992-01-10 14:54:42 +0000103
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000104def getsourcelines(obj):
105 lines, lineno = inspect.findsource(obj)
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000106 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000107 # must be a module frame: do not try to cut a block out of it
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000108 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000109 elif inspect.ismodule(obj):
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000110 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000111 return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum921c8241992-01-10 14:54:42 +0000112
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000113def lasti2lineno(code, lasti):
114 linestarts = list(dis.findlinestarts(code))
115 linestarts.reverse()
116 for i, lineno in linestarts:
117 if lasti >= i:
118 return lineno
119 return 0
120
121
Georg Brandlcbc79c72010-12-04 16:21:42 +0000122class _rstr(str):
123 """String that doesn't quote its repr."""
124 def __repr__(self):
125 return self
126
127
Guido van Rossuma558e371994-11-10 22:27:35 +0000128# Interaction prompt line will separate file and call info from code
129# text using value of line_prefix string. A newline and arrow may
130# be to your liking. You can set it once pdb is imported using the
131# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +0000132# line_prefix = ': ' # Use this to get the old situation back
133line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +0000134
Guido van Rossum23efba41992-01-27 16:58:47 +0000135class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +0000136
Georg Brandl44f2b642010-12-04 16:00:47 +0000137 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
138 nosigint=False):
Georg Brandl243ad662009-05-05 09:00:19 +0000139 bdb.Bdb.__init__(self, skip=skip)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000140 cmd.Cmd.__init__(self, completekey, stdin, stdout)
141 if stdout:
142 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000143 self.prompt = '(Pdb) '
144 self.aliases = {}
Georg Brandlcbc79c72010-12-04 16:21:42 +0000145 self.displaying = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000146 self.mainpyfile = ''
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000147 self._wait_for_mainpyfile = False
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000148 self.tb_lineno = {}
Tim Peters2344fae2001-01-15 00:50:52 +0000149 # Try to load readline if it exists
150 try:
151 import readline
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100152 # remove some common file name delimiters
153 readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
Brett Cannoncd171c82013-07-04 17:43:24 -0400154 except ImportError:
Tim Peters2344fae2001-01-15 00:50:52 +0000155 pass
Georg Brandl44f2b642010-12-04 16:00:47 +0000156 self.allow_kbdint = False
157 self.nosigint = nosigint
Guido van Rossum2424f851998-09-11 22:50:09 +0000158
Tim Peters2344fae2001-01-15 00:50:52 +0000159 # Read $HOME/.pdbrc and ./.pdbrc
160 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +0000161 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +0000162 envHome = os.environ['HOME']
163 try:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000164 with open(os.path.join(envHome, ".pdbrc")) as rcFile:
165 self.rcLines.extend(rcFile)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200166 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +0000167 pass
Tim Peters2344fae2001-01-15 00:50:52 +0000168 try:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000169 with open(".pdbrc") as rcFile:
170 self.rcLines.extend(rcFile)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200171 except OSError:
Tim Peters2344fae2001-01-15 00:50:52 +0000172 pass
Guido van Rossum23efba41992-01-27 16:58:47 +0000173
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000174 self.commands = {} # associates a command list to breakpoint numbers
Benjamin Petersond23f8222009-04-05 19:13:16 +0000175 self.commands_doprompt = {} # for each bp num, tells if the prompt
176 # must be disp. after execing the cmd list
177 self.commands_silent = {} # for each bp num, tells if the stack trace
178 # must be disp. after execing the cmd list
179 self.commands_defining = False # True while in the process of defining
180 # a command list
181 self.commands_bnum = None # The breakpoint number for which we are
182 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000183
Georg Brandl44f2b642010-12-04 16:00:47 +0000184 def sigint_handler(self, signum, frame):
185 if self.allow_kbdint:
186 raise KeyboardInterrupt
187 self.message("\nProgram interrupted. (Use 'cont' to resume).")
188 self.set_step()
189 self.set_trace(frame)
190 # restore previous signal handler
191 signal.signal(signal.SIGINT, self._previous_sigint_handler)
192
Tim Peters2344fae2001-01-15 00:50:52 +0000193 def reset(self):
194 bdb.Bdb.reset(self)
195 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000196
Tim Peters2344fae2001-01-15 00:50:52 +0000197 def forget(self):
198 self.lineno = None
199 self.stack = []
200 self.curindex = 0
201 self.curframe = None
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000202 self.tb_lineno.clear()
Guido van Rossum2424f851998-09-11 22:50:09 +0000203
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000204 def setup(self, f, tb):
Tim Peters2344fae2001-01-15 00:50:52 +0000205 self.forget()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000206 self.stack, self.curindex = self.get_stack(f, tb)
207 while tb:
208 # when setting up post-mortem debugging with a traceback, save all
209 # the original line numbers to be displayed along the current line
210 # numbers (which can be different, e.g. due to finally clauses)
211 lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
212 self.tb_lineno[tb.tb_frame] = lineno
213 tb = tb.tb_next
Tim Peters2344fae2001-01-15 00:50:52 +0000214 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000215 # The f_locals dictionary is updated from the actual frame
216 # locals whenever the .f_locals accessor is called, so we
217 # cache it here to ensure that modifications are not overwritten.
218 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000219 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000220
Tim Peters2344fae2001-01-15 00:50:52 +0000221 # Can be executed earlier than 'setup' if desired
222 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000223 if not self.rcLines:
224 return
225 # local copy because of recursion
226 rcLines = self.rcLines
227 rcLines.reverse()
228 # execute every line only once
229 self.rcLines = []
230 while rcLines:
231 line = rcLines.pop().strip()
232 if line and line[0] != '#':
233 if self.onecmd(line):
234 # if onecmd returns True, the command wants to exit
235 # from the interaction, save leftover rc lines
236 # to execute before next interaction
237 self.rcLines += reversed(rcLines)
238 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000239
Tim Peters280488b2002-08-23 18:19:30 +0000240 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000241
242 def user_call(self, frame, argument_list):
243 """This method is called when there is the remote possibility
244 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000245 if self._wait_for_mainpyfile:
246 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000247 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000248 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000249 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000250
Tim Peters2344fae2001-01-15 00:50:52 +0000251 def user_line(self, frame):
252 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000253 if self._wait_for_mainpyfile:
254 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000255 or frame.f_lineno <= 0):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000256 return
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000257 self._wait_for_mainpyfile = False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000258 if self.bp_commands(frame):
259 self.interaction(frame, None)
260
Georg Brandle0230912010-07-30 08:29:39 +0000261 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000262 """Call every command that was set for the current active breakpoint
263 (if there is one).
264
265 Returns True if the normal interaction function must be called,
266 False otherwise."""
267 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
268 if getattr(self, "currentbp", False) and \
269 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000270 currentbp = self.currentbp
271 self.currentbp = 0
272 lastcmd_back = self.lastcmd
273 self.setup(frame, None)
274 for line in self.commands[currentbp]:
275 self.onecmd(line)
276 self.lastcmd = lastcmd_back
277 if not self.commands_silent[currentbp]:
278 self.print_stack_entry(self.stack[self.curindex])
279 if self.commands_doprompt[currentbp]:
Georg Brandl44f2b642010-12-04 16:00:47 +0000280 self._cmdloop()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000281 self.forget()
282 return
283 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000284
Tim Peters2344fae2001-01-15 00:50:52 +0000285 def user_return(self, frame, return_value):
286 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000287 if self._wait_for_mainpyfile:
288 return
Tim Peters2344fae2001-01-15 00:50:52 +0000289 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000290 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000291 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000292
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000293 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000294 """This function is called if an exception occurs,
295 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000296 if self._wait_for_mainpyfile:
297 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000298 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000299 frame.f_locals['__exception__'] = exc_type, exc_value
Georg Brandl0d089622010-07-30 16:00:46 +0000300 self.message(traceback.format_exception_only(exc_type,
301 exc_value)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000302 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000303
Tim Peters2344fae2001-01-15 00:50:52 +0000304 # General interaction function
Georg Brandl44f2b642010-12-04 16:00:47 +0000305 def _cmdloop(self):
306 while True:
307 try:
308 # keyboard interrupts allow for an easy way to cancel
309 # the current command, so allow them during interactive input
310 self.allow_kbdint = True
311 self.cmdloop()
312 self.allow_kbdint = False
313 break
314 except KeyboardInterrupt:
315 self.message('--KeyboardInterrupt--')
Tim Peters2344fae2001-01-15 00:50:52 +0000316
Georg Brandlcbc79c72010-12-04 16:21:42 +0000317 # Called before loop, handles display expressions
318 def preloop(self):
319 displaying = self.displaying.get(self.curframe)
320 if displaying:
321 for expr, oldvalue in displaying.items():
322 newvalue = self._getval_except(expr)
323 # check for identity first; this prevents custom __eq__ to
324 # be called at every loop, and also prevents instances whose
325 # fields are changed to be displayed
326 if newvalue is not oldvalue and newvalue != oldvalue:
327 displaying[expr] = newvalue
328 self.message('display %s: %r [old: %r]' %
329 (expr, newvalue, oldvalue))
330
Tim Peters2344fae2001-01-15 00:50:52 +0000331 def interaction(self, frame, traceback):
Georg Brandle0230912010-07-30 08:29:39 +0000332 if self.setup(frame, traceback):
333 # no interaction desired at this time (happens if .pdbrc contains
334 # a command like "continue")
335 self.forget()
336 return
Tim Peters2344fae2001-01-15 00:50:52 +0000337 self.print_stack_entry(self.stack[self.curindex])
Georg Brandl44f2b642010-12-04 16:00:47 +0000338 self._cmdloop()
Tim Peters2344fae2001-01-15 00:50:52 +0000339 self.forget()
340
Benjamin Petersond23f8222009-04-05 19:13:16 +0000341 def displayhook(self, obj):
342 """Custom displayhook for the exec in default(), which prevents
343 assignment of the _ variable in the builtins.
344 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000345 # reproduce the behavior of the standard displayhook, not printing None
346 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000347 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000348
Tim Peters2344fae2001-01-15 00:50:52 +0000349 def default(self, line):
350 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000351 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000352 globals = self.curframe.f_globals
353 try:
354 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000355 save_stdout = sys.stdout
356 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000357 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000358 try:
359 sys.stdin = self.stdin
360 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000361 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000362 exec(code, globals, locals)
363 finally:
364 sys.stdout = save_stdout
365 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000366 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000367 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000368 exc_info = sys.exc_info()[:2]
369 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000370
371 def precmd(self, line):
372 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000373 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000374 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000375 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000376 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000377 line = self.aliases[args[0]]
378 ii = 1
379 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000380 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000381 tmpArg)
Georg Brandlac9a2bb2010-11-29 20:19:15 +0000382 ii += 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000383 line = line.replace("%*", ' '.join(args[1:]))
384 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000385 # split into ';;' separated commands
386 # unless it's an alias command
387 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000388 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000389 if marker >= 0:
390 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000391 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000392 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000393 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000394 return line
395
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000396 def onecmd(self, line):
397 """Interpret the argument as though it had been typed in response
398 to the prompt.
399
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000400 Checks whether this line is typed at the normal prompt or in
401 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000402 """
403 if not self.commands_defining:
404 return cmd.Cmd.onecmd(self, line)
405 else:
406 return self.handle_command_def(line)
407
Georg Brandlb90ffd82010-07-30 22:20:16 +0000408 def handle_command_def(self, line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000409 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000410 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000411 if not cmd:
412 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000413 if cmd == 'silent':
414 self.commands_silent[self.commands_bnum] = True
415 return # continue to handle other cmd def in the cmd list
416 elif cmd == 'end':
417 self.cmdqueue = []
418 return 1 # end of cmd list
419 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000420 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000421 cmdlist.append(cmd+' '+arg)
422 else:
423 cmdlist.append(cmd)
424 # Determine if we must stop
425 try:
426 func = getattr(self, 'do_' + cmd)
427 except AttributeError:
428 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000429 # one of the resuming commands
430 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000431 self.commands_doprompt[self.commands_bnum] = False
432 self.cmdqueue = []
433 return 1
434 return
435
Georg Brandl0d089622010-07-30 16:00:46 +0000436 # interface abstraction functions
437
438 def message(self, msg):
439 print(msg, file=self.stdout)
440
441 def error(self, msg):
442 print('***', msg, file=self.stdout)
443
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100444 # Generic completion functions. Individual complete_foo methods can be
445 # assigned below to one of these functions.
446
447 def _complete_location(self, text, line, begidx, endidx):
448 # Complete a file/module/function location for break/tbreak/clear.
449 if line.strip().endswith((':', ',')):
450 # Here comes a line number or a condition which we can't complete.
451 return []
452 # First, try to find matching functions (i.e. expressions).
453 try:
454 ret = self._complete_expression(text, line, begidx, endidx)
455 except Exception:
456 ret = []
457 # Then, try to complete file names as well.
458 globs = glob.glob(text + '*')
459 for fn in globs:
460 if os.path.isdir(fn):
461 ret.append(fn + '/')
462 elif os.path.isfile(fn) and fn.lower().endswith(('.py', '.pyw')):
463 ret.append(fn + ':')
464 return ret
465
466 def _complete_bpnumber(self, text, line, begidx, endidx):
467 # Complete a breakpoint number. (This would be more helpful if we could
468 # display additional info along with the completions, such as file/line
469 # of the breakpoint.)
470 return [str(i) for i, bp in enumerate(bdb.Breakpoint.bpbynumber)
471 if bp is not None and str(i).startswith(text)]
472
473 def _complete_expression(self, text, line, begidx, endidx):
474 # Complete an arbitrary expression.
475 if not self.curframe:
476 return []
477 # Collect globals and locals. It is usually not really sensible to also
478 # complete builtins, and they clutter the namespace quite heavily, so we
479 # leave them out.
480 ns = self.curframe.f_globals.copy()
481 ns.update(self.curframe_locals)
482 if '.' in text:
483 # Walk an attribute chain up to the last part, similar to what
484 # rlcompleter does. This will bail if any of the parts are not
485 # simple attribute access, which is what we want.
486 dotted = text.split('.')
487 try:
488 obj = ns[dotted[0]]
489 for part in dotted[1:-1]:
490 obj = getattr(obj, part)
491 except (KeyError, AttributeError):
492 return []
493 prefix = '.'.join(dotted[:-1]) + '.'
494 return [prefix + n for n in dir(obj) if n.startswith(dotted[-1])]
495 else:
496 # Complete a simple name.
497 return [n for n in ns.keys() if n.startswith(text)]
498
Tim Peters2344fae2001-01-15 00:50:52 +0000499 # Command definitions, called by cmdloop()
500 # The argument is the remaining string on the command line
501 # Return true to exit from the command loop
502
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000503 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000504 """commands [bpnumber]
505 (com) ...
506 (com) end
507 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000508
Georg Brandl0d089622010-07-30 16:00:46 +0000509 Specify a list of commands for breakpoint number bpnumber.
510 The commands themselves are entered on the following lines.
511 Type a line containing just 'end' to terminate the commands.
512 The commands are executed when the breakpoint is hit.
513
514 To remove all commands from a breakpoint, type commands and
515 follow it immediately with end; that is, give no commands.
516
517 With no bpnumber argument, commands refers to the last
518 breakpoint set.
519
520 You can use breakpoint commands to start your program up
521 again. Simply use the continue command, or step, or any other
522 command that resumes execution.
523
524 Specifying any command resuming execution (currently continue,
525 step, next, return, jump, quit and their abbreviations)
526 terminates the command list (as if that command was
527 immediately followed by end). This is because any time you
528 resume execution (even with a simple next or step), you may
529 encounter another breakpoint -- which could have its own
530 command list, leading to ambiguities about which list to
531 execute.
532
533 If you use the 'silent' command in the command list, the usual
534 message about stopping at a breakpoint is not printed. This
535 may be desirable for breakpoints that are to print a specific
536 message and then continue. If none of the other commands
537 print anything, you will see no sign that the breakpoint was
538 reached.
539 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000540 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000541 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000542 else:
543 try:
544 bnum = int(arg)
545 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000546 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000547 return
548 self.commands_bnum = bnum
Georg Brandlb90ffd82010-07-30 22:20:16 +0000549 # Save old definitions for the case of a keyboard interrupt.
550 if bnum in self.commands:
551 old_command_defs = (self.commands[bnum],
552 self.commands_doprompt[bnum],
553 self.commands_silent[bnum])
554 else:
555 old_command_defs = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000556 self.commands[bnum] = []
557 self.commands_doprompt[bnum] = True
558 self.commands_silent[bnum] = False
Georg Brandlb90ffd82010-07-30 22:20:16 +0000559
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000560 prompt_back = self.prompt
561 self.prompt = '(com) '
562 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000563 try:
564 self.cmdloop()
Georg Brandlb90ffd82010-07-30 22:20:16 +0000565 except KeyboardInterrupt:
566 # Restore old definitions.
567 if old_command_defs:
568 self.commands[bnum] = old_command_defs[0]
569 self.commands_doprompt[bnum] = old_command_defs[1]
570 self.commands_silent[bnum] = old_command_defs[2]
571 else:
572 del self.commands[bnum]
573 del self.commands_doprompt[bnum]
574 del self.commands_silent[bnum]
575 self.error('command definition aborted, old commands restored')
Georg Brandl44f8bf92010-07-30 08:54:49 +0000576 finally:
577 self.commands_defining = False
578 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000579
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100580 complete_commands = _complete_bpnumber
581
Tim Peters2344fae2001-01-15 00:50:52 +0000582 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000583 """b(reak) [ ([filename:]lineno | function) [, condition] ]
584 Without argument, list all breaks.
585
586 With a line number argument, set a break at this line in the
587 current file. With a function name, set a break at the first
588 executable line of that function. If a second argument is
589 present, it is a string specifying an expression which must
590 evaluate to true before the breakpoint is honored.
591
592 The line number may be prefixed with a filename and a colon,
593 to specify a breakpoint in another file (probably one that
594 hasn't been loaded yet). The file is searched for on
595 sys.path; the .py suffix may be omitted.
596 """
Tim Peters2344fae2001-01-15 00:50:52 +0000597 if not arg:
598 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000599 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000600 for bp in bdb.Breakpoint.bpbynumber:
601 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000602 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000603 return
604 # parse arguments; comma has lowest precedence
605 # and cannot occur in filename
606 filename = None
607 lineno = None
608 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000609 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000610 if comma > 0:
611 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000612 cond = arg[comma+1:].lstrip()
613 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000614 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000615 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000616 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000617 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000618 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000619 f = self.lookupmodule(filename)
620 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000621 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000622 return
623 else:
624 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000625 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000626 try:
627 lineno = int(arg)
Georg Brandlf93390a2010-10-14 07:17:44 +0000628 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000629 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000630 return
631 else:
632 # no colon; can be lineno or function
633 try:
634 lineno = int(arg)
635 except ValueError:
636 try:
637 func = eval(arg,
638 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000639 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000640 except:
641 func = arg
642 try:
Christian Heimesff737952007-11-27 10:40:20 +0000643 if hasattr(func, '__func__'):
644 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000645 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000646 #use co_name to identify the bkpt (function names
647 #could be aliased, but co_name is invariant)
648 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000649 lineno = code.co_firstlineno
650 filename = code.co_filename
651 except:
652 # last thing to try
653 (ok, filename, ln) = self.lineinfo(arg)
654 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000655 self.error('The specified object %r is not a function '
656 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000657 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000658 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000659 lineno = int(ln)
660 if not filename:
661 filename = self.defaultFile()
662 # Check for reasonable breakpoint
663 line = self.checkline(filename, lineno)
664 if line:
665 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000666 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000667 if err:
668 self.error(err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000669 else:
670 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000671 self.message("Breakpoint %d at %s:%d" %
672 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000673
674 # To be overridden in derived debuggers
675 def defaultFile(self):
676 """Produce a reasonable default."""
677 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000678 if filename == '<string>' and self.mainpyfile:
679 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000680 return filename
681
682 do_b = do_break
683
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100684 complete_break = _complete_location
685 complete_b = _complete_location
686
Tim Peters2344fae2001-01-15 00:50:52 +0000687 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000688 """tbreak [ ([filename:]lineno | function) [, condition] ]
689 Same arguments as break, but sets a temporary breakpoint: it
690 is automatically deleted when first hit.
691 """
Tim Peters2344fae2001-01-15 00:50:52 +0000692 self.do_break(arg, 1)
693
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100694 complete_tbreak = _complete_location
695
Tim Peters2344fae2001-01-15 00:50:52 +0000696 def lineinfo(self, identifier):
697 failed = (None, None, None)
698 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000699 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000700 if len(idstring) == 1:
701 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000702 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000703 elif len(idstring) == 3:
704 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000705 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000706 else:
707 return failed
708 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000709 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000710 # Protection for derived debuggers
711 if parts[0] == 'self':
712 del parts[0]
713 if len(parts) == 0:
714 return failed
715 # Best first guess at file to look at
716 fname = self.defaultFile()
717 if len(parts) == 1:
718 item = parts[0]
719 else:
720 # More than one part.
721 # First is module, second is method/class
722 f = self.lookupmodule(parts[0])
723 if f:
724 fname = f
725 item = parts[1]
726 answer = find_function(item, fname)
727 return answer or failed
728
729 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000730 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000731
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000732 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
733 line or EOF). Warning: testing is not comprehensive.
734 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000735 # this method should be callable before starting debugging, so default
736 # to "no globals" if there is no current frame
737 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
738 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000739 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000740 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000741 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000742 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000743 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000744 if (not line or (line[0] == '#') or
745 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000746 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000747 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000748 return lineno
749
750 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000751 """enable bpnumber [bpnumber ...]
752 Enables the breakpoints given as a space separated list of
753 breakpoint numbers.
754 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000755 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000756 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000757 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000758 bp = self.get_bpbynumber(i)
759 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000760 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000761 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000762 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000763 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000764
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100765 complete_enable = _complete_bpnumber
766
Tim Peters2344fae2001-01-15 00:50:52 +0000767 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000768 """disable bpnumber [bpnumber ...]
769 Disables the breakpoints given as a space separated list of
770 breakpoint numbers. Disabling a breakpoint means it cannot
771 cause the program to stop execution, but unlike clearing a
772 breakpoint, it remains in the list of breakpoints and can be
773 (re-)enabled.
774 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000775 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000776 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000777 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000778 bp = self.get_bpbynumber(i)
779 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000780 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000781 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000782 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000783 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000784
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100785 complete_disable = _complete_bpnumber
786
Tim Peters2344fae2001-01-15 00:50:52 +0000787 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000788 """condition bpnumber [condition]
789 Set a new condition for the breakpoint, an expression which
790 must evaluate to true before the breakpoint is honored. If
791 condition is absent, any existing condition is removed; i.e.,
792 the breakpoint is made unconditional.
793 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000794 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000795 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000796 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000797 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000798 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000799 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000800 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200801 except IndexError:
802 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000803 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000804 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000805 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000806 bp.cond = cond
807 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000808 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000809 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000810 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000811
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100812 complete_condition = _complete_bpnumber
813
Georg Brandl7410dd12010-07-30 12:01:20 +0000814 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000815 """ignore bpnumber [count]
816 Set the ignore count for the given breakpoint number. If
817 count is omitted, the ignore count is set to 0. A breakpoint
818 becomes active when the ignore count is zero. When non-zero,
819 the count is decremented each time the breakpoint is reached
820 and the breakpoint is not disabled and any associated
821 condition evaluates to true.
822 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000823 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000824 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000825 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000826 except:
827 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000828 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000829 bp = self.get_bpbynumber(args[0].strip())
Georg Brandl0079ffc2013-10-14 16:08:15 +0200830 except IndexError:
831 self.error('Breakpoint number expected')
Georg Brandl7410dd12010-07-30 12:01:20 +0000832 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000833 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000834 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000835 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000836 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000837 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000838 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000839 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000840 countstr = '1 crossing'
841 self.message('Will ignore next %s of breakpoint %d.' %
842 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000843 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000844 self.message('Will stop next time breakpoint %d is reached.'
845 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000846
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100847 complete_ignore = _complete_bpnumber
848
Tim Peters2344fae2001-01-15 00:50:52 +0000849 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000850 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
851 With a space separated list of breakpoint numbers, clear
852 those breakpoints. Without argument, clear all breaks (but
853 first ask confirmation). With a filename:lineno argument,
854 clear all breaks at that line in that file.
855 """
Tim Peters2344fae2001-01-15 00:50:52 +0000856 if not arg:
857 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000858 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000859 except EOFError:
860 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000861 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000862 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000863 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000864 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000865 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000866 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000867 return
868 if ':' in arg:
869 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000870 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000871 filename = arg[:i]
872 arg = arg[i+1:]
873 try:
874 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000875 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000876 err = "Invalid line number (%s)" % arg
877 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000878 bplist = self.get_breaks(filename, lineno)
Tim Peters2344fae2001-01-15 00:50:52 +0000879 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000880 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000881 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000882 else:
883 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
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000886 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000887 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000888 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000889 bp = self.get_bpbynumber(i)
890 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000891 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000892 else:
Senthil Kumaran6f107042010-11-29 11:54:17 +0000893 self.clear_bpbynumber(i)
Georg Brandl0d089622010-07-30 16:00:46 +0000894 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000895 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
896
Georg Brandl4c7c3c52012-03-10 22:36:48 +0100897 complete_clear = _complete_location
898 complete_cl = _complete_location
899
Tim Peters2344fae2001-01-15 00:50:52 +0000900 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000901 """w(here)
902 Print a stack trace, with the most recent frame at the bottom.
903 An arrow indicates the "current frame", which determines the
904 context of most commands. 'bt' is an alias for this command.
905 """
Tim Peters2344fae2001-01-15 00:50:52 +0000906 self.print_stack_trace()
907 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000908 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000909
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000910 def _select_frame(self, number):
911 assert 0 <= number < len(self.stack)
912 self.curindex = number
913 self.curframe = self.stack[self.curindex][0]
914 self.curframe_locals = self.curframe.f_locals
915 self.print_stack_entry(self.stack[self.curindex])
916 self.lineno = None
917
Tim Peters2344fae2001-01-15 00:50:52 +0000918 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000919 """u(p) [count]
920 Move the current frame count (default one) levels up in the
921 stack trace (to an older frame).
922 """
Tim Peters2344fae2001-01-15 00:50:52 +0000923 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000924 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000925 return
926 try:
927 count = int(arg or 1)
928 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000929 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000930 return
931 if count < 0:
932 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000933 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000934 newframe = max(0, self.curindex - count)
935 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000936 do_u = do_up
937
938 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000939 """d(own) [count]
940 Move the current frame count (default one) levels down in the
941 stack trace (to a newer frame).
942 """
Tim Peters2344fae2001-01-15 00:50:52 +0000943 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000944 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000945 return
946 try:
947 count = int(arg or 1)
948 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000949 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000950 return
951 if count < 0:
952 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000953 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000954 newframe = min(len(self.stack) - 1, self.curindex + count)
955 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000956 do_d = do_down
957
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000958 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000959 """unt(il) [lineno]
960 Without argument, continue execution until the line with a
961 number greater than the current one is reached. With a line
962 number, continue execution until a line with a number greater
963 or equal to that is reached. In both cases, also stop when
964 the current frame returns.
965 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000966 if arg:
967 try:
968 lineno = int(arg)
969 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000970 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000971 return
972 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000973 self.error('"until" line number is smaller than current '
974 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000975 return
976 else:
977 lineno = None
978 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000979 return 1
980 do_unt = do_until
981
Tim Peters2344fae2001-01-15 00:50:52 +0000982 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000983 """s(tep)
984 Execute the current line, stop at the first possible occasion
985 (either in a function that is called or in the current
986 function).
987 """
Tim Peters2344fae2001-01-15 00:50:52 +0000988 self.set_step()
989 return 1
990 do_s = do_step
991
992 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000993 """n(ext)
994 Continue execution until the next line in the current function
995 is reached or it returns.
996 """
Tim Peters2344fae2001-01-15 00:50:52 +0000997 self.set_next(self.curframe)
998 return 1
999 do_n = do_next
1000
Guido van Rossumd8faa362007-04-27 19:54:29 +00001001 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001002 """run [args...]
1003 Restart the debugged python program. If a string is supplied
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001004 it is split with "shlex", and the result is used as the new
Georg Brandl0d089622010-07-30 16:00:46 +00001005 sys.argv. History, breakpoints, actions and debugger options
1006 are preserved. "restart" is an alias for "run".
1007 """
Guido van Rossumd8faa362007-04-27 19:54:29 +00001008 if arg:
1009 import shlex
1010 argv0 = sys.argv[0:1]
1011 sys.argv = shlex.split(arg)
1012 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +00001013 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +00001014 raise Restart
1015
1016 do_restart = do_run
1017
Tim Peters2344fae2001-01-15 00:50:52 +00001018 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001019 """r(eturn)
1020 Continue execution until the current function returns.
1021 """
Tim Peters2344fae2001-01-15 00:50:52 +00001022 self.set_return(self.curframe)
1023 return 1
1024 do_r = do_return
1025
1026 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001027 """c(ont(inue))
1028 Continue execution, only stop when a breakpoint is encountered.
1029 """
Georg Brandl44f2b642010-12-04 16:00:47 +00001030 if not self.nosigint:
Andrew Svetlov539ee5d2012-12-04 21:08:28 +02001031 try:
1032 self._previous_sigint_handler = \
1033 signal.signal(signal.SIGINT, self.sigint_handler)
1034 except ValueError:
1035 # ValueError happens when do_continue() is invoked from
1036 # a non-main thread in which case we just continue without
1037 # SIGINT set. Would printing a message here (once) make
1038 # sense?
1039 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001040 self.set_continue()
1041 return 1
1042 do_c = do_cont = do_continue
1043
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001044 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001045 """j(ump) lineno
1046 Set the next line that will be executed. Only available in
1047 the bottom-most frame. This lets you jump back and execute
1048 code again, or jump forward to skip code that you don't want
1049 to run.
1050
1051 It should be noted that not all jumps are allowed -- for
1052 instance it is not possible to jump into the middle of a
1053 for loop or out of a finally clause.
1054 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001055 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +00001056 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001057 return
1058 try:
1059 arg = int(arg)
1060 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +00001061 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001062 else:
1063 try:
1064 # Do the jump, fix up our copy of the stack, and display the
1065 # new position
1066 self.curframe.f_lineno = arg
1067 self.stack[self.curindex] = self.stack[self.curindex][0], arg
1068 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +00001069 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +00001070 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001071 do_j = do_jump
1072
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001073 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001074 """debug code
1075 Enter a recursive debugger that steps through the code
1076 argument (which is an arbitrary expression or statement to be
1077 executed in the current environment).
1078 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001079 sys.settrace(None)
1080 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +00001081 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +00001082 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +00001083 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +00001084 self.message("ENTERING RECURSIVE DEBUGGER")
Guido van Rossumed538d82003-04-09 19:36:34 +00001085 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl0d089622010-07-30 16:00:46 +00001086 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001087 sys.settrace(self.trace_dispatch)
1088 self.lastcmd = p.lastcmd
1089
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001090 complete_debug = _complete_expression
1091
Tim Peters2344fae2001-01-15 00:50:52 +00001092 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001093 """q(uit)\nexit
1094 Quit from the debugger. The program being executed is aborted.
1095 """
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001096 self._user_requested_quit = True
Tim Peters2344fae2001-01-15 00:50:52 +00001097 self.set_quit()
1098 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001099
Tim Peters2344fae2001-01-15 00:50:52 +00001100 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001101 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +00001102
Guido van Rossumeef26072003-01-13 21:13:55 +00001103 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001104 """EOF
1105 Handles the receipt of EOF as a command.
1106 """
1107 self.message('')
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001108 self._user_requested_quit = True
Guido van Rossumeef26072003-01-13 21:13:55 +00001109 self.set_quit()
1110 return 1
1111
Tim Peters2344fae2001-01-15 00:50:52 +00001112 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001113 """a(rgs)
1114 Print the argument list of the current function.
1115 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001116 co = self.curframe.f_code
1117 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +00001118 n = co.co_argcount
1119 if co.co_flags & 4: n = n+1
1120 if co.co_flags & 8: n = n+1
1121 for i in range(n):
1122 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +00001123 if name in dict:
1124 self.message('%s = %r' % (name, dict[name]))
1125 else:
1126 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +00001127 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +00001128
Tim Peters2344fae2001-01-15 00:50:52 +00001129 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001130 """retval
1131 Print the return value for the last return of a function.
1132 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001133 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +00001134 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +00001135 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001136 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +00001137 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +00001138
Barry Warsaw210bd202002-11-05 22:40:20 +00001139 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +00001140 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +00001141 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +00001142 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001143 exc_info = sys.exc_info()[:2]
1144 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Barry Warsaw210bd202002-11-05 22:40:20 +00001145 raise
Guido van Rossum2424f851998-09-11 22:50:09 +00001146
Georg Brandlcbc79c72010-12-04 16:21:42 +00001147 def _getval_except(self, arg, frame=None):
1148 try:
1149 if frame is None:
1150 return eval(arg, self.curframe.f_globals, self.curframe_locals)
1151 else:
1152 return eval(arg, frame.f_globals, frame.f_locals)
1153 except:
1154 exc_info = sys.exc_info()[:2]
1155 err = traceback.format_exception_only(*exc_info)[-1].strip()
1156 return _rstr('** raised %s **' % err)
1157
Barry Warsaw210bd202002-11-05 22:40:20 +00001158 def do_p(self, arg):
R David Murray78d692f2013-10-10 17:23:26 -04001159 """p expression
Georg Brandl0d089622010-07-30 16:00:46 +00001160 Print the value of the expression.
1161 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001162 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001163 self.message(repr(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001164 except:
1165 pass
1166
1167 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001168 """pp expression
1169 Pretty-print the value of the expression.
1170 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001171 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001172 self.message(pprint.pformat(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001173 except:
1174 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001175
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001176 complete_print = _complete_expression
1177 complete_p = _complete_expression
1178 complete_pp = _complete_expression
1179
Tim Peters2344fae2001-01-15 00:50:52 +00001180 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001181 """l(ist) [first [,last] | .]
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001182
1183 List source code for the current file. Without arguments,
1184 list 11 lines around the current line or continue the previous
1185 listing. With . as argument, list 11 lines around the current
1186 line. With one argument, list 11 lines starting at that line.
1187 With two arguments, list the given range; if the second
1188 argument is less than the first, it is a count.
1189
1190 The current line in the current frame is indicated by "->".
1191 If an exception is being debugged, the line where the
1192 exception was originally raised or propagated is indicated by
1193 ">>", if it differs from the current line.
Georg Brandl0d089622010-07-30 16:00:46 +00001194 """
Tim Peters2344fae2001-01-15 00:50:52 +00001195 self.lastcmd = 'list'
1196 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001197 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001198 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001199 if ',' in arg:
1200 first, last = arg.split(',')
1201 first = int(first.strip())
1202 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001203 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001204 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001205 last = first + last
1206 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001207 first = int(arg.strip())
1208 first = max(1, first - 5)
1209 except ValueError:
1210 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001211 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001212 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001213 first = max(1, self.curframe.f_lineno - 5)
1214 else:
1215 first = self.lineno + 1
1216 if last is None:
1217 last = first + 10
1218 filename = self.curframe.f_code.co_filename
1219 breaklist = self.get_file_breaks(filename)
1220 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001221 lines = linecache.getlines(filename, self.curframe.f_globals)
1222 self._print_lines(lines[first-1:last], first, breaklist,
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001223 self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001224 self.lineno = min(last, len(lines))
1225 if len(lines) < last:
1226 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001227 except KeyboardInterrupt:
1228 pass
1229 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001230
Georg Brandle59ca2a2010-07-30 17:04:28 +00001231 def do_longlist(self, arg):
1232 """longlist | ll
1233 List the whole source code for the current function or frame.
1234 """
1235 filename = self.curframe.f_code.co_filename
1236 breaklist = self.get_file_breaks(filename)
1237 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001238 lines, lineno = getsourcelines(self.curframe)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001239 except OSError as err:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001240 self.error(err)
1241 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001242 self._print_lines(lines, lineno, breaklist, self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001243 do_ll = do_longlist
1244
1245 def do_source(self, arg):
1246 """source expression
1247 Try to get source code for the given object and display it.
1248 """
1249 try:
1250 obj = self._getval(arg)
1251 except:
1252 return
1253 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001254 lines, lineno = getsourcelines(obj)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001255 except (OSError, TypeError) 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)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001259
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001260 complete_source = _complete_expression
1261
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001262 def _print_lines(self, lines, start, breaks=(), frame=None):
Georg Brandle59ca2a2010-07-30 17:04:28 +00001263 """Print a range of lines."""
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001264 if frame:
1265 current_lineno = frame.f_lineno
1266 exc_lineno = self.tb_lineno.get(frame, -1)
1267 else:
1268 current_lineno = exc_lineno = -1
Georg Brandle59ca2a2010-07-30 17:04:28 +00001269 for lineno, line in enumerate(lines, start):
1270 s = str(lineno).rjust(3)
1271 if len(s) < 4:
1272 s += ' '
1273 if lineno in breaks:
1274 s += 'B'
1275 else:
1276 s += ' '
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001277 if lineno == current_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001278 s += '->'
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001279 elif lineno == exc_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001280 s += '>>'
1281 self.message(s + '\t' + line.rstrip())
1282
Tim Peters2344fae2001-01-15 00:50:52 +00001283 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001284 """whatis arg
1285 Print the type of the argument.
1286 """
Tim Peters2344fae2001-01-15 00:50:52 +00001287 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001288 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001289 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001290 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001291 return
1292 code = None
1293 # Is it a function?
Georg Brandl0d089622010-07-30 16:00:46 +00001294 try:
1295 code = value.__code__
1296 except Exception:
1297 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001298 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001299 self.message('Function %s' % code.co_name)
Tim Peters2344fae2001-01-15 00:50:52 +00001300 return
1301 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001302 try:
1303 code = value.__func__.__code__
1304 except Exception:
1305 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001306 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001307 self.message('Method %s' % code.co_name)
1308 return
1309 # Is it a class?
1310 if value.__class__ is type:
1311 self.message('Class %s.%s' % (value.__module__, value.__name__))
Tim Peters2344fae2001-01-15 00:50:52 +00001312 return
1313 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001314 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001315
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001316 complete_whatis = _complete_expression
1317
Georg Brandlcbc79c72010-12-04 16:21:42 +00001318 def do_display(self, arg):
1319 """display [expression]
1320
1321 Display the value of the expression if it changed, each time execution
1322 stops in the current frame.
1323
1324 Without expression, list all display expressions for the current frame.
1325 """
1326 if not arg:
1327 self.message('Currently displaying:')
1328 for item in self.displaying.get(self.curframe, {}).items():
1329 self.message('%s: %r' % item)
1330 else:
1331 val = self._getval_except(arg)
1332 self.displaying.setdefault(self.curframe, {})[arg] = val
1333 self.message('display %s: %r' % (arg, val))
1334
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001335 complete_display = _complete_expression
1336
Georg Brandlcbc79c72010-12-04 16:21:42 +00001337 def do_undisplay(self, arg):
1338 """undisplay [expression]
1339
1340 Do not display the expression any more in the current frame.
1341
1342 Without expression, clear all display expressions for the current frame.
1343 """
1344 if arg:
1345 try:
1346 del self.displaying.get(self.curframe, {})[arg]
1347 except KeyError:
1348 self.error('not displaying %s' % arg)
1349 else:
1350 self.displaying.pop(self.curframe, None)
1351
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001352 def complete_undisplay(self, text, line, begidx, endidx):
1353 return [e for e in self.displaying.get(self.curframe, {})
1354 if e.startswith(text)]
1355
Georg Brandl1acb7462010-12-04 11:20:26 +00001356 def do_interact(self, arg):
1357 """interact
1358
Ezio Melotti30b9d5d2013-08-17 15:50:46 +03001359 Start an interactive interpreter whose global namespace
Georg Brandl1acb7462010-12-04 11:20:26 +00001360 contains all the (global and local) names found in the current scope.
1361 """
1362 ns = self.curframe.f_globals.copy()
1363 ns.update(self.curframe_locals)
1364 code.interact("*interactive*", local=ns)
1365
Tim Peters2344fae2001-01-15 00:50:52 +00001366 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001367 """alias [name [command [parameter parameter ...] ]]
1368 Create an alias called 'name' that executes 'command'. The
1369 command must *not* be enclosed in quotes. Replaceable
1370 parameters can be indicated by %1, %2, and so on, while %* is
1371 replaced by all the parameters. If no command is given, the
1372 current alias for name is shown. If no name is given, all
1373 aliases are listed.
1374
1375 Aliases may be nested and can contain anything that can be
1376 legally typed at the pdb prompt. Note! You *can* override
1377 internal pdb commands with aliases! Those internal commands
1378 are then hidden until the alias is removed. Aliasing is
1379 recursively applied to the first word of the command line; all
1380 other words in the line are left alone.
1381
1382 As an example, here are two useful aliases (especially when
1383 placed in the .pdbrc file):
1384
1385 # Print instance variables (usage "pi classInst")
R David Murray78d692f2013-10-10 17:23:26 -04001386 alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
Georg Brandl0d089622010-07-30 16:00:46 +00001387 # Print instance variables in self
1388 alias ps pi self
1389 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001390 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001391 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001392 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001393 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001394 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001395 return
Guido van Rossum08454592002-07-12 13:10:53 +00001396 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001397 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001398 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001399 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001400
Tim Peters2344fae2001-01-15 00:50:52 +00001401 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001402 """unalias name
1403 Delete the specified alias.
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: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001407 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001408 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001409
Georg Brandl4c7c3c52012-03-10 22:36:48 +01001410 def complete_unalias(self, text, line, begidx, endidx):
1411 return [a for a in self.aliases if a.startswith(text)]
1412
Georg Brandl0d089622010-07-30 16:00:46 +00001413 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001414 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1415 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001416
Tim Peters2344fae2001-01-15 00:50:52 +00001417 # Print a traceback starting at the top stack frame.
1418 # The most recently entered frame is printed last;
1419 # this is different from dbx and gdb, but consistent with
1420 # the Python interpreter's stack trace.
1421 # It is also consistent with the up/down commands (which are
1422 # compatible with dbx and gdb: up moves towards 'main()'
1423 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001424
Tim Peters2344fae2001-01-15 00:50:52 +00001425 def print_stack_trace(self):
1426 try:
1427 for frame_lineno in self.stack:
1428 self.print_stack_entry(frame_lineno)
1429 except KeyboardInterrupt:
1430 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001431
Tim Peters2344fae2001-01-15 00:50:52 +00001432 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1433 frame, lineno = frame_lineno
1434 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001435 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001436 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001437 prefix = ' '
1438 self.message(prefix +
1439 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001440
Georg Brandl0d089622010-07-30 16:00:46 +00001441 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001442
Georg Brandl0d089622010-07-30 16:00:46 +00001443 def do_help(self, arg):
1444 """h(elp)
1445 Without argument, print the list of available commands.
1446 With a command name as argument, print help about that command.
1447 "help pdb" shows the full pdb documentation.
1448 "help exec" gives help on the ! command.
1449 """
1450 if not arg:
1451 return cmd.Cmd.do_help(self, arg)
1452 try:
1453 try:
1454 topic = getattr(self, 'help_' + arg)
1455 return topic()
1456 except AttributeError:
1457 command = getattr(self, 'do_' + arg)
1458 except AttributeError:
1459 self.error('No help for %r' % arg)
1460 else:
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001461 if sys.flags.optimize >= 2:
1462 self.error('No help for %r; please do not run Python with -OO '
1463 'if you need command help' % arg)
1464 return
Georg Brandl0d089622010-07-30 16:00:46 +00001465 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001466
Georg Brandl0d089622010-07-30 16:00:46 +00001467 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001468
Tim Peters2344fae2001-01-15 00:50:52 +00001469 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001470 """(!) statement
1471 Execute the (one-line) statement in the context of the current
1472 stack frame. The exclamation point can be omitted unless the
1473 first word of the statement resembles a debugger command. To
1474 assign to a global variable you must always prefix the command
1475 with a 'global' command, e.g.:
1476 (Pdb) global list_options; list_options = ['-l']
1477 (Pdb)
1478 """
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001479 self.message((self.help_exec.__doc__ or '').strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001480
Tim Peters2344fae2001-01-15 00:50:52 +00001481 def help_pdb(self):
1482 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001483
Georg Brandl0d089622010-07-30 16:00:46 +00001484 # other helper functions
1485
Tim Peters2344fae2001-01-15 00:50:52 +00001486 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001487 """Helper function for break/clear parsing -- may be overridden.
1488
1489 lookupmodule() translates (possibly incomplete) file or module name
1490 into an absolute file name.
1491 """
1492 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001493 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001494 f = os.path.join(sys.path[0], filename)
1495 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1496 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001497 root, ext = os.path.splitext(filename)
1498 if ext == '':
1499 filename = filename + '.py'
1500 if os.path.isabs(filename):
1501 return filename
1502 for dirname in sys.path:
1503 while os.path.islink(dirname):
1504 dirname = os.readlink(dirname)
1505 fullname = os.path.join(dirname, filename)
1506 if os.path.exists(fullname):
1507 return fullname
1508 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001509
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001510 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001511 # The script has to run in __main__ namespace (or imports from
1512 # __main__ will break).
1513 #
1514 # So we clear up the __main__ and set several special variables
1515 # (this gets rid of pdb's globals and cleans old variables on restarts).
1516 import __main__
1517 __main__.__dict__.clear()
1518 __main__.__dict__.update({"__name__" : "__main__",
1519 "__file__" : filename,
1520 "__builtins__": __builtins__,
1521 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001522
1523 # When bdb sets tracing, a number of call and line events happens
1524 # BEFORE debugger even reaches user's code (and the exact sequence of
1525 # events depends on python version). So we take special measures to
1526 # avoid stopping before we reach the main script (see user_line and
1527 # user_call for details).
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001528 self._wait_for_mainpyfile = True
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001529 self.mainpyfile = self.canonic(filename)
Georg Brandlac9a2bb2010-11-29 20:19:15 +00001530 self._user_requested_quit = False
Georg Brandld07ac642009-08-13 07:50:57 +00001531 with open(filename, "rb") as fp:
1532 statement = "exec(compile(%r, %r, 'exec'))" % \
1533 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001534 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001535
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001536# Collect all command help into docstring, if not run with -OO
Georg Brandl0d089622010-07-30 16:00:46 +00001537
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001538if __doc__ is not None:
1539 # unfortunately we can't guess this order from the class definition
1540 _help_order = [
1541 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1542 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
1543 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
R David Murray78d692f2013-10-10 17:23:26 -04001544 'args', 'p', 'pp', 'whatis', 'source', 'display', 'undisplay',
Georg Brandlcbc79c72010-12-04 16:21:42 +00001545 'interact', 'alias', 'unalias', 'debug', 'quit',
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001546 ]
Georg Brandl0d089622010-07-30 16:00:46 +00001547
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001548 for _command in _help_order:
1549 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1550 __doc__ += Pdb.help_exec.__doc__
Georg Brandl0d089622010-07-30 16:00:46 +00001551
Georg Brandl9e7dbc82010-10-14 07:14:31 +00001552 del _help_order, _command
1553
Georg Brandl0d089622010-07-30 16:00:46 +00001554
Guido van Rossum35771131992-09-08 11:59:04 +00001555# Simplified interface
1556
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001557def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001558 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001559
1560def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001561 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001562
1563def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001564 # B/W compatibility
1565 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001566
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001567def runcall(*args, **kwds):
1568 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001569
Guido van Rossumb6775db1994-08-01 11:34:53 +00001570def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001571 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001572
1573# Post-Mortem interface
1574
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001575def post_mortem(t=None):
1576 # handling the default
1577 if t is None:
1578 # sys.exc_info() returns (type, value, traceback) if an exception is
1579 # being handled, otherwise it returns None
1580 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001581 if t is None:
1582 raise ValueError("A valid traceback must be passed if no "
1583 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001584
Tim Peters2344fae2001-01-15 00:50:52 +00001585 p = Pdb()
1586 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001587 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001588
1589def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001590 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001591
1592
1593# Main program for testing
1594
Guido van Rossum23efba41992-01-27 16:58:47 +00001595TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001596
Guido van Rossum921c8241992-01-10 14:54:42 +00001597def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001598 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001599
1600# print help
1601def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001602 import pydoc
1603 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001604
Georg Brandle0230912010-07-30 08:29:39 +00001605_usage = """\
1606usage: pdb.py [-c command] ... pyfile [arg] ...
1607
1608Debug the Python program given by pyfile.
1609
1610Initial commands are read from .pdbrc files in your home directory
1611and in the current directory, if they exist. Commands supplied with
1612-c are executed after commands from .pdbrc files.
1613
1614To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001615To let the script run up to a given line X in the debugged file, use
1616"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001617
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001618def main():
Georg Brandle0230912010-07-30 08:29:39 +00001619 import getopt
1620
1621 opts, args = getopt.getopt(sys.argv[1:], 'hc:', ['--help', '--command='])
1622
1623 if not args:
1624 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001625 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001626
Georg Brandle0230912010-07-30 08:29:39 +00001627 commands = []
1628 for opt, optarg in opts:
1629 if opt in ['-h', '--help']:
1630 print(_usage)
1631 sys.exit()
1632 elif opt in ['-c', '--command']:
1633 commands.append(optarg)
1634
1635 mainpyfile = args[0] # Get script filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001636 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001637 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001638 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001639
Georg Brandle0230912010-07-30 08:29:39 +00001640 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001641
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001642 # Replace pdb's dir with script's dir in front of module search path.
1643 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001644
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001645 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1646 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001647 # changed by the user from the command line. There is a "restart" command
1648 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001649 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001650 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001651 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001652 try:
1653 pdb._runscript(mainpyfile)
1654 if pdb._user_requested_quit:
1655 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001656 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001657 except Restart:
1658 print("Restarting", mainpyfile, "with arguments:")
Georg Brandle0230912010-07-30 08:29:39 +00001659 print("\t" + " ".join(args))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001660 except SystemExit:
1661 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001662 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001663 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001664 except:
1665 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001666 print("Uncaught exception. Entering post mortem debugging")
1667 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001668 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001669 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001670 print("Post mortem debugger finished. The " + mainpyfile +
1671 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001672
1673
1674# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675if __name__ == '__main__':
1676 import pdb
1677 pdb.main()