blob: 86162025f847eb39abb62fe599cb4feab6160c22 [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
Guido van Rossumef1b41b2002-09-10 21:57:14 +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
Tim Peters2344fae2001-01-15 00:50:52 +0000178 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
179 """This function is called if an exception occurs,
180 but only if we are to stop at or just below this level."""
181 frame.f_locals['__exception__'] = exc_type, exc_value
182 if type(exc_type) == type(''):
183 exc_type_name = exc_type
184 else: exc_type_name = exc_type.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000185 print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters2344fae2001-01-15 00:50:52 +0000186 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000187
Tim Peters2344fae2001-01-15 00:50:52 +0000188 # General interaction function
189
190 def interaction(self, frame, traceback):
191 self.setup(frame, traceback)
192 self.print_stack_entry(self.stack[self.curindex])
193 self.cmdloop()
194 self.forget()
195
196 def default(self, line):
197 if line[:1] == '!': line = line[1:]
198 locals = self.curframe.f_locals
199 globals = self.curframe.f_globals
200 try:
201 code = compile(line + '\n', '<stdin>', 'single')
Amaury Forgeot d'Arcff0f2672008-01-15 21:25:11 +0000202 save_stdout = sys.stdout
203 save_stdin = sys.stdin
Guido van Rossumcad37242008-01-15 17:59:29 +0000204 try:
205 sys.stdin = self.stdin
206 sys.stdout = self.stdout
207 exec code in globals, locals
208 finally:
209 sys.stdout = save_stdout
210 sys.stdin = save_stdin
Tim Peters2344fae2001-01-15 00:50:52 +0000211 except:
212 t, v = sys.exc_info()[:2]
213 if type(t) == type(''):
214 exc_type_name = t
215 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000216 print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters2344fae2001-01-15 00:50:52 +0000217
218 def precmd(self, line):
219 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000220 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000221 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000222 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000223 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000224 line = self.aliases[args[0]]
225 ii = 1
226 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000227 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000228 tmpArg)
229 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000230 line = line.replace("%*", ' '.join(args[1:]))
231 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000232 # split into ';;' separated commands
233 # unless it's an alias command
234 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000235 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000236 if marker >= 0:
237 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000238 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000239 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000240 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000241 return line
242
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000243 def onecmd(self, line):
244 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000245 to the prompt.
246
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000247 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000248 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000249 """
250 if not self.commands_defining:
251 return cmd.Cmd.onecmd(self, line)
252 else:
253 return self.handle_command_def(line)
254
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000255 def handle_command_def(self,line):
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000256 """ Handles one command line during command list definition. """
257 cmd, arg, line = self.parseline(line)
258 if cmd == 'silent':
259 self.commands_silent[self.commands_bnum] = True
260 return # continue to handle other cmd def in the cmd list
261 elif cmd == 'end':
262 self.cmdqueue = []
263 return 1 # end of cmd list
264 cmdlist = self.commands[self.commands_bnum]
265 if (arg):
266 cmdlist.append(cmd+' '+arg)
267 else:
268 cmdlist.append(cmd)
269 # Determine if we must stop
270 try:
271 func = getattr(self, 'do_' + cmd)
272 except AttributeError:
273 func = self.default
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000274 if func.func_name in self.commands_resuming : # one of the resuming commands.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000275 self.commands_doprompt[self.commands_bnum] = False
276 self.cmdqueue = []
277 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000278 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000279
Tim Peters2344fae2001-01-15 00:50:52 +0000280 # Command definitions, called by cmdloop()
281 # The argument is the remaining string on the command line
282 # Return true to exit from the command loop
283
284 do_h = cmd.Cmd.do_help
285
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000286 def do_commands(self, arg):
287 """Defines a list of commands associated to a breakpoint
288 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
289 if not arg:
290 bnum = len(bdb.Breakpoint.bpbynumber)-1
291 else:
292 try:
293 bnum = int(arg)
294 except:
Georg Brandl19564802006-05-10 17:13:20 +0000295 print >>self.stdout, "Usage : commands [bnum]\n ...\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000296 return
297 self.commands_bnum = bnum
298 self.commands[bnum] = []
299 self.commands_doprompt[bnum] = True
300 self.commands_silent[bnum] = False
301 prompt_back = self.prompt
302 self.prompt = '(com) '
303 self.commands_defining = True
304 self.cmdloop()
305 self.commands_defining = False
306 self.prompt = prompt_back
307
Tim Peters2344fae2001-01-15 00:50:52 +0000308 def do_break(self, arg, temporary = 0):
309 # break [ ([filename:]lineno | function) [, "condition"] ]
310 if not arg:
311 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000312 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000313 for bp in bdb.Breakpoint.bpbynumber:
314 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000315 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000316 return
317 # parse arguments; comma has lowest precedence
318 # and cannot occur in filename
319 filename = None
320 lineno = None
321 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000322 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000323 if comma > 0:
324 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000325 cond = arg[comma+1:].lstrip()
326 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000327 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000328 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000329 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000330 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000331 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000332 f = self.lookupmodule(filename)
333 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000334 print >>self.stdout, '*** ', repr(filename),
335 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000336 return
337 else:
338 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000339 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000340 try:
341 lineno = int(arg)
342 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000343 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000344 return
345 else:
346 # no colon; can be lineno or function
347 try:
348 lineno = int(arg)
349 except ValueError:
350 try:
351 func = eval(arg,
352 self.curframe.f_globals,
353 self.curframe.f_locals)
354 except:
355 func = arg
356 try:
357 if hasattr(func, 'im_func'):
358 func = func.im_func
359 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000360 #use co_name to identify the bkpt (function names
361 #could be aliased, but co_name is invariant)
362 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000363 lineno = code.co_firstlineno
364 filename = code.co_filename
365 except:
366 # last thing to try
367 (ok, filename, ln) = self.lineinfo(arg)
368 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000369 print >>self.stdout, '*** The specified object',
370 print >>self.stdout, repr(arg),
371 print >>self.stdout, 'is not a function'
372 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000373 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000374 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000375 lineno = int(ln)
376 if not filename:
377 filename = self.defaultFile()
378 # Check for reasonable breakpoint
379 line = self.checkline(filename, lineno)
380 if line:
381 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000382 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000383 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000384 else:
385 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000386 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
387 bp.file,
388 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000389
390 # To be overridden in derived debuggers
391 def defaultFile(self):
392 """Produce a reasonable default."""
393 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000394 if filename == '<string>' and self.mainpyfile:
395 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000396 return filename
397
398 do_b = do_break
399
400 def do_tbreak(self, arg):
401 self.do_break(arg, 1)
402
403 def lineinfo(self, identifier):
404 failed = (None, None, None)
405 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000406 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000407 if len(idstring) == 1:
408 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000409 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000410 elif len(idstring) == 3:
411 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000412 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000413 else:
414 return failed
415 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000416 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000417 # Protection for derived debuggers
418 if parts[0] == 'self':
419 del parts[0]
420 if len(parts) == 0:
421 return failed
422 # Best first guess at file to look at
423 fname = self.defaultFile()
424 if len(parts) == 1:
425 item = parts[0]
426 else:
427 # More than one part.
428 # First is module, second is method/class
429 f = self.lookupmodule(parts[0])
430 if f:
431 fname = f
432 item = parts[1]
433 answer = find_function(item, fname)
434 return answer or failed
435
436 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000437 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000438
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000439 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
440 line or EOF). Warning: testing is not comprehensive.
441 """
Tim Peters2344fae2001-01-15 00:50:52 +0000442 line = linecache.getline(filename, lineno)
443 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000444 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000445 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000446 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000447 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000448 if (not line or (line[0] == '#') or
449 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000450 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000451 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000452 return lineno
453
454 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000455 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000456 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000457 try:
458 i = int(i)
459 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000460 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000461 continue
462
463 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000464 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000465 continue
466
467 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000468 if bp:
469 bp.enable()
470
471 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000472 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000473 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000474 try:
475 i = int(i)
476 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000477 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000478 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000479
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000480 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000481 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000482 continue
483
484 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000485 if bp:
486 bp.disable()
487
488 def do_condition(self, arg):
489 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000490 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000491 try:
492 bpnum = int(args[0].strip())
493 except ValueError:
494 # something went wrong
495 print >>self.stdout, \
496 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000497 return
Tim Peters2344fae2001-01-15 00:50:52 +0000498 try:
499 cond = args[1]
500 except:
501 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000502 try:
503 bp = bdb.Breakpoint.bpbynumber[bpnum]
504 except IndexError:
505 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
506 return
Tim Peters2344fae2001-01-15 00:50:52 +0000507 if bp:
508 bp.cond = cond
509 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000510 print >>self.stdout, 'Breakpoint', bpnum,
511 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000512
513 def do_ignore(self,arg):
514 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000515 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000516 try:
517 bpnum = int(args[0].strip())
518 except ValueError:
519 # something went wrong
520 print >>self.stdout, \
521 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000522 return
Tim Peters2344fae2001-01-15 00:50:52 +0000523 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000524 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000525 except:
526 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000527 try:
528 bp = bdb.Breakpoint.bpbynumber[bpnum]
529 except IndexError:
530 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
531 return
Tim Peters2344fae2001-01-15 00:50:52 +0000532 if bp:
533 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000534 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000535 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000536 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000537 reply = reply + '%d crossings' % count
538 else:
539 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000540 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000541 else:
Georg Brandl19564802006-05-10 17:13:20 +0000542 print >>self.stdout, 'Will stop next time breakpoint',
543 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000544
545 def do_clear(self, arg):
546 """Three possibilities, tried in this order:
547 clear -> clear all breaks, ask for confirmation
548 clear file:lineno -> clear all breaks at file:lineno
549 clear bpno bpno ... -> clear breakpoints by number"""
550 if not arg:
551 try:
552 reply = raw_input('Clear all breaks? ')
553 except EOFError:
554 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000555 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000556 if reply in ('y', 'yes'):
557 self.clear_all_breaks()
558 return
559 if ':' in arg:
560 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000561 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000562 filename = arg[:i]
563 arg = arg[i+1:]
564 try:
565 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000566 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000567 err = "Invalid line number (%s)" % arg
568 else:
569 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000570 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000571 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000572 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000573 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000574 try:
575 i = int(i)
576 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000577 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000578 continue
579
Georg Brandl6d2b3462005-08-24 07:36:17 +0000580 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000581 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000582 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000583 err = self.clear_bpbynumber(i)
584 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000585 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000586 else:
Georg Brandl19564802006-05-10 17:13:20 +0000587 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000588 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
589
590 def do_where(self, arg):
591 self.print_stack_trace()
592 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000593 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000594
595 def do_up(self, arg):
596 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000597 print >>self.stdout, '*** Oldest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000598 else:
599 self.curindex = self.curindex - 1
600 self.curframe = self.stack[self.curindex][0]
601 self.print_stack_entry(self.stack[self.curindex])
602 self.lineno = None
603 do_u = do_up
604
605 def do_down(self, arg):
606 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000607 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000608 else:
609 self.curindex = self.curindex + 1
610 self.curframe = self.stack[self.curindex][0]
611 self.print_stack_entry(self.stack[self.curindex])
612 self.lineno = None
613 do_d = do_down
614
Benjamin Peterson98353942008-05-11 14:13:25 +0000615 def do_until(self, arg):
616 self.set_until(self.curframe)
617 return 1
618 do_unt = do_until
619
Tim Peters2344fae2001-01-15 00:50:52 +0000620 def do_step(self, arg):
621 self.set_step()
622 return 1
623 do_s = do_step
624
625 def do_next(self, arg):
626 self.set_next(self.curframe)
627 return 1
628 do_n = do_next
629
Georg Brandl8e84c652007-03-13 21:08:15 +0000630 def do_run(self, arg):
631 """Restart program by raising an exception to be caught in the main debugger
632 loop. If arguments were given, set them in sys.argv."""
633 if arg:
634 import shlex
635 argv0 = sys.argv[0:1]
636 sys.argv = shlex.split(arg)
637 sys.argv[:0] = argv0
638 raise Restart
639
640 do_restart = do_run
641
Tim Peters2344fae2001-01-15 00:50:52 +0000642 def do_return(self, arg):
643 self.set_return(self.curframe)
644 return 1
645 do_r = do_return
646
647 def do_continue(self, arg):
648 self.set_continue()
649 return 1
650 do_c = do_cont = do_continue
651
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000652 def do_jump(self, arg):
653 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000654 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000655 return
656 try:
657 arg = int(arg)
658 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000659 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000660 else:
661 try:
662 # Do the jump, fix up our copy of the stack, and display the
663 # new position
664 self.curframe.f_lineno = arg
665 self.stack[self.curindex] = self.stack[self.curindex][0], arg
666 self.print_stack_entry(self.stack[self.curindex])
667 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000668 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000669 do_j = do_jump
670
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000671 def do_debug(self, arg):
672 sys.settrace(None)
673 globals = self.curframe.f_globals
674 locals = self.curframe.f_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000675 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000676 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000677 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000678 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000679 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000680 sys.settrace(self.trace_dispatch)
681 self.lastcmd = p.lastcmd
682
Tim Peters2344fae2001-01-15 00:50:52 +0000683 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000684 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000685 self.set_quit()
686 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000687
Tim Peters2344fae2001-01-15 00:50:52 +0000688 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000689 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000690
Guido van Rossumeef26072003-01-13 21:13:55 +0000691 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000692 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000693 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000694 self.set_quit()
695 return 1
696
Tim Peters2344fae2001-01-15 00:50:52 +0000697 def do_args(self, arg):
698 f = self.curframe
699 co = f.f_code
700 dict = f.f_locals
701 n = co.co_argcount
702 if co.co_flags & 4: n = n+1
703 if co.co_flags & 8: n = n+1
704 for i in range(n):
705 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000706 print >>self.stdout, name, '=',
707 if name in dict: print >>self.stdout, dict[name]
708 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000709 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000710
Tim Peters2344fae2001-01-15 00:50:52 +0000711 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000712 if '__return__' in self.curframe.f_locals:
Georg Brandl19564802006-05-10 17:13:20 +0000713 print >>self.stdout, self.curframe.f_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000714 else:
Georg Brandl19564802006-05-10 17:13:20 +0000715 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000716 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000717
Barry Warsaw210bd202002-11-05 22:40:20 +0000718 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000719 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000720 return eval(arg, self.curframe.f_globals,
721 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000722 except:
723 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000724 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000725 exc_type_name = t
726 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000727 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000728 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000729
Barry Warsaw210bd202002-11-05 22:40:20 +0000730 def do_p(self, arg):
731 try:
Georg Brandl19564802006-05-10 17:13:20 +0000732 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000733 except:
734 pass
735
736 def do_pp(self, arg):
737 try:
Georg Brandl19564802006-05-10 17:13:20 +0000738 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000739 except:
740 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000741
Tim Peters2344fae2001-01-15 00:50:52 +0000742 def do_list(self, arg):
743 self.lastcmd = 'list'
744 last = None
745 if arg:
746 try:
747 x = eval(arg, {}, {})
748 if type(x) == type(()):
749 first, last = x
750 first = int(first)
751 last = int(last)
752 if last < first:
753 # Assume it's a count
754 last = first + last
755 else:
756 first = max(1, int(x) - 5)
757 except:
Georg Brandl19564802006-05-10 17:13:20 +0000758 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000759 return
760 elif self.lineno is None:
761 first = max(1, self.curframe.f_lineno - 5)
762 else:
763 first = self.lineno + 1
764 if last is None:
765 last = first + 10
766 filename = self.curframe.f_code.co_filename
767 breaklist = self.get_file_breaks(filename)
768 try:
769 for lineno in range(first, last+1):
770 line = linecache.getline(filename, lineno)
771 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000772 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000773 break
774 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000775 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000776 if len(s) < 4: s = s + ' '
777 if lineno in breaklist: s = s + 'B'
778 else: s = s + ' '
779 if lineno == self.curframe.f_lineno:
780 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000781 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000782 self.lineno = lineno
783 except KeyboardInterrupt:
784 pass
785 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000786
Tim Peters2344fae2001-01-15 00:50:52 +0000787 def do_whatis(self, arg):
788 try:
789 value = eval(arg, self.curframe.f_globals,
790 self.curframe.f_locals)
791 except:
792 t, v = sys.exc_info()[:2]
793 if type(t) == type(''):
794 exc_type_name = t
795 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000796 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000797 return
798 code = None
799 # Is it a function?
800 try: code = value.func_code
801 except: pass
802 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000803 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000804 return
805 # Is it an instance method?
806 try: code = value.im_func.func_code
807 except: pass
808 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000809 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000810 return
811 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000812 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000813
Tim Peters2344fae2001-01-15 00:50:52 +0000814 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000815 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000816 if len(args) == 0:
817 keys = self.aliases.keys()
818 keys.sort()
819 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000820 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000821 return
Guido van Rossum08454592002-07-12 13:10:53 +0000822 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000823 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000824 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000825 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000826
Tim Peters2344fae2001-01-15 00:50:52 +0000827 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000828 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000829 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000830 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000831 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000832
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000833 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000834 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
835 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000836
Tim Peters2344fae2001-01-15 00:50:52 +0000837 # Print a traceback starting at the top stack frame.
838 # The most recently entered frame is printed last;
839 # this is different from dbx and gdb, but consistent with
840 # the Python interpreter's stack trace.
841 # It is also consistent with the up/down commands (which are
842 # compatible with dbx and gdb: up moves towards 'main()'
843 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000844
Tim Peters2344fae2001-01-15 00:50:52 +0000845 def print_stack_trace(self):
846 try:
847 for frame_lineno in self.stack:
848 self.print_stack_entry(frame_lineno)
849 except KeyboardInterrupt:
850 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000851
Tim Peters2344fae2001-01-15 00:50:52 +0000852 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
853 frame, lineno = frame_lineno
854 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000855 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000856 else:
Georg Brandl19564802006-05-10 17:13:20 +0000857 print >>self.stdout, ' ',
858 print >>self.stdout, self.format_stack_entry(frame_lineno,
859 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000860
Guido van Rossum921c8241992-01-10 14:54:42 +0000861
Tim Peters2344fae2001-01-15 00:50:52 +0000862 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000863
Tim Peters2344fae2001-01-15 00:50:52 +0000864 def help_help(self):
865 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000866
Tim Peters2344fae2001-01-15 00:50:52 +0000867 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000868 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000869Without argument, print the list of available commands.
870With a command name as argument, print help about that command
871"help pdb" pipes the full documentation file to the $PAGER
872"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000873
Tim Peters2344fae2001-01-15 00:50:52 +0000874 def help_where(self):
875 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000876
Tim Peters2344fae2001-01-15 00:50:52 +0000877 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000878 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000879Print a stack trace, with the most recent frame at the bottom.
880An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000881context of most commands. 'bt' is an alias for this command."""
882
883 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000884
Tim Peters2344fae2001-01-15 00:50:52 +0000885 def help_down(self):
886 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887
Tim Peters2344fae2001-01-15 00:50:52 +0000888 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000889 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000890Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000891(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892
Tim Peters2344fae2001-01-15 00:50:52 +0000893 def help_up(self):
894 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000895
Tim Peters2344fae2001-01-15 00:50:52 +0000896 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000897 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000898Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000899(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900
Tim Peters2344fae2001-01-15 00:50:52 +0000901 def help_break(self):
902 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903
Tim Peters2344fae2001-01-15 00:50:52 +0000904 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000905 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000906With a line number argument, set a break there in the current
907file. With a function name, set a break at first executable line
908of that function. Without argument, list all breaks. If a second
909argument is present, it is a string specifying an expression
910which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000911
Tim Peters2344fae2001-01-15 00:50:52 +0000912The line number may be prefixed with a filename and a colon,
913to specify a breakpoint in another file (probably one that
914hasn't been loaded yet). The file is searched for on sys.path;
915the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000916
Tim Peters2344fae2001-01-15 00:50:52 +0000917 def help_clear(self):
918 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000919
Tim Peters2344fae2001-01-15 00:50:52 +0000920 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000921 print >>self.stdout, "cl(ear) filename:lineno"
922 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000923With a space separated list of breakpoint numbers, clear
924those breakpoints. Without argument, clear all breaks (but
925first ask confirmation). With a filename:lineno argument,
926clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000927
Tim Peters2344fae2001-01-15 00:50:52 +0000928Note that the argument is different from previous versions of
929the debugger (in python distributions 1.5.1 and before) where
930a linenumber was used instead of either filename:lineno or
931breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000932
Tim Peters2344fae2001-01-15 00:50:52 +0000933 def help_tbreak(self):
Georg Brandl19564802006-05-10 17:13:20 +0000934 print >>self.stdout, """tbreak same arguments as break, but breakpoint is
Tim Peters2344fae2001-01-15 00:50:52 +0000935removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000936
Tim Peters2344fae2001-01-15 00:50:52 +0000937 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000938 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000939Enables the breakpoints given as a space separated list of
940bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000941
Tim Peters2344fae2001-01-15 00:50:52 +0000942 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000943 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000944Disables the breakpoints given as a space separated list of
945bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000946
Tim Peters2344fae2001-01-15 00:50:52 +0000947 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000948 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000949Sets the ignore count for the given breakpoint number. A breakpoint
950becomes active when the ignore count is zero. When non-zero, the
951count is decremented each time the breakpoint is reached and the
952breakpoint is not disabled and any associated condition evaluates
953to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000954
Tim Peters2344fae2001-01-15 00:50:52 +0000955 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000956 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000957str_condition is a string specifying an expression which
958must evaluate to true before the breakpoint is honored.
959If str_condition is absent, any existing condition is removed;
960i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000961
Tim Peters2344fae2001-01-15 00:50:52 +0000962 def help_step(self):
963 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000964
Tim Peters2344fae2001-01-15 00:50:52 +0000965 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000966 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000967Execute the current line, stop at the first possible occasion
968(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000969
Benjamin Peterson98353942008-05-11 14:13:25 +0000970 def help_until(self):
971 self.help_unt()
972
973 def help_unt(self):
974 print """unt(il)
975Continue execution until the line with a number greater than the current
976one is reached or until the current frame returns"""
977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_next(self):
979 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000980
Tim Peters2344fae2001-01-15 00:50:52 +0000981 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +0000982 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000983Continue execution until the next line in the current function
984is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000985
Tim Peters2344fae2001-01-15 00:50:52 +0000986 def help_return(self):
987 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000988
Tim Peters2344fae2001-01-15 00:50:52 +0000989 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +0000990 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +0000991Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000992
Tim Peters2344fae2001-01-15 00:50:52 +0000993 def help_continue(self):
994 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000995
Tim Peters2344fae2001-01-15 00:50:52 +0000996 def help_cont(self):
997 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998
Tim Peters2344fae2001-01-15 00:50:52 +0000999 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +00001000 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +00001001Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001002
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001003 def help_jump(self):
1004 self.help_j()
1005
1006 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +00001007 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001008Set the next line that will be executed."""
1009
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001010 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +00001011 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001012Enter a recursive debugger that steps through the code argument
1013(which is an arbitrary expression or statement to be executed
1014in the current environment)."""
1015
Tim Peters2344fae2001-01-15 00:50:52 +00001016 def help_list(self):
1017 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001018
Tim Peters2344fae2001-01-15 00:50:52 +00001019 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001020 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001021List source code for the current file.
1022Without arguments, list 11 lines around the current line
1023or continue the previous listing.
1024With one argument, list 11 lines starting at that line.
1025With two arguments, list the given range;
1026if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001027
Tim Peters2344fae2001-01-15 00:50:52 +00001028 def help_args(self):
1029 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030
Tim Peters2344fae2001-01-15 00:50:52 +00001031 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001032 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001033Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001034
Tim Peters2344fae2001-01-15 00:50:52 +00001035 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001036 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001037Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001038
Barry Warsaw210bd202002-11-05 22:40:20 +00001039 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001040 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001041Pretty-print the value of the expression."""
1042
Tim Peters2344fae2001-01-15 00:50:52 +00001043 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001044 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001045Execute the (one-line) statement in the context of
1046the current stack frame.
1047The exclamation point can be omitted unless the first word
1048of the statement resembles a debugger command.
1049To assign to a global variable you must always prefix the
1050command with a 'global' command, e.g.:
1051(Pdb) global list_options; list_options = ['-l']
1052(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001053
Georg Brandl8e84c652007-03-13 21:08:15 +00001054 def help_run(self):
1055 print """run [args...]
1056Restart the debugged python program. If a string is supplied, it is
1057splitted with "shlex" and the result is used as the new sys.argv.
1058History, breakpoints, actions and debugger options are preserved.
1059"restart" is an alias for "run"."""
1060
1061 help_restart = help_run
1062
Tim Peters2344fae2001-01-15 00:50:52 +00001063 def help_quit(self):
1064 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001065
Tim Peters2344fae2001-01-15 00:50:52 +00001066 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001067 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001068The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001069
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001070 help_exit = help_q
1071
Tim Peters2344fae2001-01-15 00:50:52 +00001072 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001073 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001074Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001077 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001078Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001079
Tim Peters2344fae2001-01-15 00:50:52 +00001080 def help_alias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001081 print >>self.stdout, """alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001082Creates an alias called 'name' the executes 'command'. The command
1083must *not* be enclosed in quotes. Replaceable parameters are
1084indicated by %1, %2, and so on, while %* is replaced by all the
1085parameters. If no command is given, the current alias for name
1086is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001087
Tim Peters2344fae2001-01-15 00:50:52 +00001088Aliases may be nested and can contain anything that can be
1089legally typed at the pdb prompt. Note! You *can* override
1090internal pdb commands with aliases! Those internal commands
1091are then hidden until the alias is removed. Aliasing is recursively
1092applied to the first word of the command line; all other words
1093in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001094
Tim Peters2344fae2001-01-15 00:50:52 +00001095Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001096
Tim Peters2344fae2001-01-15 00:50:52 +00001097#Print instance variables (usage "pi classInst")
1098alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001099
Tim Peters2344fae2001-01-15 00:50:52 +00001100#Print instance variables in self
1101alias ps pi self
1102"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001103
Tim Peters2344fae2001-01-15 00:50:52 +00001104 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001105 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001106Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001107
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001108 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001109 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001110(com) ...
1111(com) end
1112(Pdb)
1113
1114Specify a list of commands for breakpoint number bpnumber. The
1115commands themselves appear on the following lines. Type a line
1116containing just 'end' to terminate the commands.
1117
1118To remove all commands from a breakpoint, type commands and
1119follow it immediately with end; that is, give no commands.
1120
1121With no bpnumber argument, commands refers to the last
1122breakpoint set.
1123
1124You can use breakpoint commands to start your program up again.
1125Simply use the continue command, or step, or any other
1126command that resumes execution.
1127
1128Specifying any command resuming execution (currently continue,
1129step, next, return, jump, quit and their abbreviations) terminates
1130the command list (as if that command was immediately followed by end).
1131This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001132(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001133another breakpoint--which could have its own command list, leading to
1134ambiguities about which list to execute.
1135
1136 If you use the 'silent' command in the command list, the
1137usual message about stopping at a breakpoint is not printed. This may
1138be desirable for breakpoints that are to print a specific message and
1139then continue. If none of the other commands print anything, you
1140see no sign that the breakpoint was reached.
1141"""
1142
Tim Peters2344fae2001-01-15 00:50:52 +00001143 def help_pdb(self):
1144 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001145
Tim Peters2344fae2001-01-15 00:50:52 +00001146 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001147 """Helper function for break/clear parsing -- may be overridden.
1148
1149 lookupmodule() translates (possibly incomplete) file or module name
1150 into an absolute file name.
1151 """
1152 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001153 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001154 f = os.path.join(sys.path[0], filename)
1155 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1156 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001157 root, ext = os.path.splitext(filename)
1158 if ext == '':
1159 filename = filename + '.py'
1160 if os.path.isabs(filename):
1161 return filename
1162 for dirname in sys.path:
1163 while os.path.islink(dirname):
1164 dirname = os.readlink(dirname)
1165 fullname = os.path.join(dirname, filename)
1166 if os.path.exists(fullname):
1167 return fullname
1168 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001169
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001170 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001171 # The script has to run in __main__ namespace (or imports from
1172 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001173 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001174 # So we clear up the __main__ and set several special variables
1175 # (this gets rid of pdb's globals and cleans old variables on restarts).
1176 import __main__
1177 __main__.__dict__.clear()
1178 __main__.__dict__.update({"__name__" : "__main__",
1179 "__file__" : filename,
1180 "__builtins__": __builtins__,
1181 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001182
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001183 # When bdb sets tracing, a number of call and line events happens
1184 # BEFORE debugger even reaches user's code (and the exact sequence of
1185 # events depends on python version). So we take special measures to
1186 # avoid stopping before we reach the main script (see user_line and
1187 # user_call for details).
1188 self._wait_for_mainpyfile = 1
1189 self.mainpyfile = self.canonic(filename)
1190 self._user_requested_quit = 0
1191 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001192 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001193
Guido van Rossum35771131992-09-08 11:59:04 +00001194# Simplified interface
1195
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001196def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001197 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001198
1199def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001200 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001201
1202def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001203 # B/W compatibility
1204 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001205
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001206def runcall(*args, **kwds):
1207 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001208
Guido van Rossumb6775db1994-08-01 11:34:53 +00001209def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001210 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001211
1212# Post-Mortem interface
1213
Facundo Batistac54aec12008-03-08 16:50:27 +00001214def post_mortem(t=None):
1215 # handling the default
1216 if t is None:
1217 # sys.exc_info() returns (type, value, traceback) if an exception is
1218 # being handled, otherwise it returns None
1219 t = sys.exc_info()[2]
1220 if t is None:
1221 raise ValueError("A valid traceback must be passed if no "
1222 "exception is being handled")
1223
Tim Peters2344fae2001-01-15 00:50:52 +00001224 p = Pdb()
1225 p.reset()
1226 while t.tb_next is not None:
1227 t = t.tb_next
1228 p.interaction(t.tb_frame, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001229
1230def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001231 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001232
1233
1234# Main program for testing
1235
Guido van Rossum23efba41992-01-27 16:58:47 +00001236TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001237
Guido van Rossum921c8241992-01-10 14:54:42 +00001238def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001239 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001240
1241# print help
1242def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001243 for dirname in sys.path:
1244 fullname = os.path.join(dirname, 'pdb.doc')
1245 if os.path.exists(fullname):
1246 sts = os.system('${PAGER-more} '+fullname)
1247 if sts: print '*** Pager exit status:', sts
1248 break
1249 else:
1250 print 'Sorry, can\'t find the help file "pdb.doc"',
1251 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001252
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001253def main():
Benjamin Peterson13be2cf2008-03-26 11:57:47 +00001254 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters2344fae2001-01-15 00:50:52 +00001255 print "usage: pdb.py scriptfile [arg] ..."
1256 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001257
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001258 mainpyfile = sys.argv[1] # Get script filename
1259 if not os.path.exists(mainpyfile):
1260 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001261 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001262
Tim Peters2344fae2001-01-15 00:50:52 +00001263 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001264
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001265 # Replace pdb's dir with script's dir in front of module search path.
1266 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001267
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001268 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1269 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl8e84c652007-03-13 21:08:15 +00001270 # changed by the user from the command line. There is a "restart" command which
1271 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001272 pdb = Pdb()
1273 while 1:
1274 try:
1275 pdb._runscript(mainpyfile)
1276 if pdb._user_requested_quit:
1277 break
Tim Peterse718f612004-10-12 21:51:32 +00001278 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001279 except Restart:
1280 print "Restarting", mainpyfile, "with arguments:"
1281 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001282 except SystemExit:
1283 # In most cases SystemExit does not warrant a post-mortem session.
1284 print "The program exited via sys.exit(). Exit status: ",
1285 print sys.exc_info()[1]
1286 except:
1287 traceback.print_exc()
1288 print "Uncaught exception. Entering post mortem debugging"
1289 print "Running 'cont' or 'step' will restart the program"
1290 t = sys.exc_info()[2]
1291 while t.tb_next is not None:
1292 t = t.tb_next
1293 pdb.interaction(t.tb_frame,t)
1294 print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
1295
1296
1297# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001298if __name__ == '__main__':
1299 import pdb
1300 pdb.main()