blob: 83ff585c6138940be944f26c9d91159ec7a0e38c [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
Guido van Rossum921c8241992-01-10 14:54:42 +000069import sys
70import linecache
Guido van Rossum23efba41992-01-27 16:58:47 +000071import cmd
72import bdb
Georg Brandl0a9c3e92010-07-30 18:46:38 +000073import dis
Guido van Rossumb5699c71998-07-20 23:13:54 +000074import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000075import re
Georg Brandl0a9c3e92010-07-30 18:46:38 +000076import code
Barry Warsaw210bd202002-11-05 22:40:20 +000077import pprint
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000078import traceback
Georg Brandle59ca2a2010-07-30 17:04:28 +000079import inspect
80import types
Guido van Rossumd8faa362007-04-27 19:54:29 +000081
82
83class Restart(Exception):
84 """Causes a debugger to be restarted for the debugged python program."""
85 pass
86
Skip Montanaro352674d2001-02-07 23:14:30 +000087__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
88 "post_mortem", "help"]
89
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000090def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000091 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000092 try:
93 fp = open(filename)
94 except IOError:
95 return None
96 # consumer of this info expects the first line to be 1
97 lineno = 1
98 answer = None
99 while 1:
100 line = fp.readline()
101 if line == '':
102 break
103 if cre.match(line):
104 answer = funcname, filename, lineno
105 break
106 lineno = lineno + 1
107 fp.close()
108 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +0000109
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000110def getsourcelines(obj):
111 lines, lineno = inspect.findsource(obj)
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000112 if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000113 # must be a module frame: do not try to cut a block out of it
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000114 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000115 elif inspect.ismodule(obj):
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000116 return lines, 1
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000117 return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum921c8241992-01-10 14:54:42 +0000118
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000119def lasti2lineno(code, lasti):
120 linestarts = list(dis.findlinestarts(code))
121 linestarts.reverse()
122 for i, lineno in linestarts:
123 if lasti >= i:
124 return lineno
125 return 0
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 Brandl243ad662009-05-05 09:00:19 +0000137 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
138 bdb.Bdb.__init__(self, skip=skip)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000139 cmd.Cmd.__init__(self, completekey, stdin, stdout)
140 if stdout:
141 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000142 self.prompt = '(Pdb) '
143 self.aliases = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 self.mainpyfile = ''
145 self._wait_for_mainpyfile = 0
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000146 self.tb_lineno = {}
Tim Peters2344fae2001-01-15 00:50:52 +0000147 # Try to load readline if it exists
148 try:
149 import readline
150 except ImportError:
151 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000152
Tim Peters2344fae2001-01-15 00:50:52 +0000153 # Read $HOME/.pdbrc and ./.pdbrc
154 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +0000155 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +0000156 envHome = os.environ['HOME']
157 try:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000158 with open(os.path.join(envHome, ".pdbrc")) as rcFile:
159 self.rcLines.extend(rcFile)
Tim Peters2344fae2001-01-15 00:50:52 +0000160 except IOError:
161 pass
Tim Peters2344fae2001-01-15 00:50:52 +0000162 try:
Florent Xicluna7dde7922010-09-03 19:52:03 +0000163 with open(".pdbrc") as rcFile:
164 self.rcLines.extend(rcFile)
Tim Peters2344fae2001-01-15 00:50:52 +0000165 except IOError:
166 pass
Guido van Rossum23efba41992-01-27 16:58:47 +0000167
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000168 self.commands = {} # associates a command list to breakpoint numbers
Benjamin Petersond23f8222009-04-05 19:13:16 +0000169 self.commands_doprompt = {} # for each bp num, tells if the prompt
170 # must be disp. after execing the cmd list
171 self.commands_silent = {} # for each bp num, tells if the stack trace
172 # must be disp. after execing the cmd list
173 self.commands_defining = False # True while in the process of defining
174 # a command list
175 self.commands_bnum = None # The breakpoint number for which we are
176 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000177
Tim Peters2344fae2001-01-15 00:50:52 +0000178 def reset(self):
179 bdb.Bdb.reset(self)
180 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000181
Tim Peters2344fae2001-01-15 00:50:52 +0000182 def forget(self):
183 self.lineno = None
184 self.stack = []
185 self.curindex = 0
186 self.curframe = None
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000187 self.tb_lineno.clear()
Guido van Rossum2424f851998-09-11 22:50:09 +0000188
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000189 def setup(self, f, tb):
Tim Peters2344fae2001-01-15 00:50:52 +0000190 self.forget()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000191 self.stack, self.curindex = self.get_stack(f, tb)
192 while tb:
193 # when setting up post-mortem debugging with a traceback, save all
194 # the original line numbers to be displayed along the current line
195 # numbers (which can be different, e.g. due to finally clauses)
196 lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
197 self.tb_lineno[tb.tb_frame] = lineno
198 tb = tb.tb_next
Tim Peters2344fae2001-01-15 00:50:52 +0000199 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000200 # The f_locals dictionary is updated from the actual frame
201 # locals whenever the .f_locals accessor is called, so we
202 # cache it here to ensure that modifications are not overwritten.
203 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000204 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205
Tim Peters2344fae2001-01-15 00:50:52 +0000206 # Can be executed earlier than 'setup' if desired
207 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000208 if not self.rcLines:
209 return
210 # local copy because of recursion
211 rcLines = self.rcLines
212 rcLines.reverse()
213 # execute every line only once
214 self.rcLines = []
215 while rcLines:
216 line = rcLines.pop().strip()
217 if line and line[0] != '#':
218 if self.onecmd(line):
219 # if onecmd returns True, the command wants to exit
220 # from the interaction, save leftover rc lines
221 # to execute before next interaction
222 self.rcLines += reversed(rcLines)
223 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000224
Tim Peters280488b2002-08-23 18:19:30 +0000225 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000226
227 def user_call(self, frame, argument_list):
228 """This method is called when there is the remote possibility
229 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000230 if self._wait_for_mainpyfile:
231 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000232 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000233 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000234 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000235
Tim Peters2344fae2001-01-15 00:50:52 +0000236 def user_line(self, frame):
237 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000238 if self._wait_for_mainpyfile:
239 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
240 or frame.f_lineno<= 0):
241 return
242 self._wait_for_mainpyfile = 0
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000243 if self.bp_commands(frame):
244 self.interaction(frame, None)
245
Georg Brandle0230912010-07-30 08:29:39 +0000246 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000247 """Call every command that was set for the current active breakpoint
248 (if there is one).
249
250 Returns True if the normal interaction function must be called,
251 False otherwise."""
252 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
253 if getattr(self, "currentbp", False) and \
254 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000255 currentbp = self.currentbp
256 self.currentbp = 0
257 lastcmd_back = self.lastcmd
258 self.setup(frame, None)
259 for line in self.commands[currentbp]:
260 self.onecmd(line)
261 self.lastcmd = lastcmd_back
262 if not self.commands_silent[currentbp]:
263 self.print_stack_entry(self.stack[self.curindex])
264 if self.commands_doprompt[currentbp]:
265 self.cmdloop()
266 self.forget()
267 return
268 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000269
Tim Peters2344fae2001-01-15 00:50:52 +0000270 def user_return(self, frame, return_value):
271 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000272 if self._wait_for_mainpyfile:
273 return
Tim Peters2344fae2001-01-15 00:50:52 +0000274 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000275 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000276 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000277
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000278 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000279 """This function is called if an exception occurs,
280 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000281 if self._wait_for_mainpyfile:
282 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000283 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000284 frame.f_locals['__exception__'] = exc_type, exc_value
Georg Brandl0d089622010-07-30 16:00:46 +0000285 self.message(traceback.format_exception_only(exc_type,
286 exc_value)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000287 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000288
Tim Peters2344fae2001-01-15 00:50:52 +0000289 # General interaction function
290
291 def interaction(self, frame, traceback):
Georg Brandle0230912010-07-30 08:29:39 +0000292 if self.setup(frame, traceback):
293 # no interaction desired at this time (happens if .pdbrc contains
294 # a command like "continue")
295 self.forget()
296 return
Tim Peters2344fae2001-01-15 00:50:52 +0000297 self.print_stack_entry(self.stack[self.curindex])
298 self.cmdloop()
299 self.forget()
300
Benjamin Petersond23f8222009-04-05 19:13:16 +0000301 def displayhook(self, obj):
302 """Custom displayhook for the exec in default(), which prevents
303 assignment of the _ variable in the builtins.
304 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000305 # reproduce the behavior of the standard displayhook, not printing None
306 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000307 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000308
Tim Peters2344fae2001-01-15 00:50:52 +0000309 def default(self, line):
310 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000311 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000312 globals = self.curframe.f_globals
313 try:
314 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000315 save_stdout = sys.stdout
316 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000317 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000318 try:
319 sys.stdin = self.stdin
320 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000321 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000322 exec(code, globals, locals)
323 finally:
324 sys.stdout = save_stdout
325 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000326 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000327 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000328 exc_info = sys.exc_info()[:2]
329 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000330
331 def precmd(self, line):
332 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000333 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000334 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000335 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000336 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000337 line = self.aliases[args[0]]
338 ii = 1
339 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000340 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000341 tmpArg)
342 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000343 line = line.replace("%*", ' '.join(args[1:]))
344 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000345 # split into ';;' separated commands
346 # unless it's an alias command
347 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000348 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000349 if marker >= 0:
350 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000351 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000352 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000353 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000354 return line
355
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000356 def onecmd(self, line):
357 """Interpret the argument as though it had been typed in response
358 to the prompt.
359
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000360 Checks whether this line is typed at the normal prompt or in
361 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000362 """
363 if not self.commands_defining:
364 return cmd.Cmd.onecmd(self, line)
365 else:
366 return self.handle_command_def(line)
367
Georg Brandlb90ffd82010-07-30 22:20:16 +0000368 def handle_command_def(self, line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000369 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000371 if not cmd:
372 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000373 if cmd == 'silent':
374 self.commands_silent[self.commands_bnum] = True
375 return # continue to handle other cmd def in the cmd list
376 elif cmd == 'end':
377 self.cmdqueue = []
378 return 1 # end of cmd list
379 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000380 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000381 cmdlist.append(cmd+' '+arg)
382 else:
383 cmdlist.append(cmd)
384 # Determine if we must stop
385 try:
386 func = getattr(self, 'do_' + cmd)
387 except AttributeError:
388 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000389 # one of the resuming commands
390 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000391 self.commands_doprompt[self.commands_bnum] = False
392 self.cmdqueue = []
393 return 1
394 return
395
Georg Brandl0d089622010-07-30 16:00:46 +0000396 # interface abstraction functions
397
398 def message(self, msg):
399 print(msg, file=self.stdout)
400
401 def error(self, msg):
402 print('***', msg, file=self.stdout)
403
Tim Peters2344fae2001-01-15 00:50:52 +0000404 # Command definitions, called by cmdloop()
405 # The argument is the remaining string on the command line
406 # Return true to exit from the command loop
407
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000408 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000409 """commands [bpnumber]
410 (com) ...
411 (com) end
412 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000413
Georg Brandl0d089622010-07-30 16:00:46 +0000414 Specify a list of commands for breakpoint number bpnumber.
415 The commands themselves are entered on the following lines.
416 Type a line containing just 'end' to terminate the commands.
417 The commands are executed when the breakpoint is hit.
418
419 To remove all commands from a breakpoint, type commands and
420 follow it immediately with end; that is, give no commands.
421
422 With no bpnumber argument, commands refers to the last
423 breakpoint set.
424
425 You can use breakpoint commands to start your program up
426 again. Simply use the continue command, or step, or any other
427 command that resumes execution.
428
429 Specifying any command resuming execution (currently continue,
430 step, next, return, jump, quit and their abbreviations)
431 terminates the command list (as if that command was
432 immediately followed by end). This is because any time you
433 resume execution (even with a simple next or step), you may
434 encounter another breakpoint -- which could have its own
435 command list, leading to ambiguities about which list to
436 execute.
437
438 If you use the 'silent' command in the command list, the usual
439 message about stopping at a breakpoint is not printed. This
440 may be desirable for breakpoints that are to print a specific
441 message and then continue. If none of the other commands
442 print anything, you will see no sign that the breakpoint was
443 reached.
444 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000445 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000446 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000447 else:
448 try:
449 bnum = int(arg)
450 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000451 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000452 return
453 self.commands_bnum = bnum
Georg Brandlb90ffd82010-07-30 22:20:16 +0000454 # Save old definitions for the case of a keyboard interrupt.
455 if bnum in self.commands:
456 old_command_defs = (self.commands[bnum],
457 self.commands_doprompt[bnum],
458 self.commands_silent[bnum])
459 else:
460 old_command_defs = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000461 self.commands[bnum] = []
462 self.commands_doprompt[bnum] = True
463 self.commands_silent[bnum] = False
Georg Brandlb90ffd82010-07-30 22:20:16 +0000464
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000465 prompt_back = self.prompt
466 self.prompt = '(com) '
467 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000468 try:
469 self.cmdloop()
Georg Brandlb90ffd82010-07-30 22:20:16 +0000470 except KeyboardInterrupt:
471 # Restore old definitions.
472 if old_command_defs:
473 self.commands[bnum] = old_command_defs[0]
474 self.commands_doprompt[bnum] = old_command_defs[1]
475 self.commands_silent[bnum] = old_command_defs[2]
476 else:
477 del self.commands[bnum]
478 del self.commands_doprompt[bnum]
479 del self.commands_silent[bnum]
480 self.error('command definition aborted, old commands restored')
Georg Brandl44f8bf92010-07-30 08:54:49 +0000481 finally:
482 self.commands_defining = False
483 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000484
Tim Peters2344fae2001-01-15 00:50:52 +0000485 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000486 """b(reak) [ ([filename:]lineno | function) [, condition] ]
487 Without argument, list all breaks.
488
489 With a line number argument, set a break at this line in the
490 current file. With a function name, set a break at the first
491 executable line of that function. If a second argument is
492 present, it is a string specifying an expression which must
493 evaluate to true before the breakpoint is honored.
494
495 The line number may be prefixed with a filename and a colon,
496 to specify a breakpoint in another file (probably one that
497 hasn't been loaded yet). The file is searched for on
498 sys.path; the .py suffix may be omitted.
499 """
Tim Peters2344fae2001-01-15 00:50:52 +0000500 if not arg:
501 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000502 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000503 for bp in bdb.Breakpoint.bpbynumber:
504 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000505 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000506 return
507 # parse arguments; comma has lowest precedence
508 # and cannot occur in filename
509 filename = None
510 lineno = None
511 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000512 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000513 if comma > 0:
514 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000515 cond = arg[comma+1:].lstrip()
516 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000517 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000518 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000519 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000520 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000521 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000522 f = self.lookupmodule(filename)
523 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000524 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000525 return
526 else:
527 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000528 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000529 try:
530 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000531 except ValueError as msg:
Georg Brandl0d089622010-07-30 16:00:46 +0000532 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000533 return
534 else:
535 # no colon; can be lineno or function
536 try:
537 lineno = int(arg)
538 except ValueError:
539 try:
540 func = eval(arg,
541 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000542 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000543 except:
544 func = arg
545 try:
Christian Heimesff737952007-11-27 10:40:20 +0000546 if hasattr(func, '__func__'):
547 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000548 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000549 #use co_name to identify the bkpt (function names
550 #could be aliased, but co_name is invariant)
551 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000552 lineno = code.co_firstlineno
553 filename = code.co_filename
554 except:
555 # last thing to try
556 (ok, filename, ln) = self.lineinfo(arg)
557 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000558 self.error('The specified object %r is not a function '
559 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000560 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000561 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000562 lineno = int(ln)
563 if not filename:
564 filename = self.defaultFile()
565 # Check for reasonable breakpoint
566 line = self.checkline(filename, lineno)
567 if line:
568 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000569 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000570 if err:
571 self.error(err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000572 else:
573 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000574 self.message("Breakpoint %d at %s:%d" %
575 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000576
577 # To be overridden in derived debuggers
578 def defaultFile(self):
579 """Produce a reasonable default."""
580 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000581 if filename == '<string>' and self.mainpyfile:
582 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000583 return filename
584
585 do_b = do_break
586
587 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000588 """tbreak [ ([filename:]lineno | function) [, condition] ]
589 Same arguments as break, but sets a temporary breakpoint: it
590 is automatically deleted when first hit.
591 """
Tim Peters2344fae2001-01-15 00:50:52 +0000592 self.do_break(arg, 1)
593
594 def lineinfo(self, identifier):
595 failed = (None, None, None)
596 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000597 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000598 if len(idstring) == 1:
599 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000600 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000601 elif len(idstring) == 3:
602 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000603 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000604 else:
605 return failed
606 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000607 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000608 # Protection for derived debuggers
609 if parts[0] == 'self':
610 del parts[0]
611 if len(parts) == 0:
612 return failed
613 # Best first guess at file to look at
614 fname = self.defaultFile()
615 if len(parts) == 1:
616 item = parts[0]
617 else:
618 # More than one part.
619 # First is module, second is method/class
620 f = self.lookupmodule(parts[0])
621 if f:
622 fname = f
623 item = parts[1]
624 answer = find_function(item, fname)
625 return answer or failed
626
627 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000628 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000629
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000630 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
631 line or EOF). Warning: testing is not comprehensive.
632 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000633 # this method should be callable before starting debugging, so default
634 # to "no globals" if there is no current frame
635 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
636 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000637 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000638 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000639 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000640 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000641 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000642 if (not line or (line[0] == '#') or
643 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000644 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000645 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000646 return lineno
647
648 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000649 """enable bpnumber [bpnumber ...]
650 Enables the breakpoints given as a space separated list of
651 breakpoint numbers.
652 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000653 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000654 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000655 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000656 bp = self.get_bpbynumber(i)
657 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000658 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000659 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000660 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000661 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000662
663 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000664 """disable bpnumber [bpnumber ...]
665 Disables the breakpoints given as a space separated list of
666 breakpoint numbers. Disabling a breakpoint means it cannot
667 cause the program to stop execution, but unlike clearing a
668 breakpoint, it remains in the list of breakpoints and can be
669 (re-)enabled.
670 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000671 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000672 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000673 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000674 bp = self.get_bpbynumber(i)
675 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000676 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000677 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000678 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000679 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000680
681 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000682 """condition bpnumber [condition]
683 Set a new condition for the breakpoint, an expression which
684 must evaluate to true before the breakpoint is honored. If
685 condition is absent, any existing condition is removed; i.e.,
686 the breakpoint is made unconditional.
687 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000688 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000689 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000690 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000691 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000692 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000693 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000694 bp = self.get_bpbynumber(args[0].strip())
695 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000696 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000697 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000698 bp.cond = cond
699 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000700 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000701 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000702 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000703
Georg Brandl7410dd12010-07-30 12:01:20 +0000704 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000705 """ignore bpnumber [count]
706 Set the ignore count for the given breakpoint number. If
707 count is omitted, the ignore count is set to 0. A breakpoint
708 becomes active when the ignore count is zero. When non-zero,
709 the count is decremented each time the breakpoint is reached
710 and the breakpoint is not disabled and any associated
711 condition evaluates to true.
712 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000713 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000714 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000715 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000716 except:
717 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000718 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000719 bp = self.get_bpbynumber(args[0].strip())
720 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000721 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000722 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000723 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000724 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000725 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000726 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000727 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000728 countstr = '1 crossing'
729 self.message('Will ignore next %s of breakpoint %d.' %
730 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000731 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000732 self.message('Will stop next time breakpoint %d is reached.'
733 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000734
735 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000736 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
737 With a space separated list of breakpoint numbers, clear
738 those breakpoints. Without argument, clear all breaks (but
739 first ask confirmation). With a filename:lineno argument,
740 clear all breaks at that line in that file.
741 """
Tim Peters2344fae2001-01-15 00:50:52 +0000742 if not arg:
743 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000744 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000745 except EOFError:
746 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000747 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000748 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000749 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000750 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000751 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000752 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000753 return
754 if ':' in arg:
755 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000756 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000757 filename = arg[:i]
758 arg = arg[i+1:]
759 try:
760 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000761 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000762 err = "Invalid line number (%s)" % arg
763 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000764 bplist = self.get_breaks(filename, lineno)
Tim Peters2344fae2001-01-15 00:50:52 +0000765 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000766 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000767 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000768 else:
769 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000770 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000771 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000772 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000773 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000774 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000775 bp = self.get_bpbynumber(i)
776 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000777 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000778 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000779 self.clear_break(bp.file, bp.line)
Georg Brandl0d089622010-07-30 16:00:46 +0000780 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000781 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
782
783 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000784 """w(here)
785 Print a stack trace, with the most recent frame at the bottom.
786 An arrow indicates the "current frame", which determines the
787 context of most commands. 'bt' is an alias for this command.
788 """
Tim Peters2344fae2001-01-15 00:50:52 +0000789 self.print_stack_trace()
790 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000791 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000792
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000793 def _select_frame(self, number):
794 assert 0 <= number < len(self.stack)
795 self.curindex = number
796 self.curframe = self.stack[self.curindex][0]
797 self.curframe_locals = self.curframe.f_locals
798 self.print_stack_entry(self.stack[self.curindex])
799 self.lineno = None
800
Tim Peters2344fae2001-01-15 00:50:52 +0000801 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000802 """u(p) [count]
803 Move the current frame count (default one) levels up in the
804 stack trace (to an older frame).
805 """
Tim Peters2344fae2001-01-15 00:50:52 +0000806 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000807 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000808 return
809 try:
810 count = int(arg or 1)
811 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000812 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000813 return
814 if count < 0:
815 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000816 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000817 newframe = max(0, self.curindex - count)
818 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000819 do_u = do_up
820
821 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000822 """d(own) [count]
823 Move the current frame count (default one) levels down in the
824 stack trace (to a newer frame).
825 """
Tim Peters2344fae2001-01-15 00:50:52 +0000826 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000827 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000828 return
829 try:
830 count = int(arg or 1)
831 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000832 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000833 return
834 if count < 0:
835 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000836 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000837 newframe = min(len(self.stack) - 1, self.curindex + count)
838 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000839 do_d = do_down
840
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000841 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000842 """unt(il) [lineno]
843 Without argument, continue execution until the line with a
844 number greater than the current one is reached. With a line
845 number, continue execution until a line with a number greater
846 or equal to that is reached. In both cases, also stop when
847 the current frame returns.
848 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000849 if arg:
850 try:
851 lineno = int(arg)
852 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000853 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000854 return
855 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000856 self.error('"until" line number is smaller than current '
857 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000858 return
859 else:
860 lineno = None
861 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000862 return 1
863 do_unt = do_until
864
Tim Peters2344fae2001-01-15 00:50:52 +0000865 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000866 """s(tep)
867 Execute the current line, stop at the first possible occasion
868 (either in a function that is called or in the current
869 function).
870 """
Tim Peters2344fae2001-01-15 00:50:52 +0000871 self.set_step()
872 return 1
873 do_s = do_step
874
875 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000876 """n(ext)
877 Continue execution until the next line in the current function
878 is reached or it returns.
879 """
Tim Peters2344fae2001-01-15 00:50:52 +0000880 self.set_next(self.curframe)
881 return 1
882 do_n = do_next
883
Guido van Rossumd8faa362007-04-27 19:54:29 +0000884 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000885 """run [args...]
886 Restart the debugged python program. If a string is supplied
887 it is splitted with "shlex", and the result is used as the new
888 sys.argv. History, breakpoints, actions and debugger options
889 are preserved. "restart" is an alias for "run".
890 """
Guido van Rossumd8faa362007-04-27 19:54:29 +0000891 if arg:
892 import shlex
893 argv0 = sys.argv[0:1]
894 sys.argv = shlex.split(arg)
895 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +0000896 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +0000897 raise Restart
898
899 do_restart = do_run
900
Tim Peters2344fae2001-01-15 00:50:52 +0000901 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000902 """r(eturn)
903 Continue execution until the current function returns.
904 """
Tim Peters2344fae2001-01-15 00:50:52 +0000905 self.set_return(self.curframe)
906 return 1
907 do_r = do_return
908
909 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000910 """c(ont(inue))
911 Continue execution, only stop when a breakpoint is encountered.
912 """
Tim Peters2344fae2001-01-15 00:50:52 +0000913 self.set_continue()
914 return 1
915 do_c = do_cont = do_continue
916
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000917 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000918 """j(ump) lineno
919 Set the next line that will be executed. Only available in
920 the bottom-most frame. This lets you jump back and execute
921 code again, or jump forward to skip code that you don't want
922 to run.
923
924 It should be noted that not all jumps are allowed -- for
925 instance it is not possible to jump into the middle of a
926 for loop or out of a finally clause.
927 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000928 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000929 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000930 return
931 try:
932 arg = int(arg)
933 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000934 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000935 else:
936 try:
937 # Do the jump, fix up our copy of the stack, and display the
938 # new position
939 self.curframe.f_lineno = arg
940 self.stack[self.curindex] = self.stack[self.curindex][0], arg
941 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000942 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +0000943 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000944 do_j = do_jump
945
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000946 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000947 """debug code
948 Enter a recursive debugger that steps through the code
949 argument (which is an arbitrary expression or statement to be
950 executed in the current environment).
951 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000952 sys.settrace(None)
953 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +0000954 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000955 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000956 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +0000957 self.message("ENTERING RECURSIVE DEBUGGER")
Guido van Rossumed538d82003-04-09 19:36:34 +0000958 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl0d089622010-07-30 16:00:46 +0000959 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000960 sys.settrace(self.trace_dispatch)
961 self.lastcmd = p.lastcmd
962
Tim Peters2344fae2001-01-15 00:50:52 +0000963 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000964 """q(uit)\nexit
965 Quit from the debugger. The program being executed is aborted.
966 """
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000967 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000968 self.set_quit()
969 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000970
Tim Peters2344fae2001-01-15 00:50:52 +0000971 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000972 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000973
Guido van Rossumeef26072003-01-13 21:13:55 +0000974 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000975 """EOF
976 Handles the receipt of EOF as a command.
977 """
978 self.message('')
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000979 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000980 self.set_quit()
981 return 1
982
Tim Peters2344fae2001-01-15 00:50:52 +0000983 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000984 """a(rgs)
985 Print the argument list of the current function.
986 """
Benjamin Petersond23f8222009-04-05 19:13:16 +0000987 co = self.curframe.f_code
988 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000989 n = co.co_argcount
990 if co.co_flags & 4: n = n+1
991 if co.co_flags & 8: n = n+1
992 for i in range(n):
993 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +0000994 if name in dict:
995 self.message('%s = %r' % (name, dict[name]))
996 else:
997 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +0000998 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000999
Tim Peters2344fae2001-01-15 00:50:52 +00001000 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001001 """retval
1002 Print the return value for the last return of a function.
1003 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001004 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +00001005 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +00001006 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001007 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +00001008 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +00001009
Barry Warsaw210bd202002-11-05 22:40:20 +00001010 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +00001011 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +00001012 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +00001013 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001014 exc_info = sys.exc_info()[:2]
1015 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Barry Warsaw210bd202002-11-05 22:40:20 +00001016 raise
Guido van Rossum2424f851998-09-11 22:50:09 +00001017
Barry Warsaw210bd202002-11-05 22:40:20 +00001018 def do_p(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001019 """p(rint) expression
1020 Print the value of the expression.
1021 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001022 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001023 self.message(repr(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001024 except:
1025 pass
Georg Brandlc9879242007-09-04 07:07:56 +00001026 # make "print" an alias of "p" since print isn't a Python statement anymore
1027 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +00001028
1029 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001030 """pp expression
1031 Pretty-print the value of the expression.
1032 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001033 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001034 self.message(pprint.pformat(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001035 except:
1036 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001037
Tim Peters2344fae2001-01-15 00:50:52 +00001038 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001039 """l(ist) [first [,last] | .]
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001040
1041 List source code for the current file. Without arguments,
1042 list 11 lines around the current line or continue the previous
1043 listing. With . as argument, list 11 lines around the current
1044 line. With one argument, list 11 lines starting at that line.
1045 With two arguments, list the given range; if the second
1046 argument is less than the first, it is a count.
1047
1048 The current line in the current frame is indicated by "->".
1049 If an exception is being debugged, the line where the
1050 exception was originally raised or propagated is indicated by
1051 ">>", if it differs from the current line.
Georg Brandl0d089622010-07-30 16:00:46 +00001052 """
Tim Peters2344fae2001-01-15 00:50:52 +00001053 self.lastcmd = 'list'
1054 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001055 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001056 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001057 if ',' in arg:
1058 first, last = arg.split(',')
1059 first = int(first.strip())
1060 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001061 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001062 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001063 last = first + last
1064 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001065 first = int(arg.strip())
1066 first = max(1, first - 5)
1067 except ValueError:
1068 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001069 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001070 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001071 first = max(1, self.curframe.f_lineno - 5)
1072 else:
1073 first = self.lineno + 1
1074 if last is None:
1075 last = first + 10
1076 filename = self.curframe.f_code.co_filename
1077 breaklist = self.get_file_breaks(filename)
1078 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001079 lines = linecache.getlines(filename, self.curframe.f_globals)
1080 self._print_lines(lines[first-1:last], first, breaklist,
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001081 self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001082 self.lineno = min(last, len(lines))
1083 if len(lines) < last:
1084 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001085 except KeyboardInterrupt:
1086 pass
1087 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001088
Georg Brandle59ca2a2010-07-30 17:04:28 +00001089 def do_longlist(self, arg):
1090 """longlist | ll
1091 List the whole source code for the current function or frame.
1092 """
1093 filename = self.curframe.f_code.co_filename
1094 breaklist = self.get_file_breaks(filename)
1095 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001096 lines, lineno = getsourcelines(self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001097 except IOError as err:
1098 self.error(err)
1099 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001100 self._print_lines(lines, lineno, breaklist, self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001101 do_ll = do_longlist
1102
1103 def do_source(self, arg):
1104 """source expression
1105 Try to get source code for the given object and display it.
1106 """
1107 try:
1108 obj = self._getval(arg)
1109 except:
1110 return
1111 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001112 lines, lineno = getsourcelines(obj)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001113 except (IOError, TypeError) as err:
1114 self.error(err)
1115 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001116 self._print_lines(lines, lineno)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001117
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001118 def _print_lines(self, lines, start, breaks=(), frame=None):
Georg Brandle59ca2a2010-07-30 17:04:28 +00001119 """Print a range of lines."""
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001120 if frame:
1121 current_lineno = frame.f_lineno
1122 exc_lineno = self.tb_lineno.get(frame, -1)
1123 else:
1124 current_lineno = exc_lineno = -1
Georg Brandle59ca2a2010-07-30 17:04:28 +00001125 for lineno, line in enumerate(lines, start):
1126 s = str(lineno).rjust(3)
1127 if len(s) < 4:
1128 s += ' '
1129 if lineno in breaks:
1130 s += 'B'
1131 else:
1132 s += ' '
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001133 if lineno == current_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001134 s += '->'
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001135 elif lineno == exc_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001136 s += '>>'
1137 self.message(s + '\t' + line.rstrip())
1138
Tim Peters2344fae2001-01-15 00:50:52 +00001139 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001140 """whatis arg
1141 Print the type of the argument.
1142 """
Tim Peters2344fae2001-01-15 00:50:52 +00001143 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001144 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001145 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001146 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001147 return
1148 code = None
1149 # Is it a function?
Georg Brandl0d089622010-07-30 16:00:46 +00001150 try:
1151 code = value.__code__
1152 except Exception:
1153 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001154 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001155 self.message('Function %s' % code.co_name)
Tim Peters2344fae2001-01-15 00:50:52 +00001156 return
1157 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001158 try:
1159 code = value.__func__.__code__
1160 except Exception:
1161 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001162 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001163 self.message('Method %s' % code.co_name)
1164 return
1165 # Is it a class?
1166 if value.__class__ is type:
1167 self.message('Class %s.%s' % (value.__module__, value.__name__))
Tim Peters2344fae2001-01-15 00:50:52 +00001168 return
1169 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001170 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001171
Tim Peters2344fae2001-01-15 00:50:52 +00001172 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001173 """alias [name [command [parameter parameter ...] ]]
1174 Create an alias called 'name' that executes 'command'. The
1175 command must *not* be enclosed in quotes. Replaceable
1176 parameters can be indicated by %1, %2, and so on, while %* is
1177 replaced by all the parameters. If no command is given, the
1178 current alias for name is shown. If no name is given, all
1179 aliases are listed.
1180
1181 Aliases may be nested and can contain anything that can be
1182 legally typed at the pdb prompt. Note! You *can* override
1183 internal pdb commands with aliases! Those internal commands
1184 are then hidden until the alias is removed. Aliasing is
1185 recursively applied to the first word of the command line; all
1186 other words in the line are left alone.
1187
1188 As an example, here are two useful aliases (especially when
1189 placed in the .pdbrc file):
1190
1191 # Print instance variables (usage "pi classInst")
1192 alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
1193 # Print instance variables in self
1194 alias ps pi self
1195 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001196 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001197 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001198 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001199 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001200 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001201 return
Guido van Rossum08454592002-07-12 13:10:53 +00001202 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001203 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001204 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001205 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001206
Tim Peters2344fae2001-01-15 00:50:52 +00001207 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001208 """unalias name
1209 Delete the specified alias.
1210 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001211 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001212 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001213 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001214 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001215
Georg Brandl0d089622010-07-30 16:00:46 +00001216 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001217 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1218 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001219
Tim Peters2344fae2001-01-15 00:50:52 +00001220 # Print a traceback starting at the top stack frame.
1221 # The most recently entered frame is printed last;
1222 # this is different from dbx and gdb, but consistent with
1223 # the Python interpreter's stack trace.
1224 # It is also consistent with the up/down commands (which are
1225 # compatible with dbx and gdb: up moves towards 'main()'
1226 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001227
Tim Peters2344fae2001-01-15 00:50:52 +00001228 def print_stack_trace(self):
1229 try:
1230 for frame_lineno in self.stack:
1231 self.print_stack_entry(frame_lineno)
1232 except KeyboardInterrupt:
1233 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001234
Tim Peters2344fae2001-01-15 00:50:52 +00001235 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1236 frame, lineno = frame_lineno
1237 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001238 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001239 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001240 prefix = ' '
1241 self.message(prefix +
1242 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001243
Georg Brandl0d089622010-07-30 16:00:46 +00001244 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001245
Georg Brandl0d089622010-07-30 16:00:46 +00001246 def do_help(self, arg):
1247 """h(elp)
1248 Without argument, print the list of available commands.
1249 With a command name as argument, print help about that command.
1250 "help pdb" shows the full pdb documentation.
1251 "help exec" gives help on the ! command.
1252 """
1253 if not arg:
1254 return cmd.Cmd.do_help(self, arg)
1255 try:
1256 try:
1257 topic = getattr(self, 'help_' + arg)
1258 return topic()
1259 except AttributeError:
1260 command = getattr(self, 'do_' + arg)
1261 except AttributeError:
1262 self.error('No help for %r' % arg)
1263 else:
1264 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001265
Georg Brandl0d089622010-07-30 16:00:46 +00001266 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001267
Tim Peters2344fae2001-01-15 00:50:52 +00001268 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001269 """(!) statement
1270 Execute the (one-line) statement in the context of the current
1271 stack frame. The exclamation point can be omitted unless the
1272 first word of the statement resembles a debugger command. To
1273 assign to a global variable you must always prefix the command
1274 with a 'global' command, e.g.:
1275 (Pdb) global list_options; list_options = ['-l']
1276 (Pdb)
1277 """
1278 self.message(self.help_exec.__doc__.strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001279
Tim Peters2344fae2001-01-15 00:50:52 +00001280 def help_pdb(self):
1281 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282
Georg Brandl0d089622010-07-30 16:00:46 +00001283 # other helper functions
1284
Tim Peters2344fae2001-01-15 00:50:52 +00001285 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001286 """Helper function for break/clear parsing -- may be overridden.
1287
1288 lookupmodule() translates (possibly incomplete) file or module name
1289 into an absolute file name.
1290 """
1291 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001292 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001293 f = os.path.join(sys.path[0], filename)
1294 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1295 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001296 root, ext = os.path.splitext(filename)
1297 if ext == '':
1298 filename = filename + '.py'
1299 if os.path.isabs(filename):
1300 return filename
1301 for dirname in sys.path:
1302 while os.path.islink(dirname):
1303 dirname = os.readlink(dirname)
1304 fullname = os.path.join(dirname, filename)
1305 if os.path.exists(fullname):
1306 return fullname
1307 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001308
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001309 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001310 # The script has to run in __main__ namespace (or imports from
1311 # __main__ will break).
1312 #
1313 # So we clear up the __main__ and set several special variables
1314 # (this gets rid of pdb's globals and cleans old variables on restarts).
1315 import __main__
1316 __main__.__dict__.clear()
1317 __main__.__dict__.update({"__name__" : "__main__",
1318 "__file__" : filename,
1319 "__builtins__": __builtins__,
1320 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001321
1322 # When bdb sets tracing, a number of call and line events happens
1323 # BEFORE debugger even reaches user's code (and the exact sequence of
1324 # events depends on python version). So we take special measures to
1325 # avoid stopping before we reach the main script (see user_line and
1326 # user_call for details).
1327 self._wait_for_mainpyfile = 1
1328 self.mainpyfile = self.canonic(filename)
1329 self._user_requested_quit = 0
Georg Brandld07ac642009-08-13 07:50:57 +00001330 with open(filename, "rb") as fp:
1331 statement = "exec(compile(%r, %r, 'exec'))" % \
1332 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001333 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001334
Georg Brandl0d089622010-07-30 16:00:46 +00001335# Collect all command help into docstring
1336
1337# unfortunately we can't guess this order from the class definition
1338_help_order = [
1339 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1340 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
Georg Brandle59ca2a2010-07-30 17:04:28 +00001341 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
1342 'args', 'print', 'pp', 'whatis', 'source', 'alias', 'unalias',
1343 'debug', 'quit',
Georg Brandl0d089622010-07-30 16:00:46 +00001344]
1345
Georg Brandle59ca2a2010-07-30 17:04:28 +00001346docs = set()
Georg Brandl0d089622010-07-30 16:00:46 +00001347for _command in _help_order:
1348 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1349__doc__ += Pdb.help_exec.__doc__
1350
1351del _help_order, _command
1352
Guido van Rossum35771131992-09-08 11:59:04 +00001353# Simplified interface
1354
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001355def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001356 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001357
1358def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001359 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001360
1361def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001362 # B/W compatibility
1363 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001364
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001365def runcall(*args, **kwds):
1366 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001367
Guido van Rossumb6775db1994-08-01 11:34:53 +00001368def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001369 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001370
1371# Post-Mortem interface
1372
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001373def post_mortem(t=None):
1374 # handling the default
1375 if t is None:
1376 # sys.exc_info() returns (type, value, traceback) if an exception is
1377 # being handled, otherwise it returns None
1378 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001379 if t is None:
1380 raise ValueError("A valid traceback must be passed if no "
1381 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001382
Tim Peters2344fae2001-01-15 00:50:52 +00001383 p = Pdb()
1384 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001385 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001386
1387def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001388 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001389
1390
1391# Main program for testing
1392
Guido van Rossum23efba41992-01-27 16:58:47 +00001393TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001394
Guido van Rossum921c8241992-01-10 14:54:42 +00001395def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001396 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001397
1398# print help
1399def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001400 import pydoc
1401 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001402
Georg Brandle0230912010-07-30 08:29:39 +00001403_usage = """\
1404usage: pdb.py [-c command] ... pyfile [arg] ...
1405
1406Debug the Python program given by pyfile.
1407
1408Initial commands are read from .pdbrc files in your home directory
1409and in the current directory, if they exist. Commands supplied with
1410-c are executed after commands from .pdbrc files.
1411
1412To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001413To let the script run up to a given line X in the debugged file, use
1414"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001415
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001416def main():
Georg Brandle0230912010-07-30 08:29:39 +00001417 import getopt
1418
1419 opts, args = getopt.getopt(sys.argv[1:], 'hc:', ['--help', '--command='])
1420
1421 if not args:
1422 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001423 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001424
Georg Brandle0230912010-07-30 08:29:39 +00001425 commands = []
1426 for opt, optarg in opts:
1427 if opt in ['-h', '--help']:
1428 print(_usage)
1429 sys.exit()
1430 elif opt in ['-c', '--command']:
1431 commands.append(optarg)
1432
1433 mainpyfile = args[0] # Get script filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001434 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001435 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001436 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001437
Georg Brandle0230912010-07-30 08:29:39 +00001438 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001439
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001440 # Replace pdb's dir with script's dir in front of module search path.
1441 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001442
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001443 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1444 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001445 # changed by the user from the command line. There is a "restart" command
1446 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001447 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001448 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001449 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001450 try:
1451 pdb._runscript(mainpyfile)
1452 if pdb._user_requested_quit:
1453 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001454 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001455 except Restart:
1456 print("Restarting", mainpyfile, "with arguments:")
Georg Brandle0230912010-07-30 08:29:39 +00001457 print("\t" + " ".join(args))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001458 except SystemExit:
1459 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001460 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001461 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001462 except:
1463 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001464 print("Uncaught exception. Entering post mortem debugging")
1465 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001466 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001467 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001468 print("Post mortem debugger finished. The " + mainpyfile +
1469 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001470
1471
1472# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001473if __name__ == '__main__':
1474 import pdb
1475 pdb.main()