blob: 3362ea1e7044b9e89804c89d0844f6bb183df742 [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:
158 rcFile = open(os.path.join(envHome, ".pdbrc"))
159 except IOError:
160 pass
161 else:
162 for line in rcFile.readlines():
163 self.rcLines.append(line)
164 rcFile.close()
165 try:
166 rcFile = open(".pdbrc")
167 except IOError:
168 pass
169 else:
170 for line in rcFile.readlines():
171 self.rcLines.append(line)
172 rcFile.close()
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
Tim Peters2344fae2001-01-15 00:50:52 +0000184 def reset(self):
185 bdb.Bdb.reset(self)
186 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000187
Tim Peters2344fae2001-01-15 00:50:52 +0000188 def forget(self):
189 self.lineno = None
190 self.stack = []
191 self.curindex = 0
192 self.curframe = None
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000193 self.tb_lineno.clear()
Guido van Rossum2424f851998-09-11 22:50:09 +0000194
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000195 def setup(self, f, tb):
Tim Peters2344fae2001-01-15 00:50:52 +0000196 self.forget()
Georg Brandl0a9c3e92010-07-30 18:46:38 +0000197 self.stack, self.curindex = self.get_stack(f, tb)
198 while tb:
199 # when setting up post-mortem debugging with a traceback, save all
200 # the original line numbers to be displayed along the current line
201 # numbers (which can be different, e.g. due to finally clauses)
202 lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
203 self.tb_lineno[tb.tb_frame] = lineno
204 tb = tb.tb_next
Tim Peters2344fae2001-01-15 00:50:52 +0000205 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000206 # The f_locals dictionary is updated from the actual frame
207 # locals whenever the .f_locals accessor is called, so we
208 # cache it here to ensure that modifications are not overwritten.
209 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000210 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211
Tim Peters2344fae2001-01-15 00:50:52 +0000212 # Can be executed earlier than 'setup' if desired
213 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000214 if not self.rcLines:
215 return
216 # local copy because of recursion
217 rcLines = self.rcLines
218 rcLines.reverse()
219 # execute every line only once
220 self.rcLines = []
221 while rcLines:
222 line = rcLines.pop().strip()
223 if line and line[0] != '#':
224 if self.onecmd(line):
225 # if onecmd returns True, the command wants to exit
226 # from the interaction, save leftover rc lines
227 # to execute before next interaction
228 self.rcLines += reversed(rcLines)
229 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000230
Tim Peters280488b2002-08-23 18:19:30 +0000231 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000232
233 def user_call(self, frame, argument_list):
234 """This method is called when there is the remote possibility
235 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000236 if self._wait_for_mainpyfile:
237 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000238 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000239 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000240 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000241
Tim Peters2344fae2001-01-15 00:50:52 +0000242 def user_line(self, frame):
243 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000244 if self._wait_for_mainpyfile:
245 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
246 or frame.f_lineno<= 0):
247 return
248 self._wait_for_mainpyfile = 0
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000249 if self.bp_commands(frame):
250 self.interaction(frame, None)
251
Georg Brandle0230912010-07-30 08:29:39 +0000252 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000253 """Call every command that was set for the current active breakpoint
254 (if there is one).
255
256 Returns True if the normal interaction function must be called,
257 False otherwise."""
258 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
259 if getattr(self, "currentbp", False) and \
260 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000261 currentbp = self.currentbp
262 self.currentbp = 0
263 lastcmd_back = self.lastcmd
264 self.setup(frame, None)
265 for line in self.commands[currentbp]:
266 self.onecmd(line)
267 self.lastcmd = lastcmd_back
268 if not self.commands_silent[currentbp]:
269 self.print_stack_entry(self.stack[self.curindex])
270 if self.commands_doprompt[currentbp]:
271 self.cmdloop()
272 self.forget()
273 return
274 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000275
Tim Peters2344fae2001-01-15 00:50:52 +0000276 def user_return(self, frame, return_value):
277 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000278 if self._wait_for_mainpyfile:
279 return
Tim Peters2344fae2001-01-15 00:50:52 +0000280 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000281 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000282 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000283
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000284 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000285 """This function is called if an exception occurs,
286 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000287 if self._wait_for_mainpyfile:
288 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000289 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000290 frame.f_locals['__exception__'] = exc_type, exc_value
Georg Brandl0d089622010-07-30 16:00:46 +0000291 self.message(traceback.format_exception_only(exc_type,
292 exc_value)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000293 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000294
Tim Peters2344fae2001-01-15 00:50:52 +0000295 # General interaction function
296
297 def interaction(self, frame, traceback):
Georg Brandle0230912010-07-30 08:29:39 +0000298 if self.setup(frame, traceback):
299 # no interaction desired at this time (happens if .pdbrc contains
300 # a command like "continue")
301 self.forget()
302 return
Tim Peters2344fae2001-01-15 00:50:52 +0000303 self.print_stack_entry(self.stack[self.curindex])
304 self.cmdloop()
305 self.forget()
306
Benjamin Petersond23f8222009-04-05 19:13:16 +0000307 def displayhook(self, obj):
308 """Custom displayhook for the exec in default(), which prevents
309 assignment of the _ variable in the builtins.
310 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000311 # reproduce the behavior of the standard displayhook, not printing None
312 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000313 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000314
Tim Peters2344fae2001-01-15 00:50:52 +0000315 def default(self, line):
316 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000317 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000318 globals = self.curframe.f_globals
319 try:
320 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000321 save_stdout = sys.stdout
322 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000323 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000324 try:
325 sys.stdin = self.stdin
326 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000327 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000328 exec(code, globals, locals)
329 finally:
330 sys.stdout = save_stdout
331 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000332 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000333 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000334 exc_info = sys.exc_info()[:2]
335 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000336
337 def precmd(self, line):
338 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000339 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000340 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000341 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000342 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000343 line = self.aliases[args[0]]
344 ii = 1
345 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000346 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000347 tmpArg)
348 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000349 line = line.replace("%*", ' '.join(args[1:]))
350 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000351 # split into ';;' separated commands
352 # unless it's an alias command
353 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000354 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000355 if marker >= 0:
356 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000357 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000358 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000359 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000360 return line
361
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000362 def onecmd(self, line):
363 """Interpret the argument as though it had been typed in response
364 to the prompt.
365
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000366 Checks whether this line is typed at the normal prompt or in
367 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 """
369 if not self.commands_defining:
370 return cmd.Cmd.onecmd(self, line)
371 else:
372 return self.handle_command_def(line)
373
Georg Brandlb90ffd82010-07-30 22:20:16 +0000374 def handle_command_def(self, line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000375 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000376 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000377 if not cmd:
378 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000379 if cmd == 'silent':
380 self.commands_silent[self.commands_bnum] = True
381 return # continue to handle other cmd def in the cmd list
382 elif cmd == 'end':
383 self.cmdqueue = []
384 return 1 # end of cmd list
385 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000386 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000387 cmdlist.append(cmd+' '+arg)
388 else:
389 cmdlist.append(cmd)
390 # Determine if we must stop
391 try:
392 func = getattr(self, 'do_' + cmd)
393 except AttributeError:
394 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000395 # one of the resuming commands
396 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000397 self.commands_doprompt[self.commands_bnum] = False
398 self.cmdqueue = []
399 return 1
400 return
401
Georg Brandl0d089622010-07-30 16:00:46 +0000402 # interface abstraction functions
403
404 def message(self, msg):
405 print(msg, file=self.stdout)
406
407 def error(self, msg):
408 print('***', msg, file=self.stdout)
409
Tim Peters2344fae2001-01-15 00:50:52 +0000410 # Command definitions, called by cmdloop()
411 # The argument is the remaining string on the command line
412 # Return true to exit from the command loop
413
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000414 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000415 """commands [bpnumber]
416 (com) ...
417 (com) end
418 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000419
Georg Brandl0d089622010-07-30 16:00:46 +0000420 Specify a list of commands for breakpoint number bpnumber.
421 The commands themselves are entered on the following lines.
422 Type a line containing just 'end' to terminate the commands.
423 The commands are executed when the breakpoint is hit.
424
425 To remove all commands from a breakpoint, type commands and
426 follow it immediately with end; that is, give no commands.
427
428 With no bpnumber argument, commands refers to the last
429 breakpoint set.
430
431 You can use breakpoint commands to start your program up
432 again. Simply use the continue command, or step, or any other
433 command that resumes execution.
434
435 Specifying any command resuming execution (currently continue,
436 step, next, return, jump, quit and their abbreviations)
437 terminates the command list (as if that command was
438 immediately followed by end). This is because any time you
439 resume execution (even with a simple next or step), you may
440 encounter another breakpoint -- which could have its own
441 command list, leading to ambiguities about which list to
442 execute.
443
444 If you use the 'silent' command in the command list, the usual
445 message about stopping at a breakpoint is not printed. This
446 may be desirable for breakpoints that are to print a specific
447 message and then continue. If none of the other commands
448 print anything, you will see no sign that the breakpoint was
449 reached.
450 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000451 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000452 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000453 else:
454 try:
455 bnum = int(arg)
456 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000457 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000458 return
459 self.commands_bnum = bnum
Georg Brandlb90ffd82010-07-30 22:20:16 +0000460 # Save old definitions for the case of a keyboard interrupt.
461 if bnum in self.commands:
462 old_command_defs = (self.commands[bnum],
463 self.commands_doprompt[bnum],
464 self.commands_silent[bnum])
465 else:
466 old_command_defs = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000467 self.commands[bnum] = []
468 self.commands_doprompt[bnum] = True
469 self.commands_silent[bnum] = False
Georg Brandlb90ffd82010-07-30 22:20:16 +0000470
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000471 prompt_back = self.prompt
472 self.prompt = '(com) '
473 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000474 try:
475 self.cmdloop()
Georg Brandlb90ffd82010-07-30 22:20:16 +0000476 except KeyboardInterrupt:
477 # Restore old definitions.
478 if old_command_defs:
479 self.commands[bnum] = old_command_defs[0]
480 self.commands_doprompt[bnum] = old_command_defs[1]
481 self.commands_silent[bnum] = old_command_defs[2]
482 else:
483 del self.commands[bnum]
484 del self.commands_doprompt[bnum]
485 del self.commands_silent[bnum]
486 self.error('command definition aborted, old commands restored')
Georg Brandl44f8bf92010-07-30 08:54:49 +0000487 finally:
488 self.commands_defining = False
489 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000490
Tim Peters2344fae2001-01-15 00:50:52 +0000491 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000492 """b(reak) [ ([filename:]lineno | function) [, condition] ]
493 Without argument, list all breaks.
494
495 With a line number argument, set a break at this line in the
496 current file. With a function name, set a break at the first
497 executable line of that function. If a second argument is
498 present, it is a string specifying an expression which must
499 evaluate to true before the breakpoint is honored.
500
501 The line number may be prefixed with a filename and a colon,
502 to specify a breakpoint in another file (probably one that
503 hasn't been loaded yet). The file is searched for on
504 sys.path; the .py suffix may be omitted.
505 """
Tim Peters2344fae2001-01-15 00:50:52 +0000506 if not arg:
507 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000508 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000509 for bp in bdb.Breakpoint.bpbynumber:
510 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000511 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000512 return
513 # parse arguments; comma has lowest precedence
514 # and cannot occur in filename
515 filename = None
516 lineno = None
517 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000518 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000519 if comma > 0:
520 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000521 cond = arg[comma+1:].lstrip()
522 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000523 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000524 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000525 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000526 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000527 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000528 f = self.lookupmodule(filename)
529 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000530 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000531 return
532 else:
533 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000534 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000535 try:
536 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000537 except ValueError as msg:
Georg Brandl0d089622010-07-30 16:00:46 +0000538 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000539 return
540 else:
541 # no colon; can be lineno or function
542 try:
543 lineno = int(arg)
544 except ValueError:
545 try:
546 func = eval(arg,
547 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000548 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000549 except:
550 func = arg
551 try:
Christian Heimesff737952007-11-27 10:40:20 +0000552 if hasattr(func, '__func__'):
553 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000554 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000555 #use co_name to identify the bkpt (function names
556 #could be aliased, but co_name is invariant)
557 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000558 lineno = code.co_firstlineno
559 filename = code.co_filename
560 except:
561 # last thing to try
562 (ok, filename, ln) = self.lineinfo(arg)
563 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000564 self.error('The specified object %r is not a function '
565 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000566 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000567 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000568 lineno = int(ln)
569 if not filename:
570 filename = self.defaultFile()
571 # Check for reasonable breakpoint
572 line = self.checkline(filename, lineno)
573 if line:
574 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000575 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000576 if err:
577 self.error(err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000578 else:
579 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000580 self.message("Breakpoint %d at %s:%d" %
581 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000582
583 # To be overridden in derived debuggers
584 def defaultFile(self):
585 """Produce a reasonable default."""
586 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000587 if filename == '<string>' and self.mainpyfile:
588 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000589 return filename
590
591 do_b = do_break
592
593 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000594 """tbreak [ ([filename:]lineno | function) [, condition] ]
595 Same arguments as break, but sets a temporary breakpoint: it
596 is automatically deleted when first hit.
597 """
Tim Peters2344fae2001-01-15 00:50:52 +0000598 self.do_break(arg, 1)
599
600 def lineinfo(self, identifier):
601 failed = (None, None, None)
602 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000603 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000604 if len(idstring) == 1:
605 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000606 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000607 elif len(idstring) == 3:
608 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000609 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000610 else:
611 return failed
612 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000613 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000614 # Protection for derived debuggers
615 if parts[0] == 'self':
616 del parts[0]
617 if len(parts) == 0:
618 return failed
619 # Best first guess at file to look at
620 fname = self.defaultFile()
621 if len(parts) == 1:
622 item = parts[0]
623 else:
624 # More than one part.
625 # First is module, second is method/class
626 f = self.lookupmodule(parts[0])
627 if f:
628 fname = f
629 item = parts[1]
630 answer = find_function(item, fname)
631 return answer or failed
632
633 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000634 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000635
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000636 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
637 line or EOF). Warning: testing is not comprehensive.
638 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000639 # this method should be callable before starting debugging, so default
640 # to "no globals" if there is no current frame
641 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
642 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000643 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000644 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000645 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000646 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000647 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000648 if (not line or (line[0] == '#') or
649 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000650 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000651 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000652 return lineno
653
654 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000655 """enable bpnumber [bpnumber ...]
656 Enables the breakpoints given as a space separated list of
657 breakpoint numbers.
658 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000659 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000660 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000661 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000662 bp = self.get_bpbynumber(i)
663 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000664 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000665 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000666 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000667 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000668
669 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000670 """disable bpnumber [bpnumber ...]
671 Disables the breakpoints given as a space separated list of
672 breakpoint numbers. Disabling a breakpoint means it cannot
673 cause the program to stop execution, but unlike clearing a
674 breakpoint, it remains in the list of breakpoints and can be
675 (re-)enabled.
676 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000677 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000678 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000679 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000680 bp = self.get_bpbynumber(i)
681 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000682 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000683 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000684 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000685 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000686
687 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000688 """condition bpnumber [condition]
689 Set a new condition for the breakpoint, an expression which
690 must evaluate to true before the breakpoint is honored. If
691 condition is absent, any existing condition is removed; i.e.,
692 the breakpoint is made unconditional.
693 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000694 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000695 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000696 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000697 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000698 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000699 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000700 bp = self.get_bpbynumber(args[0].strip())
701 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000702 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000703 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000704 bp.cond = cond
705 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000706 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000707 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000708 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000709
Georg Brandl7410dd12010-07-30 12:01:20 +0000710 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000711 """ignore bpnumber [count]
712 Set the ignore count for the given breakpoint number. If
713 count is omitted, the ignore count is set to 0. A breakpoint
714 becomes active when the ignore count is zero. When non-zero,
715 the count is decremented each time the breakpoint is reached
716 and the breakpoint is not disabled and any associated
717 condition evaluates to true.
718 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000719 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000720 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000721 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000722 except:
723 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000724 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000725 bp = self.get_bpbynumber(args[0].strip())
726 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000727 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000728 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000729 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000730 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000731 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000732 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000733 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000734 countstr = '1 crossing'
735 self.message('Will ignore next %s of breakpoint %d.' %
736 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000737 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000738 self.message('Will stop next time breakpoint %d is reached.'
739 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000740
741 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000742 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
743 With a space separated list of breakpoint numbers, clear
744 those breakpoints. Without argument, clear all breaks (but
745 first ask confirmation). With a filename:lineno argument,
746 clear all breaks at that line in that file.
747 """
Tim Peters2344fae2001-01-15 00:50:52 +0000748 if not arg:
749 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000750 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000751 except EOFError:
752 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000753 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000754 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000755 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000756 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000757 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000758 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000759 return
760 if ':' in arg:
761 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000762 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000763 filename = arg[:i]
764 arg = arg[i+1:]
765 try:
766 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000767 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000768 err = "Invalid line number (%s)" % arg
769 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000770 bplist = self.get_breaks(filename, lineno)
Tim Peters2344fae2001-01-15 00:50:52 +0000771 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000772 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000773 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000774 else:
775 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000776 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000777 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000778 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000779 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000780 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000781 bp = self.get_bpbynumber(i)
782 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000783 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000784 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000785 self.clear_break(bp.file, bp.line)
Georg Brandl0d089622010-07-30 16:00:46 +0000786 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000787 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
788
789 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000790 """w(here)
791 Print a stack trace, with the most recent frame at the bottom.
792 An arrow indicates the "current frame", which determines the
793 context of most commands. 'bt' is an alias for this command.
794 """
Tim Peters2344fae2001-01-15 00:50:52 +0000795 self.print_stack_trace()
796 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000797 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000798
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000799 def _select_frame(self, number):
800 assert 0 <= number < len(self.stack)
801 self.curindex = number
802 self.curframe = self.stack[self.curindex][0]
803 self.curframe_locals = self.curframe.f_locals
804 self.print_stack_entry(self.stack[self.curindex])
805 self.lineno = None
806
Tim Peters2344fae2001-01-15 00:50:52 +0000807 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000808 """u(p) [count]
809 Move the current frame count (default one) levels up in the
810 stack trace (to an older frame).
811 """
Tim Peters2344fae2001-01-15 00:50:52 +0000812 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000813 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000814 return
815 try:
816 count = int(arg or 1)
817 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000818 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000819 return
820 if count < 0:
821 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000822 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000823 newframe = max(0, self.curindex - count)
824 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000825 do_u = do_up
826
827 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000828 """d(own) [count]
829 Move the current frame count (default one) levels down in the
830 stack trace (to a newer frame).
831 """
Tim Peters2344fae2001-01-15 00:50:52 +0000832 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000833 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000834 return
835 try:
836 count = int(arg or 1)
837 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000838 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000839 return
840 if count < 0:
841 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000842 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000843 newframe = min(len(self.stack) - 1, self.curindex + count)
844 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000845 do_d = do_down
846
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000847 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000848 """unt(il) [lineno]
849 Without argument, continue execution until the line with a
850 number greater than the current one is reached. With a line
851 number, continue execution until a line with a number greater
852 or equal to that is reached. In both cases, also stop when
853 the current frame returns.
854 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000855 if arg:
856 try:
857 lineno = int(arg)
858 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000859 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000860 return
861 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000862 self.error('"until" line number is smaller than current '
863 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000864 return
865 else:
866 lineno = None
867 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000868 return 1
869 do_unt = do_until
870
Tim Peters2344fae2001-01-15 00:50:52 +0000871 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000872 """s(tep)
873 Execute the current line, stop at the first possible occasion
874 (either in a function that is called or in the current
875 function).
876 """
Tim Peters2344fae2001-01-15 00:50:52 +0000877 self.set_step()
878 return 1
879 do_s = do_step
880
881 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000882 """n(ext)
883 Continue execution until the next line in the current function
884 is reached or it returns.
885 """
Tim Peters2344fae2001-01-15 00:50:52 +0000886 self.set_next(self.curframe)
887 return 1
888 do_n = do_next
889
Guido van Rossumd8faa362007-04-27 19:54:29 +0000890 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000891 """run [args...]
892 Restart the debugged python program. If a string is supplied
893 it is splitted with "shlex", and the result is used as the new
894 sys.argv. History, breakpoints, actions and debugger options
895 are preserved. "restart" is an alias for "run".
896 """
Guido van Rossumd8faa362007-04-27 19:54:29 +0000897 if arg:
898 import shlex
899 argv0 = sys.argv[0:1]
900 sys.argv = shlex.split(arg)
901 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +0000902 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +0000903 raise Restart
904
905 do_restart = do_run
906
Tim Peters2344fae2001-01-15 00:50:52 +0000907 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000908 """r(eturn)
909 Continue execution until the current function returns.
910 """
Tim Peters2344fae2001-01-15 00:50:52 +0000911 self.set_return(self.curframe)
912 return 1
913 do_r = do_return
914
915 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000916 """c(ont(inue))
917 Continue execution, only stop when a breakpoint is encountered.
918 """
Tim Peters2344fae2001-01-15 00:50:52 +0000919 self.set_continue()
920 return 1
921 do_c = do_cont = do_continue
922
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000923 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000924 """j(ump) lineno
925 Set the next line that will be executed. Only available in
926 the bottom-most frame. This lets you jump back and execute
927 code again, or jump forward to skip code that you don't want
928 to run.
929
930 It should be noted that not all jumps are allowed -- for
931 instance it is not possible to jump into the middle of a
932 for loop or out of a finally clause.
933 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000934 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000935 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000936 return
937 try:
938 arg = int(arg)
939 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000940 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000941 else:
942 try:
943 # Do the jump, fix up our copy of the stack, and display the
944 # new position
945 self.curframe.f_lineno = arg
946 self.stack[self.curindex] = self.stack[self.curindex][0], arg
947 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000948 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +0000949 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000950 do_j = do_jump
951
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000952 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000953 """debug code
954 Enter a recursive debugger that steps through the code
955 argument (which is an arbitrary expression or statement to be
956 executed in the current environment).
957 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000958 sys.settrace(None)
959 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +0000960 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000961 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000962 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +0000963 self.message("ENTERING RECURSIVE DEBUGGER")
Guido van Rossumed538d82003-04-09 19:36:34 +0000964 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl0d089622010-07-30 16:00:46 +0000965 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000966 sys.settrace(self.trace_dispatch)
967 self.lastcmd = p.lastcmd
968
Tim Peters2344fae2001-01-15 00:50:52 +0000969 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000970 """q(uit)\nexit
971 Quit from the debugger. The program being executed is aborted.
972 """
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000973 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000974 self.set_quit()
975 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000976
Tim Peters2344fae2001-01-15 00:50:52 +0000977 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000978 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000979
Guido van Rossumeef26072003-01-13 21:13:55 +0000980 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000981 """EOF
982 Handles the receipt of EOF as a command.
983 """
984 self.message('')
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000985 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000986 self.set_quit()
987 return 1
988
Tim Peters2344fae2001-01-15 00:50:52 +0000989 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000990 """a(rgs)
991 Print the argument list of the current function.
992 """
Benjamin Petersond23f8222009-04-05 19:13:16 +0000993 co = self.curframe.f_code
994 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000995 n = co.co_argcount
996 if co.co_flags & 4: n = n+1
997 if co.co_flags & 8: n = n+1
998 for i in range(n):
999 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +00001000 if name in dict:
1001 self.message('%s = %r' % (name, dict[name]))
1002 else:
1003 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +00001004 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +00001005
Tim Peters2344fae2001-01-15 00:50:52 +00001006 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001007 """retval
1008 Print the return value for the last return of a function.
1009 """
Benjamin Petersond23f8222009-04-05 19:13:16 +00001010 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +00001011 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +00001012 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001013 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +00001014 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +00001015
Barry Warsaw210bd202002-11-05 22:40:20 +00001016 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +00001017 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +00001018 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +00001019 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001020 exc_info = sys.exc_info()[:2]
1021 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Barry Warsaw210bd202002-11-05 22:40:20 +00001022 raise
Guido van Rossum2424f851998-09-11 22:50:09 +00001023
Barry Warsaw210bd202002-11-05 22:40:20 +00001024 def do_p(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001025 """p(rint) expression
1026 Print the value of the expression.
1027 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001028 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001029 self.message(repr(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001030 except:
1031 pass
Georg Brandlc9879242007-09-04 07:07:56 +00001032 # make "print" an alias of "p" since print isn't a Python statement anymore
1033 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +00001034
1035 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001036 """pp expression
1037 Pretty-print the value of the expression.
1038 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001039 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001040 self.message(pprint.pformat(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001041 except:
1042 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001043
Tim Peters2344fae2001-01-15 00:50:52 +00001044 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001045 """l(ist) [first [,last] | .]
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001046
1047 List source code for the current file. Without arguments,
1048 list 11 lines around the current line or continue the previous
1049 listing. With . as argument, list 11 lines around the current
1050 line. With one argument, list 11 lines starting at that line.
1051 With two arguments, list the given range; if the second
1052 argument is less than the first, it is a count.
1053
1054 The current line in the current frame is indicated by "->".
1055 If an exception is being debugged, the line where the
1056 exception was originally raised or propagated is indicated by
1057 ">>", if it differs from the current line.
Georg Brandl0d089622010-07-30 16:00:46 +00001058 """
Tim Peters2344fae2001-01-15 00:50:52 +00001059 self.lastcmd = 'list'
1060 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001061 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001062 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001063 if ',' in arg:
1064 first, last = arg.split(',')
1065 first = int(first.strip())
1066 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001067 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001068 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001069 last = first + last
1070 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001071 first = int(arg.strip())
1072 first = max(1, first - 5)
1073 except ValueError:
1074 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001075 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001076 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001077 first = max(1, self.curframe.f_lineno - 5)
1078 else:
1079 first = self.lineno + 1
1080 if last is None:
1081 last = first + 10
1082 filename = self.curframe.f_code.co_filename
1083 breaklist = self.get_file_breaks(filename)
1084 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001085 lines = linecache.getlines(filename, self.curframe.f_globals)
1086 self._print_lines(lines[first-1:last], first, breaklist,
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001087 self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001088 self.lineno = min(last, len(lines))
1089 if len(lines) < last:
1090 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001091 except KeyboardInterrupt:
1092 pass
1093 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001094
Georg Brandle59ca2a2010-07-30 17:04:28 +00001095 def do_longlist(self, arg):
1096 """longlist | ll
1097 List the whole source code for the current function or frame.
1098 """
1099 filename = self.curframe.f_code.co_filename
1100 breaklist = self.get_file_breaks(filename)
1101 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001102 lines, lineno = getsourcelines(self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001103 except IOError as err:
1104 self.error(err)
1105 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001106 self._print_lines(lines, lineno, breaklist, self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001107 do_ll = do_longlist
1108
1109 def do_source(self, arg):
1110 """source expression
1111 Try to get source code for the given object and display it.
1112 """
1113 try:
1114 obj = self._getval(arg)
1115 except:
1116 return
1117 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001118 lines, lineno = getsourcelines(obj)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001119 except (IOError, TypeError) as err:
1120 self.error(err)
1121 return
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001122 self._print_lines(lines, lineno)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001123
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001124 def _print_lines(self, lines, start, breaks=(), frame=None):
Georg Brandle59ca2a2010-07-30 17:04:28 +00001125 """Print a range of lines."""
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001126 if frame:
1127 current_lineno = frame.f_lineno
1128 exc_lineno = self.tb_lineno.get(frame, -1)
1129 else:
1130 current_lineno = exc_lineno = -1
Georg Brandle59ca2a2010-07-30 17:04:28 +00001131 for lineno, line in enumerate(lines, start):
1132 s = str(lineno).rjust(3)
1133 if len(s) < 4:
1134 s += ' '
1135 if lineno in breaks:
1136 s += 'B'
1137 else:
1138 s += ' '
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001139 if lineno == current_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001140 s += '->'
Georg Brandl0a9c3e92010-07-30 18:46:38 +00001141 elif lineno == exc_lineno:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001142 s += '>>'
1143 self.message(s + '\t' + line.rstrip())
1144
Tim Peters2344fae2001-01-15 00:50:52 +00001145 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001146 """whatis arg
1147 Print the type of the argument.
1148 """
Tim Peters2344fae2001-01-15 00:50:52 +00001149 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001150 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001151 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001152 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001153 return
1154 code = None
1155 # Is it a function?
Georg Brandl0d089622010-07-30 16:00:46 +00001156 try:
1157 code = value.__code__
1158 except Exception:
1159 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001160 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001161 self.message('Function %s' % code.co_name)
Tim Peters2344fae2001-01-15 00:50:52 +00001162 return
1163 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001164 try:
1165 code = value.__func__.__code__
1166 except Exception:
1167 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001168 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001169 self.message('Method %s' % code.co_name)
1170 return
1171 # Is it a class?
1172 if value.__class__ is type:
1173 self.message('Class %s.%s' % (value.__module__, value.__name__))
Tim Peters2344fae2001-01-15 00:50:52 +00001174 return
1175 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001176 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001177
Tim Peters2344fae2001-01-15 00:50:52 +00001178 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001179 """alias [name [command [parameter parameter ...] ]]
1180 Create an alias called 'name' that executes 'command'. The
1181 command must *not* be enclosed in quotes. Replaceable
1182 parameters can be indicated by %1, %2, and so on, while %* is
1183 replaced by all the parameters. If no command is given, the
1184 current alias for name is shown. If no name is given, all
1185 aliases are listed.
1186
1187 Aliases may be nested and can contain anything that can be
1188 legally typed at the pdb prompt. Note! You *can* override
1189 internal pdb commands with aliases! Those internal commands
1190 are then hidden until the alias is removed. Aliasing is
1191 recursively applied to the first word of the command line; all
1192 other words in the line are left alone.
1193
1194 As an example, here are two useful aliases (especially when
1195 placed in the .pdbrc file):
1196
1197 # Print instance variables (usage "pi classInst")
1198 alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
1199 # Print instance variables in self
1200 alias ps pi self
1201 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001202 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001203 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001204 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001205 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001206 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001207 return
Guido van Rossum08454592002-07-12 13:10:53 +00001208 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001209 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001210 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001211 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001212
Tim Peters2344fae2001-01-15 00:50:52 +00001213 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001214 """unalias name
1215 Delete the specified alias.
1216 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001217 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001218 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001219 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001220 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001221
Georg Brandl0d089622010-07-30 16:00:46 +00001222 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001223 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1224 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001225
Tim Peters2344fae2001-01-15 00:50:52 +00001226 # Print a traceback starting at the top stack frame.
1227 # The most recently entered frame is printed last;
1228 # this is different from dbx and gdb, but consistent with
1229 # the Python interpreter's stack trace.
1230 # It is also consistent with the up/down commands (which are
1231 # compatible with dbx and gdb: up moves towards 'main()'
1232 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001233
Tim Peters2344fae2001-01-15 00:50:52 +00001234 def print_stack_trace(self):
1235 try:
1236 for frame_lineno in self.stack:
1237 self.print_stack_entry(frame_lineno)
1238 except KeyboardInterrupt:
1239 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001240
Tim Peters2344fae2001-01-15 00:50:52 +00001241 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1242 frame, lineno = frame_lineno
1243 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001244 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001245 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001246 prefix = ' '
1247 self.message(prefix +
1248 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001249
Georg Brandl0d089622010-07-30 16:00:46 +00001250 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001251
Georg Brandl0d089622010-07-30 16:00:46 +00001252 def do_help(self, arg):
1253 """h(elp)
1254 Without argument, print the list of available commands.
1255 With a command name as argument, print help about that command.
1256 "help pdb" shows the full pdb documentation.
1257 "help exec" gives help on the ! command.
1258 """
1259 if not arg:
1260 return cmd.Cmd.do_help(self, arg)
1261 try:
1262 try:
1263 topic = getattr(self, 'help_' + arg)
1264 return topic()
1265 except AttributeError:
1266 command = getattr(self, 'do_' + arg)
1267 except AttributeError:
1268 self.error('No help for %r' % arg)
1269 else:
1270 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001271
Georg Brandl0d089622010-07-30 16:00:46 +00001272 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001273
Tim Peters2344fae2001-01-15 00:50:52 +00001274 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001275 """(!) statement
1276 Execute the (one-line) statement in the context of the current
1277 stack frame. The exclamation point can be omitted unless the
1278 first word of the statement resembles a debugger command. To
1279 assign to a global variable you must always prefix the command
1280 with a 'global' command, e.g.:
1281 (Pdb) global list_options; list_options = ['-l']
1282 (Pdb)
1283 """
1284 self.message(self.help_exec.__doc__.strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001285
Tim Peters2344fae2001-01-15 00:50:52 +00001286 def help_pdb(self):
1287 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001288
Georg Brandl0d089622010-07-30 16:00:46 +00001289 # other helper functions
1290
Tim Peters2344fae2001-01-15 00:50:52 +00001291 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001292 """Helper function for break/clear parsing -- may be overridden.
1293
1294 lookupmodule() translates (possibly incomplete) file or module name
1295 into an absolute file name.
1296 """
1297 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001298 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001299 f = os.path.join(sys.path[0], filename)
1300 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1301 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001302 root, ext = os.path.splitext(filename)
1303 if ext == '':
1304 filename = filename + '.py'
1305 if os.path.isabs(filename):
1306 return filename
1307 for dirname in sys.path:
1308 while os.path.islink(dirname):
1309 dirname = os.readlink(dirname)
1310 fullname = os.path.join(dirname, filename)
1311 if os.path.exists(fullname):
1312 return fullname
1313 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001314
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001315 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001316 # The script has to run in __main__ namespace (or imports from
1317 # __main__ will break).
1318 #
1319 # So we clear up the __main__ and set several special variables
1320 # (this gets rid of pdb's globals and cleans old variables on restarts).
1321 import __main__
1322 __main__.__dict__.clear()
1323 __main__.__dict__.update({"__name__" : "__main__",
1324 "__file__" : filename,
1325 "__builtins__": __builtins__,
1326 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001327
1328 # When bdb sets tracing, a number of call and line events happens
1329 # BEFORE debugger even reaches user's code (and the exact sequence of
1330 # events depends on python version). So we take special measures to
1331 # avoid stopping before we reach the main script (see user_line and
1332 # user_call for details).
1333 self._wait_for_mainpyfile = 1
1334 self.mainpyfile = self.canonic(filename)
1335 self._user_requested_quit = 0
Georg Brandld07ac642009-08-13 07:50:57 +00001336 with open(filename, "rb") as fp:
1337 statement = "exec(compile(%r, %r, 'exec'))" % \
1338 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001339 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001340
Georg Brandl0d089622010-07-30 16:00:46 +00001341# Collect all command help into docstring
1342
1343# unfortunately we can't guess this order from the class definition
1344_help_order = [
1345 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1346 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
Georg Brandle59ca2a2010-07-30 17:04:28 +00001347 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
1348 'args', 'print', 'pp', 'whatis', 'source', 'alias', 'unalias',
1349 'debug', 'quit',
Georg Brandl0d089622010-07-30 16:00:46 +00001350]
1351
Georg Brandle59ca2a2010-07-30 17:04:28 +00001352docs = set()
Georg Brandl0d089622010-07-30 16:00:46 +00001353for _command in _help_order:
1354 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1355__doc__ += Pdb.help_exec.__doc__
1356
1357del _help_order, _command
1358
Guido van Rossum35771131992-09-08 11:59:04 +00001359# Simplified interface
1360
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001361def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001362 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001363
1364def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001365 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001366
1367def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001368 # B/W compatibility
1369 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001370
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001371def runcall(*args, **kwds):
1372 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001373
Guido van Rossumb6775db1994-08-01 11:34:53 +00001374def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001375 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001376
1377# Post-Mortem interface
1378
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001379def post_mortem(t=None):
1380 # handling the default
1381 if t is None:
1382 # sys.exc_info() returns (type, value, traceback) if an exception is
1383 # being handled, otherwise it returns None
1384 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001385 if t is None:
1386 raise ValueError("A valid traceback must be passed if no "
1387 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001388
Tim Peters2344fae2001-01-15 00:50:52 +00001389 p = Pdb()
1390 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001391 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001392
1393def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001394 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001395
1396
1397# Main program for testing
1398
Guido van Rossum23efba41992-01-27 16:58:47 +00001399TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001400
Guido van Rossum921c8241992-01-10 14:54:42 +00001401def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001402 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001403
1404# print help
1405def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001406 import pydoc
1407 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001408
Georg Brandle0230912010-07-30 08:29:39 +00001409_usage = """\
1410usage: pdb.py [-c command] ... pyfile [arg] ...
1411
1412Debug the Python program given by pyfile.
1413
1414Initial commands are read from .pdbrc files in your home directory
1415and in the current directory, if they exist. Commands supplied with
1416-c are executed after commands from .pdbrc files.
1417
1418To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001419To let the script run up to a given line X in the debugged file, use
1420"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001421
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001422def main():
Georg Brandle0230912010-07-30 08:29:39 +00001423 import getopt
1424
1425 opts, args = getopt.getopt(sys.argv[1:], 'hc:', ['--help', '--command='])
1426
1427 if not args:
1428 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001429 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001430
Georg Brandle0230912010-07-30 08:29:39 +00001431 commands = []
1432 for opt, optarg in opts:
1433 if opt in ['-h', '--help']:
1434 print(_usage)
1435 sys.exit()
1436 elif opt in ['-c', '--command']:
1437 commands.append(optarg)
1438
1439 mainpyfile = args[0] # Get script filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001440 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001441 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001442 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001443
Georg Brandle0230912010-07-30 08:29:39 +00001444 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001445
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001446 # Replace pdb's dir with script's dir in front of module search path.
1447 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001448
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001449 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1450 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001451 # changed by the user from the command line. There is a "restart" command
1452 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001453 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001454 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001455 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001456 try:
1457 pdb._runscript(mainpyfile)
1458 if pdb._user_requested_quit:
1459 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001460 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001461 except Restart:
1462 print("Restarting", mainpyfile, "with arguments:")
Georg Brandle0230912010-07-30 08:29:39 +00001463 print("\t" + " ".join(args))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001464 except SystemExit:
1465 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001466 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001467 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001468 except:
1469 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001470 print("Uncaught exception. Entering post mortem debugging")
1471 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001472 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001473 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001474 print("Post mortem debugger finished. The " + mainpyfile +
1475 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001476
1477
1478# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001479if __name__ == '__main__':
1480 import pdb
1481 pdb.main()