blob: 3f76032cff486bf744661d38f98b8da5872c388d [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 Brandl19564802006-05-10 17:13:20 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None):
Tim Peters2344fae2001-01-15 00:50:52 +000062 bdb.Bdb.__init__(self)
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
98 self.commands_doprompt = {} # for each bp num, tells if the prompt must be disp. after execing the cmd list
99 self.commands_silent = {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list
100 self.commands_defining = False # True while in the process of defining a command list
101 self.commands_bnum = None # The breakpoint number for which we are defining a list
102
Tim Peters2344fae2001-01-15 00:50:52 +0000103 def reset(self):
104 bdb.Bdb.reset(self)
105 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000106
Tim Peters2344fae2001-01-15 00:50:52 +0000107 def forget(self):
108 self.lineno = None
109 self.stack = []
110 self.curindex = 0
111 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000112
Tim Peters2344fae2001-01-15 00:50:52 +0000113 def setup(self, f, t):
114 self.forget()
115 self.stack, self.curindex = self.get_stack(f, t)
116 self.curframe = self.stack[self.curindex][0]
117 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118
Tim Peters2344fae2001-01-15 00:50:52 +0000119 # Can be executed earlier than 'setup' if desired
120 def execRcLines(self):
121 if self.rcLines:
122 # Make local copy because of recursion
123 rcLines = self.rcLines
124 # executed only once
125 self.rcLines = []
126 for line in rcLines:
127 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000128 if len(line) > 0 and line[0] != '#':
129 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000130
Tim Peters280488b2002-08-23 18:19:30 +0000131 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000132
133 def user_call(self, frame, argument_list):
134 """This method is called when there is the remote possibility
135 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000136 if self._wait_for_mainpyfile:
137 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000138 if self.stop_here(frame):
Georg Brandl19564802006-05-10 17:13:20 +0000139 print >>self.stdout, '--Call--'
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000140 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000141
Tim Peters2344fae2001-01-15 00:50:52 +0000142 def user_line(self, frame):
143 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 if self._wait_for_mainpyfile:
145 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
146 or frame.f_lineno<= 0):
147 return
148 self._wait_for_mainpyfile = 0
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000149 if self.bp_commands(frame):
150 self.interaction(frame, None)
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000151
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000152 def bp_commands(self,frame):
153 """ Call every command that was set for the current active breakpoint (if there is one)
154 Returns True if the normal interaction function must be called, False otherwise """
155 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
156 if getattr(self,"currentbp",False) and self.currentbp in self.commands:
157 currentbp = self.currentbp
158 self.currentbp = 0
159 lastcmd_back = self.lastcmd
160 self.setup(frame, None)
161 for line in self.commands[currentbp]:
162 self.onecmd(line)
163 self.lastcmd = lastcmd_back
164 if not self.commands_silent[currentbp]:
165 self.print_stack_entry(self.stack[self.curindex])
166 if self.commands_doprompt[currentbp]:
167 self.cmdloop()
168 self.forget()
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000169 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000170 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000171
Tim Peters2344fae2001-01-15 00:50:52 +0000172 def user_return(self, frame, return_value):
173 """This function is called when a return trap is set here."""
174 frame.f_locals['__return__'] = return_value
Georg Brandl19564802006-05-10 17:13:20 +0000175 print >>self.stdout, '--Return--'
Tim Peters2344fae2001-01-15 00:50:52 +0000176 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000177
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000178 def user_exception(self, frame, exc_info):
179 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000180 """This function is called if an exception occurs,
181 but only if we are to stop at or just below this level."""
182 frame.f_locals['__exception__'] = exc_type, exc_value
183 if type(exc_type) == type(''):
184 exc_type_name = exc_type
185 else: exc_type_name = exc_type.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000186 print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters2344fae2001-01-15 00:50:52 +0000187 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000188
Tim Peters2344fae2001-01-15 00:50:52 +0000189 # General interaction function
190
191 def interaction(self, frame, traceback):
192 self.setup(frame, traceback)
193 self.print_stack_entry(self.stack[self.curindex])
194 self.cmdloop()
195 self.forget()
196
197 def default(self, line):
198 if line[:1] == '!': line = line[1:]
199 locals = self.curframe.f_locals
200 globals = self.curframe.f_globals
201 try:
202 code = compile(line + '\n', '<stdin>', 'single')
Amaury Forgeot d'Arcff0f2672008-01-15 21:25:11 +0000203 save_stdout = sys.stdout
204 save_stdin = sys.stdin
Guido van Rossumcad37242008-01-15 17:59:29 +0000205 try:
206 sys.stdin = self.stdin
207 sys.stdout = self.stdout
208 exec code in globals, locals
209 finally:
210 sys.stdout = save_stdout
211 sys.stdin = save_stdin
Tim Peters2344fae2001-01-15 00:50:52 +0000212 except:
213 t, v = sys.exc_info()[:2]
214 if type(t) == type(''):
215 exc_type_name = t
216 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000217 print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters2344fae2001-01-15 00:50:52 +0000218
219 def precmd(self, line):
220 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000221 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000222 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000223 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000224 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000225 line = self.aliases[args[0]]
226 ii = 1
227 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000228 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000229 tmpArg)
230 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000231 line = line.replace("%*", ' '.join(args[1:]))
232 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000233 # split into ';;' separated commands
234 # unless it's an alias command
235 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000236 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000237 if marker >= 0:
238 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000239 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000240 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000241 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000242 return line
243
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000244 def onecmd(self, line):
245 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000246 to the prompt.
247
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000248 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000249 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000250 """
251 if not self.commands_defining:
252 return cmd.Cmd.onecmd(self, line)
253 else:
254 return self.handle_command_def(line)
255
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000256 def handle_command_def(self,line):
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000257 """ Handles one command line during command list definition. """
258 cmd, arg, line = self.parseline(line)
259 if cmd == 'silent':
260 self.commands_silent[self.commands_bnum] = True
261 return # continue to handle other cmd def in the cmd list
262 elif cmd == 'end':
263 self.cmdqueue = []
264 return 1 # end of cmd list
265 cmdlist = self.commands[self.commands_bnum]
266 if (arg):
267 cmdlist.append(cmd+' '+arg)
268 else:
269 cmdlist.append(cmd)
270 # Determine if we must stop
271 try:
272 func = getattr(self, 'do_' + cmd)
273 except AttributeError:
274 func = self.default
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000275 if func.func_name in self.commands_resuming : # one of the resuming commands.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000276 self.commands_doprompt[self.commands_bnum] = False
277 self.cmdqueue = []
278 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000279 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000280
Tim Peters2344fae2001-01-15 00:50:52 +0000281 # Command definitions, called by cmdloop()
282 # The argument is the remaining string on the command line
283 # Return true to exit from the command loop
284
285 do_h = cmd.Cmd.do_help
286
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000287 def do_commands(self, arg):
288 """Defines a list of commands associated to a breakpoint
289 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
290 if not arg:
291 bnum = len(bdb.Breakpoint.bpbynumber)-1
292 else:
293 try:
294 bnum = int(arg)
295 except:
Georg Brandl19564802006-05-10 17:13:20 +0000296 print >>self.stdout, "Usage : commands [bnum]\n ...\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000297 return
298 self.commands_bnum = bnum
299 self.commands[bnum] = []
300 self.commands_doprompt[bnum] = True
301 self.commands_silent[bnum] = False
302 prompt_back = self.prompt
303 self.prompt = '(com) '
304 self.commands_defining = True
305 self.cmdloop()
306 self.commands_defining = False
307 self.prompt = prompt_back
308
Tim Peters2344fae2001-01-15 00:50:52 +0000309 def do_break(self, arg, temporary = 0):
310 # break [ ([filename:]lineno | function) [, "condition"] ]
311 if not arg:
312 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000313 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000314 for bp in bdb.Breakpoint.bpbynumber:
315 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000316 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000317 return
318 # parse arguments; comma has lowest precedence
319 # and cannot occur in filename
320 filename = None
321 lineno = None
322 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000323 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000324 if comma > 0:
325 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000326 cond = arg[comma+1:].lstrip()
327 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000328 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000329 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000330 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000331 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000332 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000333 f = self.lookupmodule(filename)
334 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000335 print >>self.stdout, '*** ', repr(filename),
336 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000337 return
338 else:
339 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000340 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000341 try:
342 lineno = int(arg)
343 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000344 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000345 return
346 else:
347 # no colon; can be lineno or function
348 try:
349 lineno = int(arg)
350 except ValueError:
351 try:
352 func = eval(arg,
353 self.curframe.f_globals,
354 self.curframe.f_locals)
355 except:
356 func = arg
357 try:
358 if hasattr(func, 'im_func'):
359 func = func.im_func
360 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000361 #use co_name to identify the bkpt (function names
362 #could be aliased, but co_name is invariant)
363 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000364 lineno = code.co_firstlineno
365 filename = code.co_filename
366 except:
367 # last thing to try
368 (ok, filename, ln) = self.lineinfo(arg)
369 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000370 print >>self.stdout, '*** The specified object',
371 print >>self.stdout, repr(arg),
372 print >>self.stdout, 'is not a function'
373 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000374 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000375 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000376 lineno = int(ln)
377 if not filename:
378 filename = self.defaultFile()
379 # Check for reasonable breakpoint
380 line = self.checkline(filename, lineno)
381 if line:
382 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000383 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000384 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000385 else:
386 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000387 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
388 bp.file,
389 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000390
391 # To be overridden in derived debuggers
392 def defaultFile(self):
393 """Produce a reasonable default."""
394 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000395 if filename == '<string>' and self.mainpyfile:
396 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000397 return filename
398
399 do_b = do_break
400
401 def do_tbreak(self, arg):
402 self.do_break(arg, 1)
403
404 def lineinfo(self, identifier):
405 failed = (None, None, None)
406 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000407 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000408 if len(idstring) == 1:
409 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000410 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000411 elif len(idstring) == 3:
412 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000413 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000414 else:
415 return failed
416 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000417 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000418 # Protection for derived debuggers
419 if parts[0] == 'self':
420 del parts[0]
421 if len(parts) == 0:
422 return failed
423 # Best first guess at file to look at
424 fname = self.defaultFile()
425 if len(parts) == 1:
426 item = parts[0]
427 else:
428 # More than one part.
429 # First is module, second is method/class
430 f = self.lookupmodule(parts[0])
431 if f:
432 fname = f
433 item = parts[1]
434 answer = find_function(item, fname)
435 return answer or failed
436
437 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000438 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000439
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000440 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
441 line or EOF). Warning: testing is not comprehensive.
442 """
Nick Coghlana2053472008-12-14 10:54:50 +0000443 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000444 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000445 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000446 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000447 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000448 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000449 if (not line or (line[0] == '#') or
450 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000451 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000452 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000453 return lineno
454
455 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000456 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000457 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000458 try:
459 i = int(i)
460 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000461 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000462 continue
463
464 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000465 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000466 continue
467
468 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000469 if bp:
470 bp.enable()
471
472 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000473 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000474 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000475 try:
476 i = int(i)
477 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000478 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000479 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000480
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000481 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000482 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000483 continue
484
485 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000486 if bp:
487 bp.disable()
488
489 def do_condition(self, arg):
490 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000491 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000492 try:
493 bpnum = int(args[0].strip())
494 except ValueError:
495 # something went wrong
496 print >>self.stdout, \
497 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000498 return
Tim Peters2344fae2001-01-15 00:50:52 +0000499 try:
500 cond = args[1]
501 except:
502 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000503 try:
504 bp = bdb.Breakpoint.bpbynumber[bpnum]
505 except IndexError:
506 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
507 return
Tim Peters2344fae2001-01-15 00:50:52 +0000508 if bp:
509 bp.cond = cond
510 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000511 print >>self.stdout, 'Breakpoint', bpnum,
512 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000513
514 def do_ignore(self,arg):
515 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000516 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000517 try:
518 bpnum = int(args[0].strip())
519 except ValueError:
520 # something went wrong
521 print >>self.stdout, \
522 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000523 return
Tim Peters2344fae2001-01-15 00:50:52 +0000524 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000525 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000526 except:
527 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000528 try:
529 bp = bdb.Breakpoint.bpbynumber[bpnum]
530 except IndexError:
531 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
532 return
Tim Peters2344fae2001-01-15 00:50:52 +0000533 if bp:
534 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000535 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000536 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000537 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000538 reply = reply + '%d crossings' % count
539 else:
540 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000541 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000542 else:
Georg Brandl19564802006-05-10 17:13:20 +0000543 print >>self.stdout, 'Will stop next time breakpoint',
544 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000545
546 def do_clear(self, arg):
547 """Three possibilities, tried in this order:
548 clear -> clear all breaks, ask for confirmation
549 clear file:lineno -> clear all breaks at file:lineno
550 clear bpno bpno ... -> clear breakpoints by number"""
551 if not arg:
552 try:
553 reply = raw_input('Clear all breaks? ')
554 except EOFError:
555 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000556 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000557 if reply in ('y', 'yes'):
558 self.clear_all_breaks()
559 return
560 if ':' in arg:
561 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000562 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000563 filename = arg[:i]
564 arg = arg[i+1:]
565 try:
566 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000567 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000568 err = "Invalid line number (%s)" % arg
569 else:
570 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000571 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000572 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000573 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000574 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000575 try:
576 i = int(i)
577 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000578 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000579 continue
580
Georg Brandl6d2b3462005-08-24 07:36:17 +0000581 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000582 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000583 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000584 err = self.clear_bpbynumber(i)
585 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000586 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000587 else:
Georg Brandl19564802006-05-10 17:13:20 +0000588 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000589 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
590
591 def do_where(self, arg):
592 self.print_stack_trace()
593 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000594 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000595
596 def do_up(self, arg):
597 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000598 print >>self.stdout, '*** Oldest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000599 else:
600 self.curindex = self.curindex - 1
601 self.curframe = self.stack[self.curindex][0]
602 self.print_stack_entry(self.stack[self.curindex])
603 self.lineno = None
604 do_u = do_up
605
606 def do_down(self, arg):
607 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000608 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000609 else:
610 self.curindex = self.curindex + 1
611 self.curframe = self.stack[self.curindex][0]
612 self.print_stack_entry(self.stack[self.curindex])
613 self.lineno = None
614 do_d = do_down
615
Benjamin Peterson98353942008-05-11 14:13:25 +0000616 def do_until(self, arg):
617 self.set_until(self.curframe)
618 return 1
619 do_unt = do_until
620
Tim Peters2344fae2001-01-15 00:50:52 +0000621 def do_step(self, arg):
622 self.set_step()
623 return 1
624 do_s = do_step
625
626 def do_next(self, arg):
627 self.set_next(self.curframe)
628 return 1
629 do_n = do_next
630
Georg Brandl8e84c652007-03-13 21:08:15 +0000631 def do_run(self, arg):
632 """Restart program by raising an exception to be caught in the main debugger
633 loop. If arguments were given, set them in sys.argv."""
634 if arg:
635 import shlex
636 argv0 = sys.argv[0:1]
637 sys.argv = shlex.split(arg)
638 sys.argv[:0] = argv0
639 raise Restart
640
641 do_restart = do_run
642
Tim Peters2344fae2001-01-15 00:50:52 +0000643 def do_return(self, arg):
644 self.set_return(self.curframe)
645 return 1
646 do_r = do_return
647
648 def do_continue(self, arg):
649 self.set_continue()
650 return 1
651 do_c = do_cont = do_continue
652
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000653 def do_jump(self, arg):
654 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000655 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000656 return
657 try:
658 arg = int(arg)
659 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000660 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000661 else:
662 try:
663 # Do the jump, fix up our copy of the stack, and display the
664 # new position
665 self.curframe.f_lineno = arg
666 self.stack[self.curindex] = self.stack[self.curindex][0], arg
667 self.print_stack_entry(self.stack[self.curindex])
668 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000669 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000670 do_j = do_jump
671
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000672 def do_debug(self, arg):
673 sys.settrace(None)
674 globals = self.curframe.f_globals
675 locals = self.curframe.f_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000676 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000677 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000678 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000679 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000680 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000681 sys.settrace(self.trace_dispatch)
682 self.lastcmd = p.lastcmd
683
Tim Peters2344fae2001-01-15 00:50:52 +0000684 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000685 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000686 self.set_quit()
687 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000688
Tim Peters2344fae2001-01-15 00:50:52 +0000689 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000690 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000691
Guido van Rossumeef26072003-01-13 21:13:55 +0000692 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000693 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000694 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000695 self.set_quit()
696 return 1
697
Tim Peters2344fae2001-01-15 00:50:52 +0000698 def do_args(self, arg):
699 f = self.curframe
700 co = f.f_code
701 dict = f.f_locals
702 n = co.co_argcount
703 if co.co_flags & 4: n = n+1
704 if co.co_flags & 8: n = n+1
705 for i in range(n):
706 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000707 print >>self.stdout, name, '=',
708 if name in dict: print >>self.stdout, dict[name]
709 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000710 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000711
Tim Peters2344fae2001-01-15 00:50:52 +0000712 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000713 if '__return__' in self.curframe.f_locals:
Georg Brandl19564802006-05-10 17:13:20 +0000714 print >>self.stdout, self.curframe.f_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000715 else:
Georg Brandl19564802006-05-10 17:13:20 +0000716 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000717 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000718
Barry Warsaw210bd202002-11-05 22:40:20 +0000719 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000720 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000721 return eval(arg, self.curframe.f_globals,
722 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000723 except:
724 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000725 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000726 exc_type_name = t
727 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000728 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000729 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000730
Barry Warsaw210bd202002-11-05 22:40:20 +0000731 def do_p(self, arg):
732 try:
Georg Brandl19564802006-05-10 17:13:20 +0000733 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000734 except:
735 pass
736
737 def do_pp(self, arg):
738 try:
Georg Brandl19564802006-05-10 17:13:20 +0000739 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000740 except:
741 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000742
Tim Peters2344fae2001-01-15 00:50:52 +0000743 def do_list(self, arg):
744 self.lastcmd = 'list'
745 last = None
746 if arg:
747 try:
748 x = eval(arg, {}, {})
749 if type(x) == type(()):
750 first, last = x
751 first = int(first)
752 last = int(last)
753 if last < first:
754 # Assume it's a count
755 last = first + last
756 else:
757 first = max(1, int(x) - 5)
758 except:
Georg Brandl19564802006-05-10 17:13:20 +0000759 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000760 return
761 elif self.lineno is None:
762 first = max(1, self.curframe.f_lineno - 5)
763 else:
764 first = self.lineno + 1
765 if last is None:
766 last = first + 10
767 filename = self.curframe.f_code.co_filename
768 breaklist = self.get_file_breaks(filename)
769 try:
770 for lineno in range(first, last+1):
Nick Coghlana2053472008-12-14 10:54:50 +0000771 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000772 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000773 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000774 break
775 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000776 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000777 if len(s) < 4: s = s + ' '
778 if lineno in breaklist: s = s + 'B'
779 else: s = s + ' '
780 if lineno == self.curframe.f_lineno:
781 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000782 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000783 self.lineno = lineno
784 except KeyboardInterrupt:
785 pass
786 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000787
Tim Peters2344fae2001-01-15 00:50:52 +0000788 def do_whatis(self, arg):
789 try:
790 value = eval(arg, self.curframe.f_globals,
791 self.curframe.f_locals)
792 except:
793 t, v = sys.exc_info()[:2]
794 if type(t) == type(''):
795 exc_type_name = t
796 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000797 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000798 return
799 code = None
800 # Is it a function?
801 try: code = value.func_code
802 except: pass
803 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000804 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000805 return
806 # Is it an instance method?
807 try: code = value.im_func.func_code
808 except: pass
809 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000810 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000811 return
812 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000813 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000814
Tim Peters2344fae2001-01-15 00:50:52 +0000815 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000816 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000817 if len(args) == 0:
818 keys = self.aliases.keys()
819 keys.sort()
820 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000821 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000822 return
Guido van Rossum08454592002-07-12 13:10:53 +0000823 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000824 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000825 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000826 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000827
Tim Peters2344fae2001-01-15 00:50:52 +0000828 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000829 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000830 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000831 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000832 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000833
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000834 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000835 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
836 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000837
Tim Peters2344fae2001-01-15 00:50:52 +0000838 # Print a traceback starting at the top stack frame.
839 # The most recently entered frame is printed last;
840 # this is different from dbx and gdb, but consistent with
841 # the Python interpreter's stack trace.
842 # It is also consistent with the up/down commands (which are
843 # compatible with dbx and gdb: up moves towards 'main()'
844 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000845
Tim Peters2344fae2001-01-15 00:50:52 +0000846 def print_stack_trace(self):
847 try:
848 for frame_lineno in self.stack:
849 self.print_stack_entry(frame_lineno)
850 except KeyboardInterrupt:
851 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000852
Tim Peters2344fae2001-01-15 00:50:52 +0000853 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
854 frame, lineno = frame_lineno
855 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000856 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000857 else:
Georg Brandl19564802006-05-10 17:13:20 +0000858 print >>self.stdout, ' ',
859 print >>self.stdout, self.format_stack_entry(frame_lineno,
860 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000861
Guido van Rossum921c8241992-01-10 14:54:42 +0000862
Tim Peters2344fae2001-01-15 00:50:52 +0000863 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000864
Tim Peters2344fae2001-01-15 00:50:52 +0000865 def help_help(self):
866 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000867
Tim Peters2344fae2001-01-15 00:50:52 +0000868 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000869 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000870Without argument, print the list of available commands.
871With a command name as argument, print help about that command
872"help pdb" pipes the full documentation file to the $PAGER
873"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000874
Tim Peters2344fae2001-01-15 00:50:52 +0000875 def help_where(self):
876 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000877
Tim Peters2344fae2001-01-15 00:50:52 +0000878 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000879 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000880Print a stack trace, with the most recent frame at the bottom.
881An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000882context of most commands. 'bt' is an alias for this command."""
883
884 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885
Tim Peters2344fae2001-01-15 00:50:52 +0000886 def help_down(self):
887 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888
Tim Peters2344fae2001-01-15 00:50:52 +0000889 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000890 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000891Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000892(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893
Tim Peters2344fae2001-01-15 00:50:52 +0000894 def help_up(self):
895 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896
Tim Peters2344fae2001-01-15 00:50:52 +0000897 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000898 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000899Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000900(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000901
Tim Peters2344fae2001-01-15 00:50:52 +0000902 def help_break(self):
903 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904
Tim Peters2344fae2001-01-15 00:50:52 +0000905 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000906 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000907With a line number argument, set a break there in the current
908file. With a function name, set a break at first executable line
909of that function. Without argument, list all breaks. If a second
910argument is present, it is a string specifying an expression
911which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912
Tim Peters2344fae2001-01-15 00:50:52 +0000913The line number may be prefixed with a filename and a colon,
914to specify a breakpoint in another file (probably one that
915hasn't been loaded yet). The file is searched for on sys.path;
916the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000917
Tim Peters2344fae2001-01-15 00:50:52 +0000918 def help_clear(self):
919 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000920
Tim Peters2344fae2001-01-15 00:50:52 +0000921 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000922 print >>self.stdout, "cl(ear) filename:lineno"
923 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000924With a space separated list of breakpoint numbers, clear
925those breakpoints. Without argument, clear all breaks (but
926first ask confirmation). With a filename:lineno argument,
927clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000928
Tim Peters2344fae2001-01-15 00:50:52 +0000929Note that the argument is different from previous versions of
930the debugger (in python distributions 1.5.1 and before) where
931a linenumber was used instead of either filename:lineno or
932breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000933
Tim Peters2344fae2001-01-15 00:50:52 +0000934 def help_tbreak(self):
Georg Brandl19564802006-05-10 17:13:20 +0000935 print >>self.stdout, """tbreak same arguments as break, but breakpoint is
Tim Peters2344fae2001-01-15 00:50:52 +0000936removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000937
Tim Peters2344fae2001-01-15 00:50:52 +0000938 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000939 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000940Enables the breakpoints given as a space separated list of
941bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000942
Tim Peters2344fae2001-01-15 00:50:52 +0000943 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000944 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000945Disables the breakpoints given as a space separated list of
946bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000947
Tim Peters2344fae2001-01-15 00:50:52 +0000948 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000949 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000950Sets the ignore count for the given breakpoint number. A breakpoint
951becomes active when the ignore count is zero. When non-zero, the
952count is decremented each time the breakpoint is reached and the
953breakpoint is not disabled and any associated condition evaluates
954to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000955
Tim Peters2344fae2001-01-15 00:50:52 +0000956 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000957 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000958str_condition is a string specifying an expression which
959must evaluate to true before the breakpoint is honored.
960If str_condition is absent, any existing condition is removed;
961i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000962
Tim Peters2344fae2001-01-15 00:50:52 +0000963 def help_step(self):
964 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965
Tim Peters2344fae2001-01-15 00:50:52 +0000966 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000967 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000968Execute the current line, stop at the first possible occasion
969(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000970
Benjamin Peterson98353942008-05-11 14:13:25 +0000971 def help_until(self):
972 self.help_unt()
973
974 def help_unt(self):
975 print """unt(il)
976Continue execution until the line with a number greater than the current
977one is reached or until the current frame returns"""
978
Tim Peters2344fae2001-01-15 00:50:52 +0000979 def help_next(self):
980 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000981
Tim Peters2344fae2001-01-15 00:50:52 +0000982 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +0000983 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000984Continue execution until the next line in the current function
985is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000986
Tim Peters2344fae2001-01-15 00:50:52 +0000987 def help_return(self):
988 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000989
Tim Peters2344fae2001-01-15 00:50:52 +0000990 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +0000991 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +0000992Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000993
Tim Peters2344fae2001-01-15 00:50:52 +0000994 def help_continue(self):
995 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000996
Tim Peters2344fae2001-01-15 00:50:52 +0000997 def help_cont(self):
998 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999
Tim Peters2344fae2001-01-15 00:50:52 +00001000 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +00001001 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +00001002Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001004 def help_jump(self):
1005 self.help_j()
1006
1007 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +00001008 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001009Set the next line that will be executed."""
1010
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001011 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +00001012 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001013Enter a recursive debugger that steps through the code argument
1014(which is an arbitrary expression or statement to be executed
1015in the current environment)."""
1016
Tim Peters2344fae2001-01-15 00:50:52 +00001017 def help_list(self):
1018 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019
Tim Peters2344fae2001-01-15 00:50:52 +00001020 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001021 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001022List source code for the current file.
1023Without arguments, list 11 lines around the current line
1024or continue the previous listing.
1025With one argument, list 11 lines starting at that line.
1026With two arguments, list the given range;
1027if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028
Tim Peters2344fae2001-01-15 00:50:52 +00001029 def help_args(self):
1030 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001031
Tim Peters2344fae2001-01-15 00:50:52 +00001032 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001033 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001034Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035
Tim Peters2344fae2001-01-15 00:50:52 +00001036 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001037 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001038Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001039
Barry Warsaw210bd202002-11-05 22:40:20 +00001040 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001041 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001042Pretty-print the value of the expression."""
1043
Tim Peters2344fae2001-01-15 00:50:52 +00001044 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001045 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001046Execute the (one-line) statement in the context of
1047the current stack frame.
1048The exclamation point can be omitted unless the first word
1049of the statement resembles a debugger command.
1050To assign to a global variable you must always prefix the
1051command with a 'global' command, e.g.:
1052(Pdb) global list_options; list_options = ['-l']
1053(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054
Georg Brandl8e84c652007-03-13 21:08:15 +00001055 def help_run(self):
1056 print """run [args...]
1057Restart the debugged python program. If a string is supplied, it is
1058splitted with "shlex" and the result is used as the new sys.argv.
1059History, breakpoints, actions and debugger options are preserved.
1060"restart" is an alias for "run"."""
1061
1062 help_restart = help_run
1063
Tim Peters2344fae2001-01-15 00:50:52 +00001064 def help_quit(self):
1065 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066
Tim Peters2344fae2001-01-15 00:50:52 +00001067 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001068 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001069The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001070
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001071 help_exit = help_q
1072
Tim Peters2344fae2001-01-15 00:50:52 +00001073 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001074 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001075Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001076
Tim Peters2344fae2001-01-15 00:50:52 +00001077 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001078 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001079Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001080
Tim Peters2344fae2001-01-15 00:50:52 +00001081 def help_alias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001082 print >>self.stdout, """alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001083Creates an alias called 'name' the executes 'command'. The command
1084must *not* be enclosed in quotes. Replaceable parameters are
1085indicated by %1, %2, and so on, while %* is replaced by all the
1086parameters. If no command is given, the current alias for name
1087is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001088
Tim Peters2344fae2001-01-15 00:50:52 +00001089Aliases may be nested and can contain anything that can be
1090legally typed at the pdb prompt. Note! You *can* override
1091internal pdb commands with aliases! Those internal commands
1092are then hidden until the alias is removed. Aliasing is recursively
1093applied to the first word of the command line; all other words
1094in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001095
Tim Peters2344fae2001-01-15 00:50:52 +00001096Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001097
Tim Peters2344fae2001-01-15 00:50:52 +00001098#Print instance variables (usage "pi classInst")
1099alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001100
Tim Peters2344fae2001-01-15 00:50:52 +00001101#Print instance variables in self
1102alias ps pi self
1103"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001104
Tim Peters2344fae2001-01-15 00:50:52 +00001105 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001106 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001107Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001108
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001109 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001110 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001111(com) ...
1112(com) end
1113(Pdb)
1114
1115Specify a list of commands for breakpoint number bpnumber. The
1116commands themselves appear on the following lines. Type a line
1117containing just 'end' to terminate the commands.
1118
1119To remove all commands from a breakpoint, type commands and
1120follow it immediately with end; that is, give no commands.
1121
1122With no bpnumber argument, commands refers to the last
1123breakpoint set.
1124
1125You can use breakpoint commands to start your program up again.
1126Simply use the continue command, or step, or any other
1127command that resumes execution.
1128
1129Specifying any command resuming execution (currently continue,
1130step, next, return, jump, quit and their abbreviations) terminates
1131the command list (as if that command was immediately followed by end).
1132This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001133(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001134another breakpoint--which could have its own command list, leading to
1135ambiguities about which list to execute.
1136
1137 If you use the 'silent' command in the command list, the
1138usual message about stopping at a breakpoint is not printed. This may
1139be desirable for breakpoints that are to print a specific message and
1140then continue. If none of the other commands print anything, you
1141see no sign that the breakpoint was reached.
1142"""
1143
Tim Peters2344fae2001-01-15 00:50:52 +00001144 def help_pdb(self):
1145 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001146
Tim Peters2344fae2001-01-15 00:50:52 +00001147 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001148 """Helper function for break/clear parsing -- may be overridden.
1149
1150 lookupmodule() translates (possibly incomplete) file or module name
1151 into an absolute file name.
1152 """
1153 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001154 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001155 f = os.path.join(sys.path[0], filename)
1156 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1157 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001158 root, ext = os.path.splitext(filename)
1159 if ext == '':
1160 filename = filename + '.py'
1161 if os.path.isabs(filename):
1162 return filename
1163 for dirname in sys.path:
1164 while os.path.islink(dirname):
1165 dirname = os.readlink(dirname)
1166 fullname = os.path.join(dirname, filename)
1167 if os.path.exists(fullname):
1168 return fullname
1169 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001170
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001171 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001172 # The script has to run in __main__ namespace (or imports from
1173 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001174 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001175 # So we clear up the __main__ and set several special variables
1176 # (this gets rid of pdb's globals and cleans old variables on restarts).
1177 import __main__
1178 __main__.__dict__.clear()
1179 __main__.__dict__.update({"__name__" : "__main__",
1180 "__file__" : filename,
1181 "__builtins__": __builtins__,
1182 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001183
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001184 # When bdb sets tracing, a number of call and line events happens
1185 # BEFORE debugger even reaches user's code (and the exact sequence of
1186 # events depends on python version). So we take special measures to
1187 # avoid stopping before we reach the main script (see user_line and
1188 # user_call for details).
1189 self._wait_for_mainpyfile = 1
1190 self.mainpyfile = self.canonic(filename)
1191 self._user_requested_quit = 0
1192 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001193 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001194
Guido van Rossum35771131992-09-08 11:59:04 +00001195# Simplified interface
1196
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001197def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001198 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001199
1200def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001201 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001202
1203def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001204 # B/W compatibility
1205 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001206
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001207def runcall(*args, **kwds):
1208 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001209
Guido van Rossumb6775db1994-08-01 11:34:53 +00001210def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001211 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001212
1213# Post-Mortem interface
1214
Facundo Batistac54aec12008-03-08 16:50:27 +00001215def post_mortem(t=None):
1216 # handling the default
1217 if t is None:
1218 # sys.exc_info() returns (type, value, traceback) if an exception is
1219 # being handled, otherwise it returns None
1220 t = sys.exc_info()[2]
1221 if t is None:
1222 raise ValueError("A valid traceback must be passed if no "
1223 "exception is being handled")
1224
Tim Peters2344fae2001-01-15 00:50:52 +00001225 p = Pdb()
1226 p.reset()
Benjamin Petersonc18574c2008-10-22 21:16:34 +00001227 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001228
1229def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001230 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001231
1232
1233# Main program for testing
1234
Guido van Rossum23efba41992-01-27 16:58:47 +00001235TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001236
Guido van Rossum921c8241992-01-10 14:54:42 +00001237def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001238 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001239
1240# print help
1241def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001242 for dirname in sys.path:
1243 fullname = os.path.join(dirname, 'pdb.doc')
1244 if os.path.exists(fullname):
1245 sts = os.system('${PAGER-more} '+fullname)
1246 if sts: print '*** Pager exit status:', sts
1247 break
1248 else:
1249 print 'Sorry, can\'t find the help file "pdb.doc"',
1250 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001251
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001252def main():
Benjamin Peterson13be2cf2008-03-26 11:57:47 +00001253 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters2344fae2001-01-15 00:50:52 +00001254 print "usage: pdb.py scriptfile [arg] ..."
1255 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001256
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001257 mainpyfile = sys.argv[1] # Get script filename
1258 if not os.path.exists(mainpyfile):
1259 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001260 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001261
Tim Peters2344fae2001-01-15 00:50:52 +00001262 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001263
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001264 # Replace pdb's dir with script's dir in front of module search path.
1265 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001266
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001267 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1268 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl8e84c652007-03-13 21:08:15 +00001269 # changed by the user from the command line. There is a "restart" command which
1270 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001271 pdb = Pdb()
1272 while 1:
1273 try:
1274 pdb._runscript(mainpyfile)
1275 if pdb._user_requested_quit:
1276 break
Tim Peterse718f612004-10-12 21:51:32 +00001277 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001278 except Restart:
1279 print "Restarting", mainpyfile, "with arguments:"
1280 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001281 except SystemExit:
1282 # In most cases SystemExit does not warrant a post-mortem session.
1283 print "The program exited via sys.exit(). Exit status: ",
1284 print sys.exc_info()[1]
1285 except:
1286 traceback.print_exc()
1287 print "Uncaught exception. Entering post mortem debugging"
1288 print "Running 'cont' or 'step' will restart the program"
1289 t = sys.exc_info()[2]
Benjamin Petersonc18574c2008-10-22 21:16:34 +00001290 pdb.interaction(None, t)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001291 print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
1292
1293
1294# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001295if __name__ == '__main__':
1296 import pdb
1297 pdb.main()