blob: 0751c17667d4bc5c4c2a27137993e5bd25c718bb [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumf17361d1996-07-30 16:28:13 +00002
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00003"""A Python debugger."""
Guido van Rossum92df0c61992-01-14 18:30:15 +00004
Guido van Rossum23efba41992-01-27 16:58:47 +00005# (See pdb.doc for documentation.)
Guido van Rossum921c8241992-01-10 14:54:42 +00006
Guido van Rossum921c8241992-01-10 14:54:42 +00007import sys
8import linecache
Guido van Rossum23efba41992-01-27 16:58:47 +00009import cmd
10import bdb
Brett Cannon2ee0e8e2008-05-23 05:03:59 +000011from repr import Repr
Guido van Rossumb5699c71998-07-20 23:13:54 +000012import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000013import re
Barry Warsaw210bd202002-11-05 22:40:20 +000014import pprint
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000015import traceback
Georg Brandl8e84c652007-03-13 21:08:15 +000016
17
18class Restart(Exception):
19 """Causes a debugger to be restarted for the debugged python program."""
20 pass
21
Guido van Rossumef1b41b2002-09-10 21:57:14 +000022# Create a custom safe Repr instance and increase its maxstring.
23# The default of 30 truncates error messages too easily.
24_repr = Repr()
25_repr.maxstring = 200
26_saferepr = _repr.repr
27
Skip Montanaro352674d2001-02-07 23:14:30 +000028__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
29 "post_mortem", "help"]
30
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000031def find_function(funcname, filename):
Andrew M. Kuchlinge6728252006-09-05 13:19:18 +000032 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000033 try:
34 fp = open(filename)
35 except IOError:
36 return None
37 # consumer of this info expects the first line to be 1
38 lineno = 1
39 answer = None
40 while 1:
41 line = fp.readline()
42 if line == '':
43 break
44 if cre.match(line):
45 answer = funcname, filename, lineno
46 break
47 lineno = lineno + 1
48 fp.close()
49 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +000050
51
Guido van Rossuma558e371994-11-10 22:27:35 +000052# Interaction prompt line will separate file and call info from code
53# text using value of line_prefix string. A newline and arrow may
54# be to your liking. You can set it once pdb is imported using the
55# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +000056# line_prefix = ': ' # Use this to get the old situation back
57line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +000058
Guido van Rossum23efba41992-01-27 16:58:47 +000059class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +000060
Georg Brandl4d4313d2009-05-05 08:54:11 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
62 bdb.Bdb.__init__(self, skip=skip)
Georg Brandl19564802006-05-10 17:13:20 +000063 cmd.Cmd.__init__(self, completekey, stdin, stdout)
64 if stdout:
65 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +000066 self.prompt = '(Pdb) '
67 self.aliases = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000068 self.mainpyfile = ''
69 self._wait_for_mainpyfile = 0
Tim Peters2344fae2001-01-15 00:50:52 +000070 # Try to load readline if it exists
71 try:
72 import readline
73 except ImportError:
74 pass
Guido van Rossum2424f851998-09-11 22:50:09 +000075
Tim Peters2344fae2001-01-15 00:50:52 +000076 # Read $HOME/.pdbrc and ./.pdbrc
77 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +000078 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +000079 envHome = os.environ['HOME']
80 try:
81 rcFile = open(os.path.join(envHome, ".pdbrc"))
82 except IOError:
83 pass
84 else:
85 for line in rcFile.readlines():
86 self.rcLines.append(line)
87 rcFile.close()
88 try:
89 rcFile = open(".pdbrc")
90 except IOError:
91 pass
92 else:
93 for line in rcFile.readlines():
94 self.rcLines.append(line)
95 rcFile.close()
Guido van Rossum23efba41992-01-27 16:58:47 +000096
Martin v. Löwisbd30f522006-04-17 17:08:37 +000097 self.commands = {} # associates a command list to breakpoint numbers
Georg Brandle361bcb2009-04-01 23:32:17 +000098 self.commands_doprompt = {} # for each bp num, tells if the prompt
99 # must be disp. after execing the cmd list
100 self.commands_silent = {} # for each bp num, tells if the stack trace
101 # must be disp. after execing the cmd list
102 self.commands_defining = False # True while in the process of defining
103 # a command list
104 self.commands_bnum = None # The breakpoint number for which we are
105 # defining a list
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000106
Tim Peters2344fae2001-01-15 00:50:52 +0000107 def reset(self):
108 bdb.Bdb.reset(self)
109 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000110
Tim Peters2344fae2001-01-15 00:50:52 +0000111 def forget(self):
112 self.lineno = None
113 self.stack = []
114 self.curindex = 0
115 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000116
Tim Peters2344fae2001-01-15 00:50:52 +0000117 def setup(self, f, t):
118 self.forget()
119 self.stack, self.curindex = self.get_stack(f, t)
120 self.curframe = self.stack[self.curindex][0]
Georg Brandle361bcb2009-04-01 23:32:17 +0000121 # The f_locals dictionary is updated from the actual frame
122 # locals whenever the .f_locals accessor is called, so we
123 # cache it here to ensure that modifications are not overwritten.
124 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000125 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126
Tim Peters2344fae2001-01-15 00:50:52 +0000127 # Can be executed earlier than 'setup' if desired
128 def execRcLines(self):
129 if self.rcLines:
130 # Make local copy because of recursion
131 rcLines = self.rcLines
132 # executed only once
133 self.rcLines = []
134 for line in rcLines:
135 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000136 if len(line) > 0 and line[0] != '#':
137 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000138
Tim Peters280488b2002-08-23 18:19:30 +0000139 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000140
141 def user_call(self, frame, argument_list):
142 """This method is called when there is the remote possibility
143 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 if self._wait_for_mainpyfile:
145 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000146 if self.stop_here(frame):
Georg Brandl19564802006-05-10 17:13:20 +0000147 print >>self.stdout, '--Call--'
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000148 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000149
Tim Peters2344fae2001-01-15 00:50:52 +0000150 def user_line(self, frame):
151 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000152 if self._wait_for_mainpyfile:
153 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
154 or frame.f_lineno<= 0):
155 return
156 self._wait_for_mainpyfile = 0
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000157 if self.bp_commands(frame):
158 self.interaction(frame, None)
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000159
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000160 def bp_commands(self,frame):
Georg Brandl58152202009-05-05 09:06:02 +0000161 """Call every command that was set for the current active breakpoint
162 (if there is one).
163
164 Returns True if the normal interaction function must be called,
165 False otherwise."""
166 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
167 if getattr(self, "currentbp", False) and \
168 self.currentbp in self.commands:
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000169 currentbp = self.currentbp
170 self.currentbp = 0
171 lastcmd_back = self.lastcmd
172 self.setup(frame, None)
173 for line in self.commands[currentbp]:
174 self.onecmd(line)
175 self.lastcmd = lastcmd_back
176 if not self.commands_silent[currentbp]:
177 self.print_stack_entry(self.stack[self.curindex])
178 if self.commands_doprompt[currentbp]:
Gregory P. Smith860852f2010-05-09 01:20:20 +0000179 self.cmdloop()
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000180 self.forget()
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000181 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000182 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000183
Tim Peters2344fae2001-01-15 00:50:52 +0000184 def user_return(self, frame, return_value):
185 """This function is called when a return trap is set here."""
186 frame.f_locals['__return__'] = return_value
Georg Brandl19564802006-05-10 17:13:20 +0000187 print >>self.stdout, '--Return--'
Tim Peters2344fae2001-01-15 00:50:52 +0000188 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000189
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000190 def user_exception(self, frame, exc_info):
191 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000192 """This function is called if an exception occurs,
193 but only if we are to stop at or just below this level."""
194 frame.f_locals['__exception__'] = exc_type, exc_value
195 if type(exc_type) == type(''):
196 exc_type_name = exc_type
197 else: exc_type_name = exc_type.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000198 print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters2344fae2001-01-15 00:50:52 +0000199 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000200
Tim Peters2344fae2001-01-15 00:50:52 +0000201 # General interaction function
202
203 def interaction(self, frame, traceback):
204 self.setup(frame, traceback)
205 self.print_stack_entry(self.stack[self.curindex])
Gregory P. Smith860852f2010-05-09 01:20:20 +0000206 self.cmdloop()
Tim Peters2344fae2001-01-15 00:50:52 +0000207 self.forget()
208
Georg Brandl58b8b952009-04-01 21:54:21 +0000209 def displayhook(self, obj):
210 """Custom displayhook for the exec in default(), which prevents
211 assignment of the _ variable in the builtins.
212 """
Georg Brandl69dfe8d2009-09-16 16:36:39 +0000213 # reproduce the behavior of the standard displayhook, not printing None
214 if obj is not None:
215 print repr(obj)
Georg Brandl58b8b952009-04-01 21:54:21 +0000216
Tim Peters2344fae2001-01-15 00:50:52 +0000217 def default(self, line):
218 if line[:1] == '!': line = line[1:]
Georg Brandle361bcb2009-04-01 23:32:17 +0000219 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000220 globals = self.curframe.f_globals
221 try:
222 code = compile(line + '\n', '<stdin>', 'single')
Amaury Forgeot d'Arcff0f2672008-01-15 21:25:11 +0000223 save_stdout = sys.stdout
224 save_stdin = sys.stdin
Georg Brandl58b8b952009-04-01 21:54:21 +0000225 save_displayhook = sys.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000226 try:
227 sys.stdin = self.stdin
228 sys.stdout = self.stdout
Georg Brandl58b8b952009-04-01 21:54:21 +0000229 sys.displayhook = self.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000230 exec code in globals, locals
231 finally:
232 sys.stdout = save_stdout
233 sys.stdin = save_stdin
Georg Brandl58b8b952009-04-01 21:54:21 +0000234 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000235 except:
236 t, v = sys.exc_info()[:2]
237 if type(t) == type(''):
238 exc_type_name = t
239 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000240 print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters2344fae2001-01-15 00:50:52 +0000241
242 def precmd(self, line):
243 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000244 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000245 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000246 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000247 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000248 line = self.aliases[args[0]]
249 ii = 1
250 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000251 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000252 tmpArg)
253 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000254 line = line.replace("%*", ' '.join(args[1:]))
255 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000256 # split into ';;' separated commands
257 # unless it's an alias command
258 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000259 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000260 if marker >= 0:
261 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000262 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000263 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000264 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000265 return line
266
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000267 def onecmd(self, line):
268 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000269 to the prompt.
270
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000271 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000272 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000273 """
274 if not self.commands_defining:
275 return cmd.Cmd.onecmd(self, line)
276 else:
277 return self.handle_command_def(line)
278
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000279 def handle_command_def(self,line):
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000280 """ Handles one command line during command list definition. """
281 cmd, arg, line = self.parseline(line)
282 if cmd == 'silent':
283 self.commands_silent[self.commands_bnum] = True
284 return # continue to handle other cmd def in the cmd list
285 elif cmd == 'end':
286 self.cmdqueue = []
287 return 1 # end of cmd list
288 cmdlist = self.commands[self.commands_bnum]
289 if (arg):
290 cmdlist.append(cmd+' '+arg)
291 else:
292 cmdlist.append(cmd)
293 # Determine if we must stop
294 try:
295 func = getattr(self, 'do_' + cmd)
296 except AttributeError:
297 func = self.default
Georg Brandl58152202009-05-05 09:06:02 +0000298 # one of the resuming commands
299 if func.func_name in self.commands_resuming:
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000300 self.commands_doprompt[self.commands_bnum] = False
301 self.cmdqueue = []
302 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000303 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000304
Tim Peters2344fae2001-01-15 00:50:52 +0000305 # Command definitions, called by cmdloop()
306 # The argument is the remaining string on the command line
307 # Return true to exit from the command loop
308
309 do_h = cmd.Cmd.do_help
310
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000311 def do_commands(self, arg):
Georg Brandl58152202009-05-05 09:06:02 +0000312 """Defines a list of commands associated to a breakpoint.
313
314 Those commands will be executed whenever the breakpoint causes
315 the program to stop execution."""
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000316 if not arg:
317 bnum = len(bdb.Breakpoint.bpbynumber)-1
318 else:
319 try:
320 bnum = int(arg)
321 except:
Georg Brandl58152202009-05-05 09:06:02 +0000322 print >>self.stdout, "Usage : commands [bnum]\n ..." \
323 "\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000324 return
325 self.commands_bnum = bnum
326 self.commands[bnum] = []
327 self.commands_doprompt[bnum] = True
328 self.commands_silent[bnum] = False
329 prompt_back = self.prompt
330 self.prompt = '(com) '
331 self.commands_defining = True
Gregory P. Smith860852f2010-05-09 01:20:20 +0000332 self.cmdloop()
333 self.commands_defining = False
334 self.prompt = prompt_back
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000335
Tim Peters2344fae2001-01-15 00:50:52 +0000336 def do_break(self, arg, temporary = 0):
337 # break [ ([filename:]lineno | function) [, "condition"] ]
338 if not arg:
339 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000340 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000341 for bp in bdb.Breakpoint.bpbynumber:
342 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000343 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000344 return
345 # parse arguments; comma has lowest precedence
346 # and cannot occur in filename
347 filename = None
348 lineno = None
349 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000350 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000351 if comma > 0:
352 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000353 cond = arg[comma+1:].lstrip()
354 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000355 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000356 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000357 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000358 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000359 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000360 f = self.lookupmodule(filename)
361 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000362 print >>self.stdout, '*** ', repr(filename),
363 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000364 return
365 else:
366 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000367 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000368 try:
369 lineno = int(arg)
370 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000371 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000372 return
373 else:
374 # no colon; can be lineno or function
375 try:
376 lineno = int(arg)
377 except ValueError:
378 try:
379 func = eval(arg,
380 self.curframe.f_globals,
Georg Brandle361bcb2009-04-01 23:32:17 +0000381 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000382 except:
383 func = arg
384 try:
385 if hasattr(func, 'im_func'):
386 func = func.im_func
387 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000388 #use co_name to identify the bkpt (function names
389 #could be aliased, but co_name is invariant)
390 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000391 lineno = code.co_firstlineno
392 filename = code.co_filename
393 except:
394 # last thing to try
395 (ok, filename, ln) = self.lineinfo(arg)
396 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000397 print >>self.stdout, '*** The specified object',
398 print >>self.stdout, repr(arg),
399 print >>self.stdout, 'is not a function'
400 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000401 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000402 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000403 lineno = int(ln)
404 if not filename:
405 filename = self.defaultFile()
406 # Check for reasonable breakpoint
407 line = self.checkline(filename, lineno)
408 if line:
409 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000410 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000411 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000412 else:
413 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000414 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
415 bp.file,
416 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000417
418 # To be overridden in derived debuggers
419 def defaultFile(self):
420 """Produce a reasonable default."""
421 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000422 if filename == '<string>' and self.mainpyfile:
423 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000424 return filename
425
426 do_b = do_break
427
428 def do_tbreak(self, arg):
429 self.do_break(arg, 1)
430
431 def lineinfo(self, identifier):
432 failed = (None, None, None)
433 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000434 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000435 if len(idstring) == 1:
436 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000437 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000438 elif len(idstring) == 3:
439 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000440 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000441 else:
442 return failed
443 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000444 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000445 # Protection for derived debuggers
446 if parts[0] == 'self':
447 del parts[0]
448 if len(parts) == 0:
449 return failed
450 # Best first guess at file to look at
451 fname = self.defaultFile()
452 if len(parts) == 1:
453 item = parts[0]
454 else:
455 # More than one part.
456 # First is module, second is method/class
457 f = self.lookupmodule(parts[0])
458 if f:
459 fname = f
460 item = parts[1]
461 answer = find_function(item, fname)
462 return answer or failed
463
464 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000465 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000466
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000467 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
468 line or EOF). Warning: testing is not comprehensive.
469 """
Nick Coghlana2053472008-12-14 10:54:50 +0000470 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000471 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000472 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000473 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000474 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000475 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000476 if (not line or (line[0] == '#') or
477 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000478 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000479 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000480 return lineno
481
482 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000483 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000484 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000485 try:
486 i = int(i)
487 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000488 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000489 continue
490
491 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000492 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000493 continue
494
495 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000496 if bp:
497 bp.enable()
498
499 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000500 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000501 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000502 try:
503 i = int(i)
504 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000505 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000506 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000507
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000508 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000509 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000510 continue
511
512 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000513 if bp:
514 bp.disable()
515
516 def do_condition(self, arg):
517 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000518 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000519 try:
520 bpnum = int(args[0].strip())
521 except ValueError:
522 # something went wrong
523 print >>self.stdout, \
524 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000525 return
Tim Peters2344fae2001-01-15 00:50:52 +0000526 try:
527 cond = args[1]
528 except:
529 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000530 try:
531 bp = bdb.Breakpoint.bpbynumber[bpnum]
532 except IndexError:
533 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
534 return
Tim Peters2344fae2001-01-15 00:50:52 +0000535 if bp:
536 bp.cond = cond
537 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000538 print >>self.stdout, 'Breakpoint', bpnum,
539 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000540
541 def do_ignore(self,arg):
542 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000543 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000544 try:
545 bpnum = int(args[0].strip())
546 except ValueError:
547 # something went wrong
548 print >>self.stdout, \
549 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000550 return
Tim Peters2344fae2001-01-15 00:50:52 +0000551 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000552 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000553 except:
554 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000555 try:
556 bp = bdb.Breakpoint.bpbynumber[bpnum]
557 except IndexError:
558 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
559 return
Tim Peters2344fae2001-01-15 00:50:52 +0000560 if bp:
561 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000562 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000563 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000564 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000565 reply = reply + '%d crossings' % count
566 else:
567 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000568 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000569 else:
Georg Brandl19564802006-05-10 17:13:20 +0000570 print >>self.stdout, 'Will stop next time breakpoint',
571 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000572
573 def do_clear(self, arg):
574 """Three possibilities, tried in this order:
575 clear -> clear all breaks, ask for confirmation
576 clear file:lineno -> clear all breaks at file:lineno
577 clear bpno bpno ... -> clear breakpoints by number"""
578 if not arg:
579 try:
580 reply = raw_input('Clear all breaks? ')
581 except EOFError:
582 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000583 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000584 if reply in ('y', 'yes'):
585 self.clear_all_breaks()
586 return
587 if ':' in arg:
588 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000589 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000590 filename = arg[:i]
591 arg = arg[i+1:]
592 try:
593 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000594 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000595 err = "Invalid line number (%s)" % arg
596 else:
597 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000598 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000599 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000600 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000601 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000602 try:
603 i = int(i)
604 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000605 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000606 continue
607
Georg Brandl6d2b3462005-08-24 07:36:17 +0000608 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000609 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000610 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000611 err = self.clear_bpbynumber(i)
612 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000613 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000614 else:
Georg Brandl19564802006-05-10 17:13:20 +0000615 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000616 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
617
618 def do_where(self, arg):
619 self.print_stack_trace()
620 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000621 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000622
623 def do_up(self, arg):
624 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000625 print >>self.stdout, '*** Oldest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000626 else:
627 self.curindex = self.curindex - 1
628 self.curframe = self.stack[self.curindex][0]
Georg Brandl569fc962009-04-02 02:00:01 +0000629 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000630 self.print_stack_entry(self.stack[self.curindex])
631 self.lineno = None
632 do_u = do_up
633
634 def do_down(self, arg):
635 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000636 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000637 else:
638 self.curindex = self.curindex + 1
639 self.curframe = self.stack[self.curindex][0]
Georg Brandl569fc962009-04-02 02:00:01 +0000640 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000641 self.print_stack_entry(self.stack[self.curindex])
642 self.lineno = None
643 do_d = do_down
644
Benjamin Peterson98353942008-05-11 14:13:25 +0000645 def do_until(self, arg):
646 self.set_until(self.curframe)
647 return 1
648 do_unt = do_until
649
Tim Peters2344fae2001-01-15 00:50:52 +0000650 def do_step(self, arg):
651 self.set_step()
652 return 1
653 do_s = do_step
654
655 def do_next(self, arg):
656 self.set_next(self.curframe)
657 return 1
658 do_n = do_next
659
Georg Brandl8e84c652007-03-13 21:08:15 +0000660 def do_run(self, arg):
Georg Brandl58152202009-05-05 09:06:02 +0000661 """Restart program by raising an exception to be caught in the main
662 debugger loop. If arguments were given, set them in sys.argv."""
Georg Brandl8e84c652007-03-13 21:08:15 +0000663 if arg:
664 import shlex
665 argv0 = sys.argv[0:1]
666 sys.argv = shlex.split(arg)
667 sys.argv[:0] = argv0
668 raise Restart
669
670 do_restart = do_run
671
Tim Peters2344fae2001-01-15 00:50:52 +0000672 def do_return(self, arg):
673 self.set_return(self.curframe)
674 return 1
675 do_r = do_return
676
677 def do_continue(self, arg):
678 self.set_continue()
679 return 1
680 do_c = do_cont = do_continue
681
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000682 def do_jump(self, arg):
683 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000684 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000685 return
686 try:
687 arg = int(arg)
688 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000689 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000690 else:
691 try:
692 # Do the jump, fix up our copy of the stack, and display the
693 # new position
694 self.curframe.f_lineno = arg
695 self.stack[self.curindex] = self.stack[self.curindex][0], arg
696 self.print_stack_entry(self.stack[self.curindex])
697 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000698 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000699 do_j = do_jump
700
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000701 def do_debug(self, arg):
702 sys.settrace(None)
703 globals = self.curframe.f_globals
Georg Brandle361bcb2009-04-01 23:32:17 +0000704 locals = self.curframe_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000705 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000706 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000707 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000708 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000709 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000710 sys.settrace(self.trace_dispatch)
711 self.lastcmd = p.lastcmd
712
Tim Peters2344fae2001-01-15 00:50:52 +0000713 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000714 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000715 self.set_quit()
716 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000717
Tim Peters2344fae2001-01-15 00:50:52 +0000718 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000719 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000720
Guido van Rossumeef26072003-01-13 21:13:55 +0000721 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000722 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000723 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000724 self.set_quit()
725 return 1
726
Tim Peters2344fae2001-01-15 00:50:52 +0000727 def do_args(self, arg):
Georg Brandle361bcb2009-04-01 23:32:17 +0000728 co = self.curframe.f_code
729 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000730 n = co.co_argcount
731 if co.co_flags & 4: n = n+1
732 if co.co_flags & 8: n = n+1
733 for i in range(n):
734 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000735 print >>self.stdout, name, '=',
736 if name in dict: print >>self.stdout, dict[name]
737 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000738 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000739
Tim Peters2344fae2001-01-15 00:50:52 +0000740 def do_retval(self, arg):
Georg Brandle361bcb2009-04-01 23:32:17 +0000741 if '__return__' in self.curframe_locals:
742 print >>self.stdout, self.curframe_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000743 else:
Georg Brandl19564802006-05-10 17:13:20 +0000744 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000745 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000746
Barry Warsaw210bd202002-11-05 22:40:20 +0000747 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000748 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000749 return eval(arg, self.curframe.f_globals,
Georg Brandle361bcb2009-04-01 23:32:17 +0000750 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000751 except:
752 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000753 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000754 exc_type_name = t
755 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000756 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000757 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000758
Barry Warsaw210bd202002-11-05 22:40:20 +0000759 def do_p(self, arg):
760 try:
Georg Brandl19564802006-05-10 17:13:20 +0000761 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000762 except:
763 pass
764
765 def do_pp(self, arg):
766 try:
Georg Brandl19564802006-05-10 17:13:20 +0000767 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000768 except:
769 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000770
Tim Peters2344fae2001-01-15 00:50:52 +0000771 def do_list(self, arg):
772 self.lastcmd = 'list'
773 last = None
774 if arg:
775 try:
776 x = eval(arg, {}, {})
777 if type(x) == type(()):
778 first, last = x
779 first = int(first)
780 last = int(last)
781 if last < first:
782 # Assume it's a count
783 last = first + last
784 else:
785 first = max(1, int(x) - 5)
786 except:
Georg Brandl19564802006-05-10 17:13:20 +0000787 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000788 return
789 elif self.lineno is None:
790 first = max(1, self.curframe.f_lineno - 5)
791 else:
792 first = self.lineno + 1
793 if last is None:
794 last = first + 10
795 filename = self.curframe.f_code.co_filename
796 breaklist = self.get_file_breaks(filename)
797 try:
798 for lineno in range(first, last+1):
Georg Brandl58152202009-05-05 09:06:02 +0000799 line = linecache.getline(filename, lineno,
800 self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000801 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000802 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000803 break
804 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000805 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000806 if len(s) < 4: s = s + ' '
807 if lineno in breaklist: s = s + 'B'
808 else: s = s + ' '
809 if lineno == self.curframe.f_lineno:
810 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000811 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000812 self.lineno = lineno
813 except KeyboardInterrupt:
814 pass
815 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000816
Tim Peters2344fae2001-01-15 00:50:52 +0000817 def do_whatis(self, arg):
818 try:
819 value = eval(arg, self.curframe.f_globals,
Georg Brandle361bcb2009-04-01 23:32:17 +0000820 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000821 except:
822 t, v = sys.exc_info()[:2]
823 if type(t) == type(''):
824 exc_type_name = t
825 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000826 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000827 return
828 code = None
829 # Is it a function?
830 try: code = value.func_code
831 except: pass
832 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000833 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000834 return
835 # Is it an instance method?
836 try: code = value.im_func.func_code
837 except: pass
838 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000839 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000840 return
841 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000842 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000843
Tim Peters2344fae2001-01-15 00:50:52 +0000844 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000845 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000846 if len(args) == 0:
847 keys = self.aliases.keys()
848 keys.sort()
849 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000850 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000851 return
Guido van Rossum08454592002-07-12 13:10:53 +0000852 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000853 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000854 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000855 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000856
Tim Peters2344fae2001-01-15 00:50:52 +0000857 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000858 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000859 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000860 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000861 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000862
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000863 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000864 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
865 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000866
Tim Peters2344fae2001-01-15 00:50:52 +0000867 # Print a traceback starting at the top stack frame.
868 # The most recently entered frame is printed last;
869 # this is different from dbx and gdb, but consistent with
870 # the Python interpreter's stack trace.
871 # It is also consistent with the up/down commands (which are
872 # compatible with dbx and gdb: up moves towards 'main()'
873 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000874
Tim Peters2344fae2001-01-15 00:50:52 +0000875 def print_stack_trace(self):
876 try:
877 for frame_lineno in self.stack:
878 self.print_stack_entry(frame_lineno)
879 except KeyboardInterrupt:
880 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000881
Tim Peters2344fae2001-01-15 00:50:52 +0000882 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
883 frame, lineno = frame_lineno
884 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000885 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000886 else:
Georg Brandl19564802006-05-10 17:13:20 +0000887 print >>self.stdout, ' ',
888 print >>self.stdout, self.format_stack_entry(frame_lineno,
889 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000890
Guido van Rossum921c8241992-01-10 14:54:42 +0000891
Tim Peters2344fae2001-01-15 00:50:52 +0000892 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000893
Tim Peters2344fae2001-01-15 00:50:52 +0000894 def help_help(self):
895 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896
Tim Peters2344fae2001-01-15 00:50:52 +0000897 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000898 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000899Without argument, print the list of available commands.
900With a command name as argument, print help about that command
901"help pdb" pipes the full documentation file to the $PAGER
902"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903
Tim Peters2344fae2001-01-15 00:50:52 +0000904 def help_where(self):
905 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000906
Tim Peters2344fae2001-01-15 00:50:52 +0000907 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000908 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000909Print a stack trace, with the most recent frame at the bottom.
910An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000911context of most commands. 'bt' is an alias for this command."""
912
913 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000914
Tim Peters2344fae2001-01-15 00:50:52 +0000915 def help_down(self):
916 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000917
Tim Peters2344fae2001-01-15 00:50:52 +0000918 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000919 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000920Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000921(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000922
Tim Peters2344fae2001-01-15 00:50:52 +0000923 def help_up(self):
924 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000925
Tim Peters2344fae2001-01-15 00:50:52 +0000926 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000927 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000928Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000929(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930
Tim Peters2344fae2001-01-15 00:50:52 +0000931 def help_break(self):
932 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000933
Tim Peters2344fae2001-01-15 00:50:52 +0000934 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000935 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000936With a line number argument, set a break there in the current
937file. With a function name, set a break at first executable line
938of that function. Without argument, list all breaks. If a second
939argument is present, it is a string specifying an expression
940which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000941
Tim Peters2344fae2001-01-15 00:50:52 +0000942The line number may be prefixed with a filename and a colon,
943to specify a breakpoint in another file (probably one that
944hasn't been loaded yet). The file is searched for on sys.path;
945the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000946
Tim Peters2344fae2001-01-15 00:50:52 +0000947 def help_clear(self):
948 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000949
Tim Peters2344fae2001-01-15 00:50:52 +0000950 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000951 print >>self.stdout, "cl(ear) filename:lineno"
952 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000953With a space separated list of breakpoint numbers, clear
954those breakpoints. Without argument, clear all breaks (but
955first ask confirmation). With a filename:lineno argument,
956clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000957
Tim Peters2344fae2001-01-15 00:50:52 +0000958Note that the argument is different from previous versions of
959the debugger (in python distributions 1.5.1 and before) where
960a linenumber was used instead of either filename:lineno or
961breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000962
Tim Peters2344fae2001-01-15 00:50:52 +0000963 def help_tbreak(self):
Georg Brandl58152202009-05-05 09:06:02 +0000964 print >>self.stdout, """tbreak same arguments as break, but breakpoint
965is removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000966
Tim Peters2344fae2001-01-15 00:50:52 +0000967 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000968 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000969Enables the breakpoints given as a space separated list of
970bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000971
Tim Peters2344fae2001-01-15 00:50:52 +0000972 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000973 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000974Disables the breakpoints given as a space separated list of
975bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000976
Tim Peters2344fae2001-01-15 00:50:52 +0000977 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000978 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000979Sets the ignore count for the given breakpoint number. A breakpoint
980becomes active when the ignore count is zero. When non-zero, the
981count is decremented each time the breakpoint is reached and the
982breakpoint is not disabled and any associated condition evaluates
983to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000984
Tim Peters2344fae2001-01-15 00:50:52 +0000985 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000986 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000987str_condition is a string specifying an expression which
988must evaluate to true before the breakpoint is honored.
989If str_condition is absent, any existing condition is removed;
990i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000991
Tim Peters2344fae2001-01-15 00:50:52 +0000992 def help_step(self):
993 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000994
Tim Peters2344fae2001-01-15 00:50:52 +0000995 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000996 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000997Execute the current line, stop at the first possible occasion
998(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999
Benjamin Peterson98353942008-05-11 14:13:25 +00001000 def help_until(self):
1001 self.help_unt()
1002
1003 def help_unt(self):
1004 print """unt(il)
1005Continue execution until the line with a number greater than the current
1006one is reached or until the current frame returns"""
1007
Tim Peters2344fae2001-01-15 00:50:52 +00001008 def help_next(self):
1009 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010
Tim Peters2344fae2001-01-15 00:50:52 +00001011 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +00001012 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +00001013Continue execution until the next line in the current function
1014is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015
Tim Peters2344fae2001-01-15 00:50:52 +00001016 def help_return(self):
1017 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001018
Tim Peters2344fae2001-01-15 00:50:52 +00001019 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +00001020 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +00001021Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001022
Tim Peters2344fae2001-01-15 00:50:52 +00001023 def help_continue(self):
1024 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001025
Tim Peters2344fae2001-01-15 00:50:52 +00001026 def help_cont(self):
1027 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028
Tim Peters2344fae2001-01-15 00:50:52 +00001029 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +00001030 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +00001031Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001032
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001033 def help_jump(self):
1034 self.help_j()
1035
1036 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +00001037 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001038Set the next line that will be executed."""
1039
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001040 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +00001041 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001042Enter a recursive debugger that steps through the code argument
1043(which is an arbitrary expression or statement to be executed
1044in the current environment)."""
1045
Tim Peters2344fae2001-01-15 00:50:52 +00001046 def help_list(self):
1047 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001048
Tim Peters2344fae2001-01-15 00:50:52 +00001049 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001050 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001051List source code for the current file.
1052Without arguments, list 11 lines around the current line
1053or continue the previous listing.
1054With one argument, list 11 lines starting at that line.
1055With two arguments, list the given range;
1056if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001057
Tim Peters2344fae2001-01-15 00:50:52 +00001058 def help_args(self):
1059 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001060
Tim Peters2344fae2001-01-15 00:50:52 +00001061 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001062 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001063Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001064
Tim Peters2344fae2001-01-15 00:50:52 +00001065 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001066 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001067Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001068
Barry Warsaw210bd202002-11-05 22:40:20 +00001069 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001070 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001071Pretty-print the value of the expression."""
1072
Tim Peters2344fae2001-01-15 00:50:52 +00001073 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001074 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001075Execute the (one-line) statement in the context of
1076the current stack frame.
1077The exclamation point can be omitted unless the first word
1078of the statement resembles a debugger command.
1079To assign to a global variable you must always prefix the
1080command with a 'global' command, e.g.:
1081(Pdb) global list_options; list_options = ['-l']
1082(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001083
Georg Brandl8e84c652007-03-13 21:08:15 +00001084 def help_run(self):
1085 print """run [args...]
1086Restart the debugged python program. If a string is supplied, it is
1087splitted with "shlex" and the result is used as the new sys.argv.
1088History, breakpoints, actions and debugger options are preserved.
1089"restart" is an alias for "run"."""
1090
1091 help_restart = help_run
1092
Tim Peters2344fae2001-01-15 00:50:52 +00001093 def help_quit(self):
1094 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001095
Tim Peters2344fae2001-01-15 00:50:52 +00001096 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001097 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001098The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001099
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001100 help_exit = help_q
1101
Tim Peters2344fae2001-01-15 00:50:52 +00001102 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001103 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001104Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001105
Tim Peters2344fae2001-01-15 00:50:52 +00001106 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001107 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001108Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001109
Tim Peters2344fae2001-01-15 00:50:52 +00001110 def help_alias(self):
Georg Brandl58152202009-05-05 09:06:02 +00001111 print >>self.stdout, """alias [name [command [parameter parameter ...]]]
Tim Peters2344fae2001-01-15 00:50:52 +00001112Creates an alias called 'name' the executes 'command'. The command
1113must *not* be enclosed in quotes. Replaceable parameters are
1114indicated by %1, %2, and so on, while %* is replaced by all the
1115parameters. If no command is given, the current alias for name
1116is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001117
Tim Peters2344fae2001-01-15 00:50:52 +00001118Aliases may be nested and can contain anything that can be
1119legally typed at the pdb prompt. Note! You *can* override
1120internal pdb commands with aliases! Those internal commands
1121are then hidden until the alias is removed. Aliasing is recursively
1122applied to the first word of the command line; all other words
1123in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001124
Tim Peters2344fae2001-01-15 00:50:52 +00001125Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001126
Tim Peters2344fae2001-01-15 00:50:52 +00001127#Print instance variables (usage "pi classInst")
1128alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001129
Tim Peters2344fae2001-01-15 00:50:52 +00001130#Print instance variables in self
1131alias ps pi self
1132"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001133
Tim Peters2344fae2001-01-15 00:50:52 +00001134 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001135 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001136Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001137
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001138 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001139 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001140(com) ...
1141(com) end
1142(Pdb)
1143
1144Specify a list of commands for breakpoint number bpnumber. The
1145commands themselves appear on the following lines. Type a line
1146containing just 'end' to terminate the commands.
1147
1148To remove all commands from a breakpoint, type commands and
1149follow it immediately with end; that is, give no commands.
1150
1151With no bpnumber argument, commands refers to the last
1152breakpoint set.
1153
1154You can use breakpoint commands to start your program up again.
1155Simply use the continue command, or step, or any other
1156command that resumes execution.
1157
1158Specifying any command resuming execution (currently continue,
1159step, next, return, jump, quit and their abbreviations) terminates
1160the command list (as if that command was immediately followed by end).
1161This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001162(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001163another breakpoint--which could have its own command list, leading to
1164ambiguities about which list to execute.
1165
1166 If you use the 'silent' command in the command list, the
1167usual message about stopping at a breakpoint is not printed. This may
1168be desirable for breakpoints that are to print a specific message and
1169then continue. If none of the other commands print anything, you
1170see no sign that the breakpoint was reached.
1171"""
1172
Tim Peters2344fae2001-01-15 00:50:52 +00001173 def help_pdb(self):
1174 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001175
Tim Peters2344fae2001-01-15 00:50:52 +00001176 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001177 """Helper function for break/clear parsing -- may be overridden.
1178
1179 lookupmodule() translates (possibly incomplete) file or module name
1180 into an absolute file name.
1181 """
1182 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001183 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001184 f = os.path.join(sys.path[0], filename)
1185 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1186 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001187 root, ext = os.path.splitext(filename)
1188 if ext == '':
1189 filename = filename + '.py'
1190 if os.path.isabs(filename):
1191 return filename
1192 for dirname in sys.path:
1193 while os.path.islink(dirname):
1194 dirname = os.readlink(dirname)
1195 fullname = os.path.join(dirname, filename)
1196 if os.path.exists(fullname):
1197 return fullname
1198 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001199
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001200 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001201 # The script has to run in __main__ namespace (or imports from
1202 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001203 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001204 # So we clear up the __main__ and set several special variables
1205 # (this gets rid of pdb's globals and cleans old variables on restarts).
1206 import __main__
1207 __main__.__dict__.clear()
1208 __main__.__dict__.update({"__name__" : "__main__",
1209 "__file__" : filename,
1210 "__builtins__": __builtins__,
1211 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001212
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001213 # When bdb sets tracing, a number of call and line events happens
1214 # BEFORE debugger even reaches user's code (and the exact sequence of
1215 # events depends on python version). So we take special measures to
1216 # avoid stopping before we reach the main script (see user_line and
1217 # user_call for details).
1218 self._wait_for_mainpyfile = 1
1219 self.mainpyfile = self.canonic(filename)
1220 self._user_requested_quit = 0
1221 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001222 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001223
Guido van Rossum35771131992-09-08 11:59:04 +00001224# Simplified interface
1225
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001226def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001227 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001228
1229def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001230 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001231
1232def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001233 # B/W compatibility
1234 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001235
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001236def runcall(*args, **kwds):
1237 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001238
Guido van Rossumb6775db1994-08-01 11:34:53 +00001239def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001240 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001241
1242# Post-Mortem interface
1243
Facundo Batistac54aec12008-03-08 16:50:27 +00001244def post_mortem(t=None):
1245 # handling the default
1246 if t is None:
1247 # sys.exc_info() returns (type, value, traceback) if an exception is
1248 # being handled, otherwise it returns None
1249 t = sys.exc_info()[2]
1250 if t is None:
1251 raise ValueError("A valid traceback must be passed if no "
1252 "exception is being handled")
1253
Tim Peters2344fae2001-01-15 00:50:52 +00001254 p = Pdb()
1255 p.reset()
Benjamin Petersonc18574c2008-10-22 21:16:34 +00001256 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001257
1258def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001259 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001260
1261
1262# Main program for testing
1263
Guido van Rossum23efba41992-01-27 16:58:47 +00001264TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001265
Guido van Rossum921c8241992-01-10 14:54:42 +00001266def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001267 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001268
1269# print help
1270def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001271 for dirname in sys.path:
1272 fullname = os.path.join(dirname, 'pdb.doc')
1273 if os.path.exists(fullname):
1274 sts = os.system('${PAGER-more} '+fullname)
1275 if sts: print '*** Pager exit status:', sts
1276 break
1277 else:
1278 print 'Sorry, can\'t find the help file "pdb.doc"',
1279 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001280
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001281def main():
Benjamin Peterson13be2cf2008-03-26 11:57:47 +00001282 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters2344fae2001-01-15 00:50:52 +00001283 print "usage: pdb.py scriptfile [arg] ..."
1284 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001285
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001286 mainpyfile = sys.argv[1] # Get script filename
1287 if not os.path.exists(mainpyfile):
1288 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001289 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001290
Tim Peters2344fae2001-01-15 00:50:52 +00001291 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001292
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001293 # Replace pdb's dir with script's dir in front of module search path.
1294 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001295
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001296 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1297 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl58152202009-05-05 09:06:02 +00001298 # changed by the user from the command line. There is a "restart" command
1299 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001300 pdb = Pdb()
1301 while 1:
1302 try:
1303 pdb._runscript(mainpyfile)
1304 if pdb._user_requested_quit:
1305 break
Tim Peterse718f612004-10-12 21:51:32 +00001306 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001307 except Restart:
1308 print "Restarting", mainpyfile, "with arguments:"
1309 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001310 except SystemExit:
1311 # In most cases SystemExit does not warrant a post-mortem session.
1312 print "The program exited via sys.exit(). Exit status: ",
1313 print sys.exc_info()[1]
1314 except:
1315 traceback.print_exc()
1316 print "Uncaught exception. Entering post mortem debugging"
1317 print "Running 'cont' or 'step' will restart the program"
1318 t = sys.exc_info()[2]
Benjamin Petersonc18574c2008-10-22 21:16:34 +00001319 pdb.interaction(None, t)
Georg Brandl58152202009-05-05 09:06:02 +00001320 print "Post mortem debugger finished. The " + mainpyfile + \
1321 " will be restarted"
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001322
1323
1324# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001325if __name__ == '__main__':
1326 import pdb
1327 pdb.main()