blob: 2531e190a70a8445a9bb66d21507a78cfe30f1a1 [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
Guido van Rossumb5699c71998-07-20 23:13:54 +000073import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000074import re
Barry Warsaw210bd202002-11-05 22:40:20 +000075import pprint
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000076import traceback
Georg Brandle59ca2a2010-07-30 17:04:28 +000077import inspect
78import types
Guido van Rossumd8faa362007-04-27 19:54:29 +000079
80
81class Restart(Exception):
82 """Causes a debugger to be restarted for the debugged python program."""
83 pass
84
Skip Montanaro352674d2001-02-07 23:14:30 +000085__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
86 "post_mortem", "help"]
87
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000088def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000089 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000090 try:
91 fp = open(filename)
92 except IOError:
93 return None
94 # consumer of this info expects the first line to be 1
95 lineno = 1
96 answer = None
97 while 1:
98 line = fp.readline()
99 if line == '':
100 break
101 if cre.match(line):
102 answer = funcname, filename, lineno
103 break
104 lineno = lineno + 1
105 fp.close()
106 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +0000107
Georg Brandl5ed2b5a2010-07-30 18:08:12 +0000108def getsourcelines(obj):
109 lines, lineno = inspect.findsource(obj)
110 if inspect.isframe(obj) and lineno == 0 and \
111 obj.f_globals is obj.f_locals:
112 # must be a module frame: do not try to cut a block out of it
113 return lines, 0
114 elif inspect.ismodule(obj):
115 return lines, 0
116 return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum921c8241992-01-10 14:54:42 +0000117
Guido van Rossuma558e371994-11-10 22:27:35 +0000118# Interaction prompt line will separate file and call info from code
119# text using value of line_prefix string. A newline and arrow may
120# be to your liking. You can set it once pdb is imported using the
121# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +0000122# line_prefix = ': ' # Use this to get the old situation back
123line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +0000124
Guido van Rossum23efba41992-01-27 16:58:47 +0000125class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +0000126
Georg Brandl243ad662009-05-05 09:00:19 +0000127 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
128 bdb.Bdb.__init__(self, skip=skip)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 cmd.Cmd.__init__(self, completekey, stdin, stdout)
130 if stdout:
131 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000132 self.prompt = '(Pdb) '
133 self.aliases = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000134 self.mainpyfile = ''
135 self._wait_for_mainpyfile = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000136 # Try to load readline if it exists
137 try:
138 import readline
139 except ImportError:
140 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000141
Tim Peters2344fae2001-01-15 00:50:52 +0000142 # Read $HOME/.pdbrc and ./.pdbrc
143 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +0000144 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +0000145 envHome = os.environ['HOME']
146 try:
147 rcFile = open(os.path.join(envHome, ".pdbrc"))
148 except IOError:
149 pass
150 else:
151 for line in rcFile.readlines():
152 self.rcLines.append(line)
153 rcFile.close()
154 try:
155 rcFile = open(".pdbrc")
156 except IOError:
157 pass
158 else:
159 for line in rcFile.readlines():
160 self.rcLines.append(line)
161 rcFile.close()
Guido van Rossum23efba41992-01-27 16:58:47 +0000162
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000163 self.commands = {} # associates a command list to breakpoint numbers
Benjamin Petersond23f8222009-04-05 19:13:16 +0000164 self.commands_doprompt = {} # for each bp num, tells if the prompt
165 # must be disp. after execing the cmd list
166 self.commands_silent = {} # for each bp num, tells if the stack trace
167 # must be disp. after execing the cmd list
168 self.commands_defining = False # True while in the process of defining
169 # a command list
170 self.commands_bnum = None # The breakpoint number for which we are
171 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000172
Tim Peters2344fae2001-01-15 00:50:52 +0000173 def reset(self):
174 bdb.Bdb.reset(self)
175 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000176
Tim Peters2344fae2001-01-15 00:50:52 +0000177 def forget(self):
178 self.lineno = None
179 self.stack = []
180 self.curindex = 0
181 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000182
Tim Peters2344fae2001-01-15 00:50:52 +0000183 def setup(self, f, t):
184 self.forget()
185 self.stack, self.curindex = self.get_stack(f, t)
186 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000187 # The f_locals dictionary is updated from the actual frame
188 # locals whenever the .f_locals accessor is called, so we
189 # cache it here to ensure that modifications are not overwritten.
190 self.curframe_locals = self.curframe.f_locals
Georg Brandle0230912010-07-30 08:29:39 +0000191 return self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000192
Tim Peters2344fae2001-01-15 00:50:52 +0000193 # Can be executed earlier than 'setup' if desired
194 def execRcLines(self):
Georg Brandle0230912010-07-30 08:29:39 +0000195 if not self.rcLines:
196 return
197 # local copy because of recursion
198 rcLines = self.rcLines
199 rcLines.reverse()
200 # execute every line only once
201 self.rcLines = []
202 while rcLines:
203 line = rcLines.pop().strip()
204 if line and line[0] != '#':
205 if self.onecmd(line):
206 # if onecmd returns True, the command wants to exit
207 # from the interaction, save leftover rc lines
208 # to execute before next interaction
209 self.rcLines += reversed(rcLines)
210 return True
Guido van Rossum2424f851998-09-11 22:50:09 +0000211
Tim Peters280488b2002-08-23 18:19:30 +0000212 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000213
214 def user_call(self, frame, argument_list):
215 """This method is called when there is the remote possibility
216 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000217 if self._wait_for_mainpyfile:
218 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000219 if self.stop_here(frame):
Georg Brandl0d089622010-07-30 16:00:46 +0000220 self.message('--Call--')
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000221 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000222
Tim Peters2344fae2001-01-15 00:50:52 +0000223 def user_line(self, frame):
224 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000225 if self._wait_for_mainpyfile:
226 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
227 or frame.f_lineno<= 0):
228 return
229 self._wait_for_mainpyfile = 0
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000230 if self.bp_commands(frame):
231 self.interaction(frame, None)
232
Georg Brandle0230912010-07-30 08:29:39 +0000233 def bp_commands(self, frame):
Georg Brandl3078df02009-05-05 09:11:31 +0000234 """Call every command that was set for the current active breakpoint
235 (if there is one).
236
237 Returns True if the normal interaction function must be called,
238 False otherwise."""
239 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
240 if getattr(self, "currentbp", False) and \
241 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000242 currentbp = self.currentbp
243 self.currentbp = 0
244 lastcmd_back = self.lastcmd
245 self.setup(frame, None)
246 for line in self.commands[currentbp]:
247 self.onecmd(line)
248 self.lastcmd = lastcmd_back
249 if not self.commands_silent[currentbp]:
250 self.print_stack_entry(self.stack[self.curindex])
251 if self.commands_doprompt[currentbp]:
252 self.cmdloop()
253 self.forget()
254 return
255 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000256
Tim Peters2344fae2001-01-15 00:50:52 +0000257 def user_return(self, frame, return_value):
258 """This function is called when a return trap is set here."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000259 if self._wait_for_mainpyfile:
260 return
Tim Peters2344fae2001-01-15 00:50:52 +0000261 frame.f_locals['__return__'] = return_value
Georg Brandl0d089622010-07-30 16:00:46 +0000262 self.message('--Return--')
Tim Peters2344fae2001-01-15 00:50:52 +0000263 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000264
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000265 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000266 """This function is called if an exception occurs,
267 but only if we are to stop at or just below this level."""
Georg Brandl34cc0f52010-07-30 09:43:00 +0000268 if self._wait_for_mainpyfile:
269 return
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000270 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000271 frame.f_locals['__exception__'] = exc_type, exc_value
Georg Brandl0d089622010-07-30 16:00:46 +0000272 self.message(traceback.format_exception_only(exc_type,
273 exc_value)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000274 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000275
Tim Peters2344fae2001-01-15 00:50:52 +0000276 # General interaction function
277
278 def interaction(self, frame, traceback):
Georg Brandle0230912010-07-30 08:29:39 +0000279 if self.setup(frame, traceback):
280 # no interaction desired at this time (happens if .pdbrc contains
281 # a command like "continue")
282 self.forget()
283 return
Tim Peters2344fae2001-01-15 00:50:52 +0000284 self.print_stack_entry(self.stack[self.curindex])
285 self.cmdloop()
286 self.forget()
287
Benjamin Petersond23f8222009-04-05 19:13:16 +0000288 def displayhook(self, obj):
289 """Custom displayhook for the exec in default(), which prevents
290 assignment of the _ variable in the builtins.
291 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000292 # reproduce the behavior of the standard displayhook, not printing None
293 if obj is not None:
Georg Brandl0d089622010-07-30 16:00:46 +0000294 self.message(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000295
Tim Peters2344fae2001-01-15 00:50:52 +0000296 def default(self, line):
297 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000298 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000299 globals = self.curframe.f_globals
300 try:
301 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000302 save_stdout = sys.stdout
303 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000304 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000305 try:
306 sys.stdin = self.stdin
307 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000308 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000309 exec(code, globals, locals)
310 finally:
311 sys.stdout = save_stdout
312 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000313 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000314 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000315 exc_info = sys.exc_info()[:2]
316 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000317
318 def precmd(self, line):
319 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000320 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000321 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000322 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000323 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000324 line = self.aliases[args[0]]
325 ii = 1
326 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000327 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000328 tmpArg)
329 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000330 line = line.replace("%*", ' '.join(args[1:]))
331 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000332 # split into ';;' separated commands
333 # unless it's an alias command
334 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000335 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000336 if marker >= 0:
337 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000338 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000339 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000340 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000341 return line
342
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000343 def onecmd(self, line):
344 """Interpret the argument as though it had been typed in response
345 to the prompt.
346
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000347 Checks whether this line is typed at the normal prompt or in
348 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000349 """
350 if not self.commands_defining:
351 return cmd.Cmd.onecmd(self, line)
352 else:
353 return self.handle_command_def(line)
354
355 def handle_command_def(self,line):
Georg Brandl44f8bf92010-07-30 08:54:49 +0000356 """Handles one command line during command list definition."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000357 cmd, arg, line = self.parseline(line)
Georg Brandl44f8bf92010-07-30 08:54:49 +0000358 if not cmd:
359 return
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000360 if cmd == 'silent':
361 self.commands_silent[self.commands_bnum] = True
362 return # continue to handle other cmd def in the cmd list
363 elif cmd == 'end':
364 self.cmdqueue = []
365 return 1 # end of cmd list
366 cmdlist = self.commands[self.commands_bnum]
Georg Brandl44f8bf92010-07-30 08:54:49 +0000367 if arg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 cmdlist.append(cmd+' '+arg)
369 else:
370 cmdlist.append(cmd)
371 # Determine if we must stop
372 try:
373 func = getattr(self, 'do_' + cmd)
374 except AttributeError:
375 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000376 # one of the resuming commands
377 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000378 self.commands_doprompt[self.commands_bnum] = False
379 self.cmdqueue = []
380 return 1
381 return
382
Georg Brandl0d089622010-07-30 16:00:46 +0000383 # interface abstraction functions
384
385 def message(self, msg):
386 print(msg, file=self.stdout)
387
388 def error(self, msg):
389 print('***', msg, file=self.stdout)
390
Tim Peters2344fae2001-01-15 00:50:52 +0000391 # Command definitions, called by cmdloop()
392 # The argument is the remaining string on the command line
393 # Return true to exit from the command loop
394
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000395 def do_commands(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000396 """commands [bpnumber]
397 (com) ...
398 (com) end
399 (Pdb)
Georg Brandl3078df02009-05-05 09:11:31 +0000400
Georg Brandl0d089622010-07-30 16:00:46 +0000401 Specify a list of commands for breakpoint number bpnumber.
402 The commands themselves are entered on the following lines.
403 Type a line containing just 'end' to terminate the commands.
404 The commands are executed when the breakpoint is hit.
405
406 To remove all commands from a breakpoint, type commands and
407 follow it immediately with end; that is, give no commands.
408
409 With no bpnumber argument, commands refers to the last
410 breakpoint set.
411
412 You can use breakpoint commands to start your program up
413 again. Simply use the continue command, or step, or any other
414 command that resumes execution.
415
416 Specifying any command resuming execution (currently continue,
417 step, next, return, jump, quit and their abbreviations)
418 terminates the command list (as if that command was
419 immediately followed by end). This is because any time you
420 resume execution (even with a simple next or step), you may
421 encounter another breakpoint -- which could have its own
422 command list, leading to ambiguities about which list to
423 execute.
424
425 If you use the 'silent' command in the command list, the usual
426 message about stopping at a breakpoint is not printed. This
427 may be desirable for breakpoints that are to print a specific
428 message and then continue. If none of the other commands
429 print anything, you will see no sign that the breakpoint was
430 reached.
431 """
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000432 if not arg:
Georg Brandl7410dd12010-07-30 12:01:20 +0000433 bnum = len(bdb.Breakpoint.bpbynumber) - 1
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000434 else:
435 try:
436 bnum = int(arg)
437 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000438 self.error("Usage: commands [bnum]\n ...\n end")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000439 return
440 self.commands_bnum = bnum
441 self.commands[bnum] = []
442 self.commands_doprompt[bnum] = True
443 self.commands_silent[bnum] = False
444 prompt_back = self.prompt
445 self.prompt = '(com) '
446 self.commands_defining = True
Georg Brandl44f8bf92010-07-30 08:54:49 +0000447 try:
448 self.cmdloop()
449 finally:
450 self.commands_defining = False
451 self.prompt = prompt_back
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000452
Tim Peters2344fae2001-01-15 00:50:52 +0000453 def do_break(self, arg, temporary = 0):
Georg Brandl0d089622010-07-30 16:00:46 +0000454 """b(reak) [ ([filename:]lineno | function) [, condition] ]
455 Without argument, list all breaks.
456
457 With a line number argument, set a break at this line in the
458 current file. With a function name, set a break at the first
459 executable line of that function. If a second argument is
460 present, it is a string specifying an expression which must
461 evaluate to true before the breakpoint is honored.
462
463 The line number may be prefixed with a filename and a colon,
464 to specify a breakpoint in another file (probably one that
465 hasn't been loaded yet). The file is searched for on
466 sys.path; the .py suffix may be omitted.
467 """
Tim Peters2344fae2001-01-15 00:50:52 +0000468 if not arg:
469 if self.breaks: # There's at least one
Georg Brandl0d089622010-07-30 16:00:46 +0000470 self.message("Num Type Disp Enb Where")
Tim Peters2344fae2001-01-15 00:50:52 +0000471 for bp in bdb.Breakpoint.bpbynumber:
472 if bp:
Georg Brandl0d089622010-07-30 16:00:46 +0000473 self.message(bp.bpformat())
Tim Peters2344fae2001-01-15 00:50:52 +0000474 return
475 # parse arguments; comma has lowest precedence
476 # and cannot occur in filename
477 filename = None
478 lineno = None
479 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000480 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000481 if comma > 0:
482 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000483 cond = arg[comma+1:].lstrip()
484 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000485 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000486 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000487 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000488 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000489 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000490 f = self.lookupmodule(filename)
491 if not f:
Georg Brandl0d089622010-07-30 16:00:46 +0000492 self.error('%r not found from sys.path' % filename)
Tim Peters2344fae2001-01-15 00:50:52 +0000493 return
494 else:
495 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000496 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000497 try:
498 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000499 except ValueError as msg:
Georg Brandl0d089622010-07-30 16:00:46 +0000500 self.error('Bad lineno: %s' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000501 return
502 else:
503 # no colon; can be lineno or function
504 try:
505 lineno = int(arg)
506 except ValueError:
507 try:
508 func = eval(arg,
509 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000510 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000511 except:
512 func = arg
513 try:
Christian Heimesff737952007-11-27 10:40:20 +0000514 if hasattr(func, '__func__'):
515 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000516 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000517 #use co_name to identify the bkpt (function names
518 #could be aliased, but co_name is invariant)
519 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000520 lineno = code.co_firstlineno
521 filename = code.co_filename
522 except:
523 # last thing to try
524 (ok, filename, ln) = self.lineinfo(arg)
525 if not ok:
Georg Brandl0d089622010-07-30 16:00:46 +0000526 self.error('The specified object %r is not a function '
527 'or was not found along sys.path.' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000528 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000529 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000530 lineno = int(ln)
531 if not filename:
532 filename = self.defaultFile()
533 # Check for reasonable breakpoint
534 line = self.checkline(filename, lineno)
535 if line:
536 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000537 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl0d089622010-07-30 16:00:46 +0000538 if err:
539 self.error(err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000540 else:
541 bp = self.get_breaks(filename, line)[-1]
Georg Brandl0d089622010-07-30 16:00:46 +0000542 self.message("Breakpoint %d at %s:%d" %
543 (bp.number, bp.file, bp.line))
Tim Peters2344fae2001-01-15 00:50:52 +0000544
545 # To be overridden in derived debuggers
546 def defaultFile(self):
547 """Produce a reasonable default."""
548 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000549 if filename == '<string>' and self.mainpyfile:
550 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000551 return filename
552
553 do_b = do_break
554
555 def do_tbreak(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000556 """tbreak [ ([filename:]lineno | function) [, condition] ]
557 Same arguments as break, but sets a temporary breakpoint: it
558 is automatically deleted when first hit.
559 """
Tim Peters2344fae2001-01-15 00:50:52 +0000560 self.do_break(arg, 1)
561
562 def lineinfo(self, identifier):
563 failed = (None, None, None)
564 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000565 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000566 if len(idstring) == 1:
567 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000568 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000569 elif len(idstring) == 3:
570 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000571 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000572 else:
573 return failed
574 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000575 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000576 # Protection for derived debuggers
577 if parts[0] == 'self':
578 del parts[0]
579 if len(parts) == 0:
580 return failed
581 # Best first guess at file to look at
582 fname = self.defaultFile()
583 if len(parts) == 1:
584 item = parts[0]
585 else:
586 # More than one part.
587 # First is module, second is method/class
588 f = self.lookupmodule(parts[0])
589 if f:
590 fname = f
591 item = parts[1]
592 answer = find_function(item, fname)
593 return answer or failed
594
595 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000596 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000597
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000598 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
599 line or EOF). Warning: testing is not comprehensive.
600 """
Georg Brandl1e30bd32010-07-30 07:21:26 +0000601 # this method should be callable before starting debugging, so default
602 # to "no globals" if there is no current frame
603 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
604 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000605 if not line:
Georg Brandl0d089622010-07-30 16:00:46 +0000606 self.message('End of file')
Tim Peters2344fae2001-01-15 00:50:52 +0000607 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000608 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000609 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000610 if (not line or (line[0] == '#') or
611 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl0d089622010-07-30 16:00:46 +0000612 self.error('Blank or comment')
Tim Peters2344fae2001-01-15 00:50:52 +0000613 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000614 return lineno
615
616 def do_enable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000617 """enable bpnumber [bpnumber ...]
618 Enables the breakpoints given as a space separated list of
619 breakpoint numbers.
620 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000621 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000622 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000623 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000624 bp = self.get_bpbynumber(i)
625 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000626 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000627 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000628 bp.enable()
Georg Brandl0d089622010-07-30 16:00:46 +0000629 self.message('Enabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000630
631 def do_disable(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000632 """disable bpnumber [bpnumber ...]
633 Disables the breakpoints given as a space separated list of
634 breakpoint numbers. Disabling a breakpoint means it cannot
635 cause the program to stop execution, but unlike clearing a
636 breakpoint, it remains in the list of breakpoints and can be
637 (re-)enabled.
638 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000639 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000640 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000641 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000642 bp = self.get_bpbynumber(i)
643 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000644 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000645 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000646 bp.disable()
Georg Brandl0d089622010-07-30 16:00:46 +0000647 self.message('Disabled %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000648
649 def do_condition(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000650 """condition bpnumber [condition]
651 Set a new condition for the breakpoint, an expression which
652 must evaluate to true before the breakpoint is honored. If
653 condition is absent, any existing condition is removed; i.e.,
654 the breakpoint is made unconditional.
655 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000656 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000657 try:
Tim Peters2344fae2001-01-15 00:50:52 +0000658 cond = args[1]
Georg Brandl7410dd12010-07-30 12:01:20 +0000659 except IndexError:
Tim Peters2344fae2001-01-15 00:50:52 +0000660 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000661 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000662 bp = self.get_bpbynumber(args[0].strip())
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.cond = cond
667 if not cond:
Georg Brandl0d089622010-07-30 16:00:46 +0000668 self.message('Breakpoint %d is now unconditional.' % bp.number)
Georg Brandl7410dd12010-07-30 12:01:20 +0000669 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000670 self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000671
Georg Brandl7410dd12010-07-30 12:01:20 +0000672 def do_ignore(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000673 """ignore bpnumber [count]
674 Set the ignore count for the given breakpoint number. If
675 count is omitted, the ignore count is set to 0. A breakpoint
676 becomes active when the ignore count is zero. When non-zero,
677 the count is decremented each time the breakpoint is reached
678 and the breakpoint is not disabled and any associated
679 condition evaluates to true.
680 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000681 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000682 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000683 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000684 except:
685 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000686 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000687 bp = self.get_bpbynumber(args[0].strip())
688 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000689 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000690 else:
Tim Peters2344fae2001-01-15 00:50:52 +0000691 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000692 if count > 0:
Guido van Rossum08454592002-07-12 13:10:53 +0000693 if count > 1:
Georg Brandl0d089622010-07-30 16:00:46 +0000694 countstr = '%d crossings' % count
Tim Peters2344fae2001-01-15 00:50:52 +0000695 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000696 countstr = '1 crossing'
697 self.message('Will ignore next %s of breakpoint %d.' %
698 (countstr, bp.number))
Tim Peters2344fae2001-01-15 00:50:52 +0000699 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000700 self.message('Will stop next time breakpoint %d is reached.'
701 % bp.number)
Tim Peters2344fae2001-01-15 00:50:52 +0000702
703 def do_clear(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000704 """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
705 With a space separated list of breakpoint numbers, clear
706 those breakpoints. Without argument, clear all breaks (but
707 first ask confirmation). With a filename:lineno argument,
708 clear all breaks at that line in that file.
709 """
Tim Peters2344fae2001-01-15 00:50:52 +0000710 if not arg:
711 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000712 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000713 except EOFError:
714 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000715 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000716 if reply in ('y', 'yes'):
Georg Brandl7410dd12010-07-30 12:01:20 +0000717 bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters2344fae2001-01-15 00:50:52 +0000718 self.clear_all_breaks()
Georg Brandl7410dd12010-07-30 12:01:20 +0000719 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000720 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000721 return
722 if ':' in arg:
723 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000724 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000725 filename = arg[:i]
726 arg = arg[i+1:]
727 try:
728 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000729 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000730 err = "Invalid line number (%s)" % arg
731 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000732 bplist = self.get_breaks(filename, lineno)
Tim Peters2344fae2001-01-15 00:50:52 +0000733 err = self.clear_break(filename, lineno)
Georg Brandl7410dd12010-07-30 12:01:20 +0000734 if err:
Georg Brandl0d089622010-07-30 16:00:46 +0000735 self.error(err)
Georg Brandl7410dd12010-07-30 12:01:20 +0000736 else:
737 for bp in bplist:
Georg Brandl0d089622010-07-30 16:00:46 +0000738 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000739 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000740 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000741 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000742 try:
Georg Brandl7410dd12010-07-30 12:01:20 +0000743 bp = self.get_bpbynumber(i)
744 except ValueError as err:
Georg Brandl0d089622010-07-30 16:00:46 +0000745 self.error(err)
Tim Peters2344fae2001-01-15 00:50:52 +0000746 else:
Georg Brandl7410dd12010-07-30 12:01:20 +0000747 self.clear_break(bp.file, bp.line)
Georg Brandl0d089622010-07-30 16:00:46 +0000748 self.message('Deleted %s' % bp)
Tim Peters2344fae2001-01-15 00:50:52 +0000749 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
750
751 def do_where(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000752 """w(here)
753 Print a stack trace, with the most recent frame at the bottom.
754 An arrow indicates the "current frame", which determines the
755 context of most commands. 'bt' is an alias for this command.
756 """
Tim Peters2344fae2001-01-15 00:50:52 +0000757 self.print_stack_trace()
758 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000759 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000760
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000761 def _select_frame(self, number):
762 assert 0 <= number < len(self.stack)
763 self.curindex = number
764 self.curframe = self.stack[self.curindex][0]
765 self.curframe_locals = self.curframe.f_locals
766 self.print_stack_entry(self.stack[self.curindex])
767 self.lineno = None
768
Tim Peters2344fae2001-01-15 00:50:52 +0000769 def do_up(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000770 """u(p) [count]
771 Move the current frame count (default one) levels up in the
772 stack trace (to an older frame).
773 """
Tim Peters2344fae2001-01-15 00:50:52 +0000774 if self.curindex == 0:
Georg Brandl0d089622010-07-30 16:00:46 +0000775 self.error('Oldest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000776 return
777 try:
778 count = int(arg or 1)
779 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000780 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000781 return
782 if count < 0:
783 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000784 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000785 newframe = max(0, self.curindex - count)
786 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000787 do_u = do_up
788
789 def do_down(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000790 """d(own) [count]
791 Move the current frame count (default one) levels down in the
792 stack trace (to a newer frame).
793 """
Tim Peters2344fae2001-01-15 00:50:52 +0000794 if self.curindex + 1 == len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000795 self.error('Newest frame')
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000796 return
797 try:
798 count = int(arg or 1)
799 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000800 self.error('Invalid frame count (%s)' % arg)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000801 return
802 if count < 0:
803 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000804 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000805 newframe = min(len(self.stack) - 1, self.curindex + count)
806 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000807 do_d = do_down
808
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000809 def do_until(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000810 """unt(il) [lineno]
811 Without argument, continue execution until the line with a
812 number greater than the current one is reached. With a line
813 number, continue execution until a line with a number greater
814 or equal to that is reached. In both cases, also stop when
815 the current frame returns.
816 """
Georg Brandl2dfec552010-07-30 08:43:32 +0000817 if arg:
818 try:
819 lineno = int(arg)
820 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000821 self.error('Error in argument: %r' % arg)
Georg Brandl2dfec552010-07-30 08:43:32 +0000822 return
823 if lineno <= self.curframe.f_lineno:
Georg Brandl0d089622010-07-30 16:00:46 +0000824 self.error('"until" line number is smaller than current '
825 'line number')
Georg Brandl2dfec552010-07-30 08:43:32 +0000826 return
827 else:
828 lineno = None
829 self.set_until(self.curframe, lineno)
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000830 return 1
831 do_unt = do_until
832
Tim Peters2344fae2001-01-15 00:50:52 +0000833 def do_step(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000834 """s(tep)
835 Execute the current line, stop at the first possible occasion
836 (either in a function that is called or in the current
837 function).
838 """
Tim Peters2344fae2001-01-15 00:50:52 +0000839 self.set_step()
840 return 1
841 do_s = do_step
842
843 def do_next(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000844 """n(ext)
845 Continue execution until the next line in the current function
846 is reached or it returns.
847 """
Tim Peters2344fae2001-01-15 00:50:52 +0000848 self.set_next(self.curframe)
849 return 1
850 do_n = do_next
851
Guido van Rossumd8faa362007-04-27 19:54:29 +0000852 def do_run(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000853 """run [args...]
854 Restart the debugged python program. If a string is supplied
855 it is splitted with "shlex", and the result is used as the new
856 sys.argv. History, breakpoints, actions and debugger options
857 are preserved. "restart" is an alias for "run".
858 """
Guido van Rossumd8faa362007-04-27 19:54:29 +0000859 if arg:
860 import shlex
861 argv0 = sys.argv[0:1]
862 sys.argv = shlex.split(arg)
863 sys.argv[:0] = argv0
Georg Brandl0d089622010-07-30 16:00:46 +0000864 # this is caught in the main debugger loop
Guido van Rossumd8faa362007-04-27 19:54:29 +0000865 raise Restart
866
867 do_restart = do_run
868
Tim Peters2344fae2001-01-15 00:50:52 +0000869 def do_return(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000870 """r(eturn)
871 Continue execution until the current function returns.
872 """
Tim Peters2344fae2001-01-15 00:50:52 +0000873 self.set_return(self.curframe)
874 return 1
875 do_r = do_return
876
877 def do_continue(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000878 """c(ont(inue))
879 Continue execution, only stop when a breakpoint is encountered.
880 """
Tim Peters2344fae2001-01-15 00:50:52 +0000881 self.set_continue()
882 return 1
883 do_c = do_cont = do_continue
884
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000885 def do_jump(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000886 """j(ump) lineno
887 Set the next line that will be executed. Only available in
888 the bottom-most frame. This lets you jump back and execute
889 code again, or jump forward to skip code that you don't want
890 to run.
891
892 It should be noted that not all jumps are allowed -- for
893 instance it is not possible to jump into the middle of a
894 for loop or out of a finally clause.
895 """
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000896 if self.curindex + 1 != len(self.stack):
Georg Brandl0d089622010-07-30 16:00:46 +0000897 self.error('You can only jump within the bottom frame')
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000898 return
899 try:
900 arg = int(arg)
901 except ValueError:
Georg Brandl0d089622010-07-30 16:00:46 +0000902 self.error("The 'jump' command requires a line number")
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000903 else:
904 try:
905 # Do the jump, fix up our copy of the stack, and display the
906 # new position
907 self.curframe.f_lineno = arg
908 self.stack[self.curindex] = self.stack[self.curindex][0], arg
909 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000910 except ValueError as e:
Georg Brandl0d089622010-07-30 16:00:46 +0000911 self.error('Jump failed: %s' % e)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000912 do_j = do_jump
913
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000914 def do_debug(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000915 """debug code
916 Enter a recursive debugger that steps through the code
917 argument (which is an arbitrary expression or statement to be
918 executed in the current environment).
919 """
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000920 sys.settrace(None)
921 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +0000922 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000923 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000924 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl0d089622010-07-30 16:00:46 +0000925 self.message("ENTERING RECURSIVE DEBUGGER")
Guido van Rossumed538d82003-04-09 19:36:34 +0000926 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl0d089622010-07-30 16:00:46 +0000927 self.message("LEAVING RECURSIVE DEBUGGER")
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000928 sys.settrace(self.trace_dispatch)
929 self.lastcmd = p.lastcmd
930
Tim Peters2344fae2001-01-15 00:50:52 +0000931 def do_quit(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000932 """q(uit)\nexit
933 Quit from the debugger. The program being executed is aborted.
934 """
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000935 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000936 self.set_quit()
937 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000938
Tim Peters2344fae2001-01-15 00:50:52 +0000939 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000940 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000941
Guido van Rossumeef26072003-01-13 21:13:55 +0000942 def do_EOF(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000943 """EOF
944 Handles the receipt of EOF as a command.
945 """
946 self.message('')
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000947 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000948 self.set_quit()
949 return 1
950
Tim Peters2344fae2001-01-15 00:50:52 +0000951 def do_args(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000952 """a(rgs)
953 Print the argument list of the current function.
954 """
Benjamin Petersond23f8222009-04-05 19:13:16 +0000955 co = self.curframe.f_code
956 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000957 n = co.co_argcount
958 if co.co_flags & 4: n = n+1
959 if co.co_flags & 8: n = n+1
960 for i in range(n):
961 name = co.co_varnames[i]
Georg Brandl0d089622010-07-30 16:00:46 +0000962 if name in dict:
963 self.message('%s = %r' % (name, dict[name]))
964 else:
965 self.message('%s = *** undefined ***' % (name,))
Tim Peters2344fae2001-01-15 00:50:52 +0000966 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000967
Tim Peters2344fae2001-01-15 00:50:52 +0000968 def do_retval(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000969 """retval
970 Print the return value for the last return of a function.
971 """
Benjamin Petersond23f8222009-04-05 19:13:16 +0000972 if '__return__' in self.curframe_locals:
Georg Brandl0d089622010-07-30 16:00:46 +0000973 self.message(repr(self.curframe_locals['__return__']))
Tim Peters2344fae2001-01-15 00:50:52 +0000974 else:
Georg Brandl0d089622010-07-30 16:00:46 +0000975 self.error('Not yet returned!')
Tim Peters2344fae2001-01-15 00:50:52 +0000976 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000977
Barry Warsaw210bd202002-11-05 22:40:20 +0000978 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000979 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000980 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000981 except:
Georg Brandl0d089622010-07-30 16:00:46 +0000982 exc_info = sys.exc_info()[:2]
983 self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Barry Warsaw210bd202002-11-05 22:40:20 +0000984 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000985
Barry Warsaw210bd202002-11-05 22:40:20 +0000986 def do_p(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000987 """p(rint) expression
988 Print the value of the expression.
989 """
Barry Warsaw210bd202002-11-05 22:40:20 +0000990 try:
Georg Brandl0d089622010-07-30 16:00:46 +0000991 self.message(repr(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +0000992 except:
993 pass
Georg Brandlc9879242007-09-04 07:07:56 +0000994 # make "print" an alias of "p" since print isn't a Python statement anymore
995 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +0000996
997 def do_pp(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +0000998 """pp expression
999 Pretty-print the value of the expression.
1000 """
Barry Warsaw210bd202002-11-05 22:40:20 +00001001 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001002 self.message(pprint.pformat(self._getval(arg)))
Barry Warsaw210bd202002-11-05 22:40:20 +00001003 except:
1004 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001005
Tim Peters2344fae2001-01-15 00:50:52 +00001006 def do_list(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001007 """l(ist) [first [,last] | .]
1008 List source code for the current file.
1009 Without arguments, list 11 lines around the current line
1010 or continue the previous listing.
1011 With . as argument, list 11 lines around the current line.
1012 With one argument, list 11 lines starting at that line.
1013 With two arguments, list the given range;
1014 if the second argument is less than the first, it is a count.
1015 """
Tim Peters2344fae2001-01-15 00:50:52 +00001016 self.lastcmd = 'list'
1017 last = None
Georg Brandla91a94b2010-07-30 07:14:01 +00001018 if arg and arg != '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001019 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001020 if ',' in arg:
1021 first, last = arg.split(',')
1022 first = int(first.strip())
1023 last = int(last.strip())
Tim Peters2344fae2001-01-15 00:50:52 +00001024 if last < first:
Georg Brandl0d089622010-07-30 16:00:46 +00001025 # assume it's a count
Tim Peters2344fae2001-01-15 00:50:52 +00001026 last = first + last
1027 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001028 first = int(arg.strip())
1029 first = max(1, first - 5)
1030 except ValueError:
1031 self.error('Error in argument: %r' % arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001032 return
Georg Brandla91a94b2010-07-30 07:14:01 +00001033 elif self.lineno is None or arg == '.':
Tim Peters2344fae2001-01-15 00:50:52 +00001034 first = max(1, self.curframe.f_lineno - 5)
1035 else:
1036 first = self.lineno + 1
1037 if last is None:
1038 last = first + 10
1039 filename = self.curframe.f_code.co_filename
1040 breaklist = self.get_file_breaks(filename)
1041 try:
Georg Brandle59ca2a2010-07-30 17:04:28 +00001042 # XXX add tb_lineno feature
1043 lines = linecache.getlines(filename, self.curframe.f_globals)
1044 self._print_lines(lines[first-1:last], first, breaklist,
1045 self.curframe.f_lineno, -1)
1046 self.lineno = min(last, len(lines))
1047 if len(lines) < last:
1048 self.message('[EOF]')
Tim Peters2344fae2001-01-15 00:50:52 +00001049 except KeyboardInterrupt:
1050 pass
1051 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +00001052
Georg Brandle59ca2a2010-07-30 17:04:28 +00001053 def do_longlist(self, arg):
1054 """longlist | ll
1055 List the whole source code for the current function or frame.
1056 """
1057 filename = self.curframe.f_code.co_filename
1058 breaklist = self.get_file_breaks(filename)
1059 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001060 lines, lineno = getsourcelines(self.curframe)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001061 except IOError as err:
1062 self.error(err)
1063 return
1064 self._print_lines(lines, lineno, breaklist, self.curframe.f_lineno, -1)
1065 do_ll = do_longlist
1066
1067 def do_source(self, arg):
1068 """source expression
1069 Try to get source code for the given object and display it.
1070 """
1071 try:
1072 obj = self._getval(arg)
1073 except:
1074 return
1075 try:
Georg Brandl5ed2b5a2010-07-30 18:08:12 +00001076 lines, lineno = getsourcelines(obj)
Georg Brandle59ca2a2010-07-30 17:04:28 +00001077 except (IOError, TypeError) as err:
1078 self.error(err)
1079 return
1080 self._print_lines(lines, lineno, [], -1, -1)
1081
1082 def _print_lines(self, lines, start, breaks, current, special):
1083 """Print a range of lines."""
1084 for lineno, line in enumerate(lines, start):
1085 s = str(lineno).rjust(3)
1086 if len(s) < 4:
1087 s += ' '
1088 if lineno in breaks:
1089 s += 'B'
1090 else:
1091 s += ' '
1092 if lineno == current:
1093 s += '->'
1094 elif lineno == special:
1095 s += '>>'
1096 self.message(s + '\t' + line.rstrip())
1097
Tim Peters2344fae2001-01-15 00:50:52 +00001098 def do_whatis(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001099 """whatis arg
1100 Print the type of the argument.
1101 """
Tim Peters2344fae2001-01-15 00:50:52 +00001102 try:
Georg Brandl0d089622010-07-30 16:00:46 +00001103 value = self._getval(arg)
Tim Peters2344fae2001-01-15 00:50:52 +00001104 except:
Georg Brandl0d089622010-07-30 16:00:46 +00001105 # _getval() already printed the error
Tim Peters2344fae2001-01-15 00:50:52 +00001106 return
1107 code = None
1108 # Is it a function?
Georg Brandl0d089622010-07-30 16:00:46 +00001109 try:
1110 code = value.__code__
1111 except Exception:
1112 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001113 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001114 self.message('Function %s' % code.co_name)
Tim Peters2344fae2001-01-15 00:50:52 +00001115 return
1116 # Is it an instance method?
Georg Brandl0d089622010-07-30 16:00:46 +00001117 try:
1118 code = value.__func__.__code__
1119 except Exception:
1120 pass
Tim Peters2344fae2001-01-15 00:50:52 +00001121 if code:
Georg Brandl0d089622010-07-30 16:00:46 +00001122 self.message('Method %s' % code.co_name)
1123 return
1124 # Is it a class?
1125 if value.__class__ is type:
1126 self.message('Class %s.%s' % (value.__module__, value.__name__))
Tim Peters2344fae2001-01-15 00:50:52 +00001127 return
1128 # None of the above...
Georg Brandl0d089622010-07-30 16:00:46 +00001129 self.message(type(value))
Guido van Rossum8e2ec561993-07-29 09:37:38 +00001130
Tim Peters2344fae2001-01-15 00:50:52 +00001131 def do_alias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001132 """alias [name [command [parameter parameter ...] ]]
1133 Create an alias called 'name' that executes 'command'. The
1134 command must *not* be enclosed in quotes. Replaceable
1135 parameters can be indicated by %1, %2, and so on, while %* is
1136 replaced by all the parameters. If no command is given, the
1137 current alias for name is shown. If no name is given, all
1138 aliases are listed.
1139
1140 Aliases may be nested and can contain anything that can be
1141 legally typed at the pdb prompt. Note! You *can* override
1142 internal pdb commands with aliases! Those internal commands
1143 are then hidden until the alias is removed. Aliasing is
1144 recursively applied to the first word of the command line; all
1145 other words in the line are left alone.
1146
1147 As an example, here are two useful aliases (especially when
1148 placed in the .pdbrc file):
1149
1150 # Print instance variables (usage "pi classInst")
1151 alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
1152 # Print instance variables in self
1153 alias ps pi self
1154 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001155 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001156 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +00001157 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +00001158 for alias in keys:
Georg Brandl0d089622010-07-30 16:00:46 +00001159 self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters2344fae2001-01-15 00:50:52 +00001160 return
Guido van Rossum08454592002-07-12 13:10:53 +00001161 if args[0] in self.aliases and len(args) == 1:
Georg Brandl0d089622010-07-30 16:00:46 +00001162 self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters2344fae2001-01-15 00:50:52 +00001163 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001164 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +00001165
Tim Peters2344fae2001-01-15 00:50:52 +00001166 def do_unalias(self, arg):
Georg Brandl0d089622010-07-30 16:00:46 +00001167 """unalias name
1168 Delete the specified alias.
1169 """
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +00001170 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +00001171 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +00001172 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +00001173 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +00001174
Georg Brandl0d089622010-07-30 16:00:46 +00001175 # List of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001176 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
1177 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001178
Tim Peters2344fae2001-01-15 00:50:52 +00001179 # Print a traceback starting at the top stack frame.
1180 # The most recently entered frame is printed last;
1181 # this is different from dbx and gdb, but consistent with
1182 # the Python interpreter's stack trace.
1183 # It is also consistent with the up/down commands (which are
1184 # compatible with dbx and gdb: up moves towards 'main()'
1185 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +00001186
Tim Peters2344fae2001-01-15 00:50:52 +00001187 def print_stack_trace(self):
1188 try:
1189 for frame_lineno in self.stack:
1190 self.print_stack_entry(frame_lineno)
1191 except KeyboardInterrupt:
1192 pass
Guido van Rossum2424f851998-09-11 22:50:09 +00001193
Tim Peters2344fae2001-01-15 00:50:52 +00001194 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
1195 frame, lineno = frame_lineno
1196 if frame is self.curframe:
Georg Brandl0d089622010-07-30 16:00:46 +00001197 prefix = '> '
Tim Peters2344fae2001-01-15 00:50:52 +00001198 else:
Georg Brandl0d089622010-07-30 16:00:46 +00001199 prefix = ' '
1200 self.message(prefix +
1201 self.format_stack_entry(frame_lineno, prompt_prefix))
Guido van Rossum2424f851998-09-11 22:50:09 +00001202
Georg Brandl0d089622010-07-30 16:00:46 +00001203 # Provide help
Guido van Rossum921c8241992-01-10 14:54:42 +00001204
Georg Brandl0d089622010-07-30 16:00:46 +00001205 def do_help(self, arg):
1206 """h(elp)
1207 Without argument, print the list of available commands.
1208 With a command name as argument, print help about that command.
1209 "help pdb" shows the full pdb documentation.
1210 "help exec" gives help on the ! command.
1211 """
1212 if not arg:
1213 return cmd.Cmd.do_help(self, arg)
1214 try:
1215 try:
1216 topic = getattr(self, 'help_' + arg)
1217 return topic()
1218 except AttributeError:
1219 command = getattr(self, 'do_' + arg)
1220 except AttributeError:
1221 self.error('No help for %r' % arg)
1222 else:
1223 self.message(command.__doc__.rstrip())
Guido van Rossum921c8241992-01-10 14:54:42 +00001224
Georg Brandl0d089622010-07-30 16:00:46 +00001225 do_h = do_help
Barry Warsaw210bd202002-11-05 22:40:20 +00001226
Tim Peters2344fae2001-01-15 00:50:52 +00001227 def help_exec(self):
Georg Brandl0d089622010-07-30 16:00:46 +00001228 """(!) statement
1229 Execute the (one-line) statement in the context of the current
1230 stack frame. The exclamation point can be omitted unless the
1231 first word of the statement resembles a debugger command. To
1232 assign to a global variable you must always prefix the command
1233 with a 'global' command, e.g.:
1234 (Pdb) global list_options; list_options = ['-l']
1235 (Pdb)
1236 """
1237 self.message(self.help_exec.__doc__.strip())
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001238
Tim Peters2344fae2001-01-15 00:50:52 +00001239 def help_pdb(self):
1240 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001241
Georg Brandl0d089622010-07-30 16:00:46 +00001242 # other helper functions
1243
Tim Peters2344fae2001-01-15 00:50:52 +00001244 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001245 """Helper function for break/clear parsing -- may be overridden.
1246
1247 lookupmodule() translates (possibly incomplete) file or module name
1248 into an absolute file name.
1249 """
1250 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001251 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001252 f = os.path.join(sys.path[0], filename)
1253 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1254 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001255 root, ext = os.path.splitext(filename)
1256 if ext == '':
1257 filename = filename + '.py'
1258 if os.path.isabs(filename):
1259 return filename
1260 for dirname in sys.path:
1261 while os.path.islink(dirname):
1262 dirname = os.readlink(dirname)
1263 fullname = os.path.join(dirname, filename)
1264 if os.path.exists(fullname):
1265 return fullname
1266 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001267
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001268 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001269 # The script has to run in __main__ namespace (or imports from
1270 # __main__ will break).
1271 #
1272 # So we clear up the __main__ and set several special variables
1273 # (this gets rid of pdb's globals and cleans old variables on restarts).
1274 import __main__
1275 __main__.__dict__.clear()
1276 __main__.__dict__.update({"__name__" : "__main__",
1277 "__file__" : filename,
1278 "__builtins__": __builtins__,
1279 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001280
1281 # When bdb sets tracing, a number of call and line events happens
1282 # BEFORE debugger even reaches user's code (and the exact sequence of
1283 # events depends on python version). So we take special measures to
1284 # avoid stopping before we reach the main script (see user_line and
1285 # user_call for details).
1286 self._wait_for_mainpyfile = 1
1287 self.mainpyfile = self.canonic(filename)
1288 self._user_requested_quit = 0
Georg Brandld07ac642009-08-13 07:50:57 +00001289 with open(filename, "rb") as fp:
1290 statement = "exec(compile(%r, %r, 'exec'))" % \
1291 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001292 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001293
Georg Brandl0d089622010-07-30 16:00:46 +00001294# Collect all command help into docstring
1295
1296# unfortunately we can't guess this order from the class definition
1297_help_order = [
1298 'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
1299 'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
Georg Brandle59ca2a2010-07-30 17:04:28 +00001300 'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
1301 'args', 'print', 'pp', 'whatis', 'source', 'alias', 'unalias',
1302 'debug', 'quit',
Georg Brandl0d089622010-07-30 16:00:46 +00001303]
1304
Georg Brandle59ca2a2010-07-30 17:04:28 +00001305docs = set()
Georg Brandl0d089622010-07-30 16:00:46 +00001306for _command in _help_order:
1307 __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
1308__doc__ += Pdb.help_exec.__doc__
1309
1310del _help_order, _command
1311
Guido van Rossum35771131992-09-08 11:59:04 +00001312# Simplified interface
1313
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001314def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001315 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001316
1317def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001318 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001319
1320def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001321 # B/W compatibility
1322 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001323
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001324def runcall(*args, **kwds):
1325 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001326
Guido van Rossumb6775db1994-08-01 11:34:53 +00001327def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001328 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001329
1330# Post-Mortem interface
1331
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001332def post_mortem(t=None):
1333 # handling the default
1334 if t is None:
1335 # sys.exc_info() returns (type, value, traceback) if an exception is
1336 # being handled, otherwise it returns None
1337 t = sys.exc_info()[2]
Georg Brandl0d089622010-07-30 16:00:46 +00001338 if t is None:
1339 raise ValueError("A valid traceback must be passed if no "
1340 "exception is being handled")
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001341
Tim Peters2344fae2001-01-15 00:50:52 +00001342 p = Pdb()
1343 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001344 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001345
1346def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001347 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001348
1349
1350# Main program for testing
1351
Guido van Rossum23efba41992-01-27 16:58:47 +00001352TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001353
Guido van Rossum921c8241992-01-10 14:54:42 +00001354def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001355 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001356
1357# print help
1358def help():
Georg Brandl02053ee2010-07-18 10:11:03 +00001359 import pydoc
1360 pydoc.pager(__doc__)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001361
Georg Brandle0230912010-07-30 08:29:39 +00001362_usage = """\
1363usage: pdb.py [-c command] ... pyfile [arg] ...
1364
1365Debug the Python program given by pyfile.
1366
1367Initial commands are read from .pdbrc files in your home directory
1368and in the current directory, if they exist. Commands supplied with
1369-c are executed after commands from .pdbrc files.
1370
1371To let the script run until an exception occurs, use "-c continue".
Georg Brandl2dfec552010-07-30 08:43:32 +00001372To let the script run up to a given line X in the debugged file, use
1373"-c 'until X'"."""
Georg Brandle0230912010-07-30 08:29:39 +00001374
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001375def main():
Georg Brandle0230912010-07-30 08:29:39 +00001376 import getopt
1377
1378 opts, args = getopt.getopt(sys.argv[1:], 'hc:', ['--help', '--command='])
1379
1380 if not args:
1381 print(_usage)
Tim Peters2344fae2001-01-15 00:50:52 +00001382 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001383
Georg Brandle0230912010-07-30 08:29:39 +00001384 commands = []
1385 for opt, optarg in opts:
1386 if opt in ['-h', '--help']:
1387 print(_usage)
1388 sys.exit()
1389 elif opt in ['-c', '--command']:
1390 commands.append(optarg)
1391
1392 mainpyfile = args[0] # Get script filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001393 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001394 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001395 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001396
Georg Brandle0230912010-07-30 08:29:39 +00001397 sys.argv[:] = args # Hide "pdb.py" and pdb options from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001398
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001399 # Replace pdb's dir with script's dir in front of module search path.
1400 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001401
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001402 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1403 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001404 # changed by the user from the command line. There is a "restart" command
1405 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001406 pdb = Pdb()
Georg Brandle0230912010-07-30 08:29:39 +00001407 pdb.rcLines.extend(commands)
Georg Brandl1e30bd32010-07-30 07:21:26 +00001408 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001409 try:
1410 pdb._runscript(mainpyfile)
1411 if pdb._user_requested_quit:
1412 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001413 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001414 except Restart:
1415 print("Restarting", mainpyfile, "with arguments:")
Georg Brandle0230912010-07-30 08:29:39 +00001416 print("\t" + " ".join(args))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001417 except SystemExit:
1418 # In most cases SystemExit does not warrant a post-mortem session.
Georg Brandle0230912010-07-30 08:29:39 +00001419 print("The program exited via sys.exit(). Exit status:", end=' ')
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001420 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001421 except:
1422 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001423 print("Uncaught exception. Entering post mortem debugging")
1424 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001425 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001426 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001427 print("Post mortem debugger finished. The " + mainpyfile +
1428 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001429
1430
1431# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001432if __name__ == '__main__':
1433 import pdb
1434 pdb.main()