blob: e2ace87a403793e9a40e787efced517311251c8a [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')
Guido van Rossumcad37242008-01-15 17:59:29 +0000202 try:
203 sys.stdin = self.stdin
204 sys.stdout = self.stdout
205 exec code in globals, locals
206 finally:
207 sys.stdout = save_stdout
208 sys.stdin = save_stdin
Tim Peters2344fae2001-01-15 00:50:52 +0000209 except:
210 t, v = sys.exc_info()[:2]
211 if type(t) == type(''):
212 exc_type_name = t
213 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000214 print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters2344fae2001-01-15 00:50:52 +0000215
216 def precmd(self, line):
217 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000218 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000219 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000220 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000221 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000222 line = self.aliases[args[0]]
223 ii = 1
224 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000225 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000226 tmpArg)
227 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000228 line = line.replace("%*", ' '.join(args[1:]))
229 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000230 # split into ';;' separated commands
231 # unless it's an alias command
232 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000233 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000234 if marker >= 0:
235 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000236 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000237 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000238 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000239 return line
240
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000241 def onecmd(self, line):
242 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000243 to the prompt.
244
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000245 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000246 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000247 """
248 if not self.commands_defining:
249 return cmd.Cmd.onecmd(self, line)
250 else:
251 return self.handle_command_def(line)
252
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000253 def handle_command_def(self,line):
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000254 """ Handles one command line during command list definition. """
255 cmd, arg, line = self.parseline(line)
256 if cmd == 'silent':
257 self.commands_silent[self.commands_bnum] = True
258 return # continue to handle other cmd def in the cmd list
259 elif cmd == 'end':
260 self.cmdqueue = []
261 return 1 # end of cmd list
262 cmdlist = self.commands[self.commands_bnum]
263 if (arg):
264 cmdlist.append(cmd+' '+arg)
265 else:
266 cmdlist.append(cmd)
267 # Determine if we must stop
268 try:
269 func = getattr(self, 'do_' + cmd)
270 except AttributeError:
271 func = self.default
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000272 if func.func_name in self.commands_resuming : # one of the resuming commands.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000273 self.commands_doprompt[self.commands_bnum] = False
274 self.cmdqueue = []
275 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000276 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000277
Tim Peters2344fae2001-01-15 00:50:52 +0000278 # Command definitions, called by cmdloop()
279 # The argument is the remaining string on the command line
280 # Return true to exit from the command loop
281
282 do_h = cmd.Cmd.do_help
283
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000284 def do_commands(self, arg):
285 """Defines a list of commands associated to a breakpoint
286 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
287 if not arg:
288 bnum = len(bdb.Breakpoint.bpbynumber)-1
289 else:
290 try:
291 bnum = int(arg)
292 except:
Georg Brandl19564802006-05-10 17:13:20 +0000293 print >>self.stdout, "Usage : commands [bnum]\n ...\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000294 return
295 self.commands_bnum = bnum
296 self.commands[bnum] = []
297 self.commands_doprompt[bnum] = True
298 self.commands_silent[bnum] = False
299 prompt_back = self.prompt
300 self.prompt = '(com) '
301 self.commands_defining = True
302 self.cmdloop()
303 self.commands_defining = False
304 self.prompt = prompt_back
305
Tim Peters2344fae2001-01-15 00:50:52 +0000306 def do_break(self, arg, temporary = 0):
307 # break [ ([filename:]lineno | function) [, "condition"] ]
308 if not arg:
309 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000310 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000311 for bp in bdb.Breakpoint.bpbynumber:
312 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000313 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000314 return
315 # parse arguments; comma has lowest precedence
316 # and cannot occur in filename
317 filename = None
318 lineno = None
319 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000320 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000321 if comma > 0:
322 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000323 cond = arg[comma+1:].lstrip()
324 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000325 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000326 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000327 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000328 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000329 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000330 f = self.lookupmodule(filename)
331 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000332 print >>self.stdout, '*** ', repr(filename),
333 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000334 return
335 else:
336 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000337 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000338 try:
339 lineno = int(arg)
340 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000341 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000342 return
343 else:
344 # no colon; can be lineno or function
345 try:
346 lineno = int(arg)
347 except ValueError:
348 try:
349 func = eval(arg,
350 self.curframe.f_globals,
351 self.curframe.f_locals)
352 except:
353 func = arg
354 try:
355 if hasattr(func, 'im_func'):
356 func = func.im_func
357 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000358 #use co_name to identify the bkpt (function names
359 #could be aliased, but co_name is invariant)
360 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000361 lineno = code.co_firstlineno
362 filename = code.co_filename
363 except:
364 # last thing to try
365 (ok, filename, ln) = self.lineinfo(arg)
366 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000367 print >>self.stdout, '*** The specified object',
368 print >>self.stdout, repr(arg),
369 print >>self.stdout, 'is not a function'
370 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000371 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000372 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000373 lineno = int(ln)
374 if not filename:
375 filename = self.defaultFile()
376 # Check for reasonable breakpoint
377 line = self.checkline(filename, lineno)
378 if line:
379 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000380 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000381 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000382 else:
383 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000384 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
385 bp.file,
386 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000387
388 # To be overridden in derived debuggers
389 def defaultFile(self):
390 """Produce a reasonable default."""
391 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000392 if filename == '<string>' and self.mainpyfile:
393 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000394 return filename
395
396 do_b = do_break
397
398 def do_tbreak(self, arg):
399 self.do_break(arg, 1)
400
401 def lineinfo(self, identifier):
402 failed = (None, None, None)
403 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000404 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000405 if len(idstring) == 1:
406 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000407 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000408 elif len(idstring) == 3:
409 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000410 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000411 else:
412 return failed
413 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000414 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000415 # Protection for derived debuggers
416 if parts[0] == 'self':
417 del parts[0]
418 if len(parts) == 0:
419 return failed
420 # Best first guess at file to look at
421 fname = self.defaultFile()
422 if len(parts) == 1:
423 item = parts[0]
424 else:
425 # More than one part.
426 # First is module, second is method/class
427 f = self.lookupmodule(parts[0])
428 if f:
429 fname = f
430 item = parts[1]
431 answer = find_function(item, fname)
432 return answer or failed
433
434 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000435 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000436
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000437 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
438 line or EOF). Warning: testing is not comprehensive.
439 """
Tim Peters2344fae2001-01-15 00:50:52 +0000440 line = linecache.getline(filename, lineno)
441 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000442 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000443 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000444 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000445 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000446 if (not line or (line[0] == '#') or
447 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000448 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000449 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000450 return lineno
451
452 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000453 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000454 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000455 try:
456 i = int(i)
457 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000458 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000459 continue
460
461 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000462 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000463 continue
464
465 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000466 if bp:
467 bp.enable()
468
469 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000470 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000471 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000472 try:
473 i = int(i)
474 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000475 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000476 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000477
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000478 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000479 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000480 continue
481
482 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000483 if bp:
484 bp.disable()
485
486 def do_condition(self, arg):
487 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000488 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000489 try:
490 bpnum = int(args[0].strip())
491 except ValueError:
492 # something went wrong
493 print >>self.stdout, \
494 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000495 return
Tim Peters2344fae2001-01-15 00:50:52 +0000496 try:
497 cond = args[1]
498 except:
499 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000500 try:
501 bp = bdb.Breakpoint.bpbynumber[bpnum]
502 except IndexError:
503 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
504 return
Tim Peters2344fae2001-01-15 00:50:52 +0000505 if bp:
506 bp.cond = cond
507 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000508 print >>self.stdout, 'Breakpoint', bpnum,
509 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000510
511 def do_ignore(self,arg):
512 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000513 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000514 try:
515 bpnum = int(args[0].strip())
516 except ValueError:
517 # something went wrong
518 print >>self.stdout, \
519 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000520 return
Tim Peters2344fae2001-01-15 00:50:52 +0000521 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000522 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000523 except:
524 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000525 try:
526 bp = bdb.Breakpoint.bpbynumber[bpnum]
527 except IndexError:
528 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
529 return
Tim Peters2344fae2001-01-15 00:50:52 +0000530 if bp:
531 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000532 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000533 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000534 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000535 reply = reply + '%d crossings' % count
536 else:
537 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000538 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000539 else:
Georg Brandl19564802006-05-10 17:13:20 +0000540 print >>self.stdout, 'Will stop next time breakpoint',
541 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000542
543 def do_clear(self, arg):
544 """Three possibilities, tried in this order:
545 clear -> clear all breaks, ask for confirmation
546 clear file:lineno -> clear all breaks at file:lineno
547 clear bpno bpno ... -> clear breakpoints by number"""
548 if not arg:
549 try:
550 reply = raw_input('Clear all breaks? ')
551 except EOFError:
552 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000553 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000554 if reply in ('y', 'yes'):
555 self.clear_all_breaks()
556 return
557 if ':' in arg:
558 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000559 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000560 filename = arg[:i]
561 arg = arg[i+1:]
562 try:
563 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000564 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000565 err = "Invalid line number (%s)" % arg
566 else:
567 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000568 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000569 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000570 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000571 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000572 try:
573 i = int(i)
574 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000575 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000576 continue
577
Georg Brandl6d2b3462005-08-24 07:36:17 +0000578 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000579 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000580 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000581 err = self.clear_bpbynumber(i)
582 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000583 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000584 else:
Georg Brandl19564802006-05-10 17:13:20 +0000585 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000586 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
587
588 def do_where(self, arg):
589 self.print_stack_trace()
590 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000591 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000592
593 def do_up(self, arg):
594 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000595 print >>self.stdout, '*** Oldest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000596 else:
597 self.curindex = self.curindex - 1
598 self.curframe = self.stack[self.curindex][0]
599 self.print_stack_entry(self.stack[self.curindex])
600 self.lineno = None
601 do_u = do_up
602
603 def do_down(self, arg):
604 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000605 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000606 else:
607 self.curindex = self.curindex + 1
608 self.curframe = self.stack[self.curindex][0]
609 self.print_stack_entry(self.stack[self.curindex])
610 self.lineno = None
611 do_d = do_down
612
613 def do_step(self, arg):
614 self.set_step()
615 return 1
616 do_s = do_step
617
618 def do_next(self, arg):
619 self.set_next(self.curframe)
620 return 1
621 do_n = do_next
622
Georg Brandl8e84c652007-03-13 21:08:15 +0000623 def do_run(self, arg):
624 """Restart program by raising an exception to be caught in the main debugger
625 loop. If arguments were given, set them in sys.argv."""
626 if arg:
627 import shlex
628 argv0 = sys.argv[0:1]
629 sys.argv = shlex.split(arg)
630 sys.argv[:0] = argv0
631 raise Restart
632
633 do_restart = do_run
634
Tim Peters2344fae2001-01-15 00:50:52 +0000635 def do_return(self, arg):
636 self.set_return(self.curframe)
637 return 1
638 do_r = do_return
639
640 def do_continue(self, arg):
641 self.set_continue()
642 return 1
643 do_c = do_cont = do_continue
644
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000645 def do_jump(self, arg):
646 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000647 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000648 return
649 try:
650 arg = int(arg)
651 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000652 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000653 else:
654 try:
655 # Do the jump, fix up our copy of the stack, and display the
656 # new position
657 self.curframe.f_lineno = arg
658 self.stack[self.curindex] = self.stack[self.curindex][0], arg
659 self.print_stack_entry(self.stack[self.curindex])
660 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000661 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000662 do_j = do_jump
663
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000664 def do_debug(self, arg):
665 sys.settrace(None)
666 globals = self.curframe.f_globals
667 locals = self.curframe.f_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000668 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000669 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000670 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000671 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000672 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000673 sys.settrace(self.trace_dispatch)
674 self.lastcmd = p.lastcmd
675
Tim Peters2344fae2001-01-15 00:50:52 +0000676 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000677 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000678 self.set_quit()
679 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000680
Tim Peters2344fae2001-01-15 00:50:52 +0000681 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000682 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000683
Guido van Rossumeef26072003-01-13 21:13:55 +0000684 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000685 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000686 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000687 self.set_quit()
688 return 1
689
Tim Peters2344fae2001-01-15 00:50:52 +0000690 def do_args(self, arg):
691 f = self.curframe
692 co = f.f_code
693 dict = f.f_locals
694 n = co.co_argcount
695 if co.co_flags & 4: n = n+1
696 if co.co_flags & 8: n = n+1
697 for i in range(n):
698 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000699 print >>self.stdout, name, '=',
700 if name in dict: print >>self.stdout, dict[name]
701 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000702 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000703
Tim Peters2344fae2001-01-15 00:50:52 +0000704 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000705 if '__return__' in self.curframe.f_locals:
Georg Brandl19564802006-05-10 17:13:20 +0000706 print >>self.stdout, self.curframe.f_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000707 else:
Georg Brandl19564802006-05-10 17:13:20 +0000708 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000709 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000710
Barry Warsaw210bd202002-11-05 22:40:20 +0000711 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000712 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000713 return eval(arg, self.curframe.f_globals,
714 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000715 except:
716 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000717 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000718 exc_type_name = t
719 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000720 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000721 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000722
Barry Warsaw210bd202002-11-05 22:40:20 +0000723 def do_p(self, arg):
724 try:
Georg Brandl19564802006-05-10 17:13:20 +0000725 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000726 except:
727 pass
728
729 def do_pp(self, arg):
730 try:
Georg Brandl19564802006-05-10 17:13:20 +0000731 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000732 except:
733 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000734
Tim Peters2344fae2001-01-15 00:50:52 +0000735 def do_list(self, arg):
736 self.lastcmd = 'list'
737 last = None
738 if arg:
739 try:
740 x = eval(arg, {}, {})
741 if type(x) == type(()):
742 first, last = x
743 first = int(first)
744 last = int(last)
745 if last < first:
746 # Assume it's a count
747 last = first + last
748 else:
749 first = max(1, int(x) - 5)
750 except:
Georg Brandl19564802006-05-10 17:13:20 +0000751 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000752 return
753 elif self.lineno is None:
754 first = max(1, self.curframe.f_lineno - 5)
755 else:
756 first = self.lineno + 1
757 if last is None:
758 last = first + 10
759 filename = self.curframe.f_code.co_filename
760 breaklist = self.get_file_breaks(filename)
761 try:
762 for lineno in range(first, last+1):
763 line = linecache.getline(filename, lineno)
764 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000765 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000766 break
767 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000768 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000769 if len(s) < 4: s = s + ' '
770 if lineno in breaklist: s = s + 'B'
771 else: s = s + ' '
772 if lineno == self.curframe.f_lineno:
773 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000774 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000775 self.lineno = lineno
776 except KeyboardInterrupt:
777 pass
778 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000779
Tim Peters2344fae2001-01-15 00:50:52 +0000780 def do_whatis(self, arg):
781 try:
782 value = eval(arg, self.curframe.f_globals,
783 self.curframe.f_locals)
784 except:
785 t, v = sys.exc_info()[:2]
786 if type(t) == type(''):
787 exc_type_name = t
788 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000789 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000790 return
791 code = None
792 # Is it a function?
793 try: code = value.func_code
794 except: pass
795 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000796 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000797 return
798 # Is it an instance method?
799 try: code = value.im_func.func_code
800 except: pass
801 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000802 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000803 return
804 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000805 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000806
Tim Peters2344fae2001-01-15 00:50:52 +0000807 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000808 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000809 if len(args) == 0:
810 keys = self.aliases.keys()
811 keys.sort()
812 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000813 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000814 return
Guido van Rossum08454592002-07-12 13:10:53 +0000815 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000816 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000817 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000818 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000819
Tim Peters2344fae2001-01-15 00:50:52 +0000820 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000821 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000822 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000823 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000824 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000825
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000826 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000827 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
828 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000829
Tim Peters2344fae2001-01-15 00:50:52 +0000830 # Print a traceback starting at the top stack frame.
831 # The most recently entered frame is printed last;
832 # this is different from dbx and gdb, but consistent with
833 # the Python interpreter's stack trace.
834 # It is also consistent with the up/down commands (which are
835 # compatible with dbx and gdb: up moves towards 'main()'
836 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000837
Tim Peters2344fae2001-01-15 00:50:52 +0000838 def print_stack_trace(self):
839 try:
840 for frame_lineno in self.stack:
841 self.print_stack_entry(frame_lineno)
842 except KeyboardInterrupt:
843 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000844
Tim Peters2344fae2001-01-15 00:50:52 +0000845 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
846 frame, lineno = frame_lineno
847 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000848 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000849 else:
Georg Brandl19564802006-05-10 17:13:20 +0000850 print >>self.stdout, ' ',
851 print >>self.stdout, self.format_stack_entry(frame_lineno,
852 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000853
Guido van Rossum921c8241992-01-10 14:54:42 +0000854
Tim Peters2344fae2001-01-15 00:50:52 +0000855 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000856
Tim Peters2344fae2001-01-15 00:50:52 +0000857 def help_help(self):
858 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000859
Tim Peters2344fae2001-01-15 00:50:52 +0000860 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000861 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000862Without argument, print the list of available commands.
863With a command name as argument, print help about that command
864"help pdb" pipes the full documentation file to the $PAGER
865"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000866
Tim Peters2344fae2001-01-15 00:50:52 +0000867 def help_where(self):
868 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000869
Tim Peters2344fae2001-01-15 00:50:52 +0000870 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000871 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000872Print a stack trace, with the most recent frame at the bottom.
873An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000874context of most commands. 'bt' is an alias for this command."""
875
876 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000877
Tim Peters2344fae2001-01-15 00:50:52 +0000878 def help_down(self):
879 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000880
Tim Peters2344fae2001-01-15 00:50:52 +0000881 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000882 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000883Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000884(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885
Tim Peters2344fae2001-01-15 00:50:52 +0000886 def help_up(self):
887 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888
Tim Peters2344fae2001-01-15 00:50:52 +0000889 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000890 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000891Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000892(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893
Tim Peters2344fae2001-01-15 00:50:52 +0000894 def help_break(self):
895 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896
Tim Peters2344fae2001-01-15 00:50:52 +0000897 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000898 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000899With a line number argument, set a break there in the current
900file. With a function name, set a break at first executable line
901of that function. Without argument, list all breaks. If a second
902argument is present, it is a string specifying an expression
903which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904
Tim Peters2344fae2001-01-15 00:50:52 +0000905The line number may be prefixed with a filename and a colon,
906to specify a breakpoint in another file (probably one that
907hasn't been loaded yet). The file is searched for on sys.path;
908the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000909
Tim Peters2344fae2001-01-15 00:50:52 +0000910 def help_clear(self):
911 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912
Tim Peters2344fae2001-01-15 00:50:52 +0000913 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000914 print >>self.stdout, "cl(ear) filename:lineno"
915 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000916With a space separated list of breakpoint numbers, clear
917those breakpoints. Without argument, clear all breaks (but
918first ask confirmation). With a filename:lineno argument,
919clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000920
Tim Peters2344fae2001-01-15 00:50:52 +0000921Note that the argument is different from previous versions of
922the debugger (in python distributions 1.5.1 and before) where
923a linenumber was used instead of either filename:lineno or
924breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000925
Tim Peters2344fae2001-01-15 00:50:52 +0000926 def help_tbreak(self):
Georg Brandl19564802006-05-10 17:13:20 +0000927 print >>self.stdout, """tbreak same arguments as break, but breakpoint is
Tim Peters2344fae2001-01-15 00:50:52 +0000928removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000929
Tim Peters2344fae2001-01-15 00:50:52 +0000930 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000931 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000932Enables the breakpoints given as a space separated list of
933bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000934
Tim Peters2344fae2001-01-15 00:50:52 +0000935 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000936 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000937Disables the breakpoints given as a space separated list of
938bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000939
Tim Peters2344fae2001-01-15 00:50:52 +0000940 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000941 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000942Sets the ignore count for the given breakpoint number. A breakpoint
943becomes active when the ignore count is zero. When non-zero, the
944count is decremented each time the breakpoint is reached and the
945breakpoint is not disabled and any associated condition evaluates
946to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000947
Tim Peters2344fae2001-01-15 00:50:52 +0000948 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000949 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000950str_condition is a string specifying an expression which
951must evaluate to true before the breakpoint is honored.
952If str_condition is absent, any existing condition is removed;
953i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000954
Tim Peters2344fae2001-01-15 00:50:52 +0000955 def help_step(self):
956 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000957
Tim Peters2344fae2001-01-15 00:50:52 +0000958 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000959 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000960Execute the current line, stop at the first possible occasion
961(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000962
Tim Peters2344fae2001-01-15 00:50:52 +0000963 def help_next(self):
964 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965
Tim Peters2344fae2001-01-15 00:50:52 +0000966 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +0000967 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000968Continue execution until the next line in the current function
969is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000970
Tim Peters2344fae2001-01-15 00:50:52 +0000971 def help_return(self):
972 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000973
Tim Peters2344fae2001-01-15 00:50:52 +0000974 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +0000975 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +0000976Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_continue(self):
979 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000980
Tim Peters2344fae2001-01-15 00:50:52 +0000981 def help_cont(self):
982 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000983
Tim Peters2344fae2001-01-15 00:50:52 +0000984 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +0000985 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +0000986Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000987
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000988 def help_jump(self):
989 self.help_j()
990
991 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +0000992 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000993Set the next line that will be executed."""
994
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000995 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +0000996 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000997Enter a recursive debugger that steps through the code argument
998(which is an arbitrary expression or statement to be executed
999in the current environment)."""
1000
Tim Peters2344fae2001-01-15 00:50:52 +00001001 def help_list(self):
1002 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003
Tim Peters2344fae2001-01-15 00:50:52 +00001004 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001005 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001006List source code for the current file.
1007Without arguments, list 11 lines around the current line
1008or continue the previous listing.
1009With one argument, list 11 lines starting at that line.
1010With two arguments, list the given range;
1011if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012
Tim Peters2344fae2001-01-15 00:50:52 +00001013 def help_args(self):
1014 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015
Tim Peters2344fae2001-01-15 00:50:52 +00001016 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001017 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001018Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019
Tim Peters2344fae2001-01-15 00:50:52 +00001020 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001021 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001022Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001023
Barry Warsaw210bd202002-11-05 22:40:20 +00001024 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001025 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001026Pretty-print the value of the expression."""
1027
Tim Peters2344fae2001-01-15 00:50:52 +00001028 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001029 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001030Execute the (one-line) statement in the context of
1031the current stack frame.
1032The exclamation point can be omitted unless the first word
1033of the statement resembles a debugger command.
1034To assign to a global variable you must always prefix the
1035command with a 'global' command, e.g.:
1036(Pdb) global list_options; list_options = ['-l']
1037(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001038
Georg Brandl8e84c652007-03-13 21:08:15 +00001039 def help_run(self):
1040 print """run [args...]
1041Restart the debugged python program. If a string is supplied, it is
1042splitted with "shlex" and the result is used as the new sys.argv.
1043History, breakpoints, actions and debugger options are preserved.
1044"restart" is an alias for "run"."""
1045
1046 help_restart = help_run
1047
Tim Peters2344fae2001-01-15 00:50:52 +00001048 def help_quit(self):
1049 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001050
Tim Peters2344fae2001-01-15 00:50:52 +00001051 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001052 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001053The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001055 help_exit = help_q
1056
Tim Peters2344fae2001-01-15 00:50:52 +00001057 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001058 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001059Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001060
Tim Peters2344fae2001-01-15 00:50:52 +00001061 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001062 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001063Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001064
Tim Peters2344fae2001-01-15 00:50:52 +00001065 def help_alias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001066 print >>self.stdout, """alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001067Creates an alias called 'name' the executes 'command'. The command
1068must *not* be enclosed in quotes. Replaceable parameters are
1069indicated by %1, %2, and so on, while %* is replaced by all the
1070parameters. If no command is given, the current alias for name
1071is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001072
Tim Peters2344fae2001-01-15 00:50:52 +00001073Aliases may be nested and can contain anything that can be
1074legally typed at the pdb prompt. Note! You *can* override
1075internal pdb commands with aliases! Those internal commands
1076are then hidden until the alias is removed. Aliasing is recursively
1077applied to the first word of the command line; all other words
1078in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001079
Tim Peters2344fae2001-01-15 00:50:52 +00001080Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001081
Tim Peters2344fae2001-01-15 00:50:52 +00001082#Print instance variables (usage "pi classInst")
1083alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001084
Tim Peters2344fae2001-01-15 00:50:52 +00001085#Print instance variables in self
1086alias ps pi self
1087"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001088
Tim Peters2344fae2001-01-15 00:50:52 +00001089 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001090 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001091Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001092
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001093 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001094 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001095(com) ...
1096(com) end
1097(Pdb)
1098
1099Specify a list of commands for breakpoint number bpnumber. The
1100commands themselves appear on the following lines. Type a line
1101containing just 'end' to terminate the commands.
1102
1103To remove all commands from a breakpoint, type commands and
1104follow it immediately with end; that is, give no commands.
1105
1106With no bpnumber argument, commands refers to the last
1107breakpoint set.
1108
1109You can use breakpoint commands to start your program up again.
1110Simply use the continue command, or step, or any other
1111command that resumes execution.
1112
1113Specifying any command resuming execution (currently continue,
1114step, next, return, jump, quit and their abbreviations) terminates
1115the command list (as if that command was immediately followed by end).
1116This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001117(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001118another breakpoint--which could have its own command list, leading to
1119ambiguities about which list to execute.
1120
1121 If you use the 'silent' command in the command list, the
1122usual message about stopping at a breakpoint is not printed. This may
1123be desirable for breakpoints that are to print a specific message and
1124then continue. If none of the other commands print anything, you
1125see no sign that the breakpoint was reached.
1126"""
1127
Tim Peters2344fae2001-01-15 00:50:52 +00001128 def help_pdb(self):
1129 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001130
Tim Peters2344fae2001-01-15 00:50:52 +00001131 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001132 """Helper function for break/clear parsing -- may be overridden.
1133
1134 lookupmodule() translates (possibly incomplete) file or module name
1135 into an absolute file name.
1136 """
1137 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001138 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001139 f = os.path.join(sys.path[0], filename)
1140 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1141 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001142 root, ext = os.path.splitext(filename)
1143 if ext == '':
1144 filename = filename + '.py'
1145 if os.path.isabs(filename):
1146 return filename
1147 for dirname in sys.path:
1148 while os.path.islink(dirname):
1149 dirname = os.readlink(dirname)
1150 fullname = os.path.join(dirname, filename)
1151 if os.path.exists(fullname):
1152 return fullname
1153 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001154
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001155 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001156 # The script has to run in __main__ namespace (or imports from
1157 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001158 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001159 # So we clear up the __main__ and set several special variables
1160 # (this gets rid of pdb's globals and cleans old variables on restarts).
1161 import __main__
1162 __main__.__dict__.clear()
1163 __main__.__dict__.update({"__name__" : "__main__",
1164 "__file__" : filename,
1165 "__builtins__": __builtins__,
1166 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001167
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001168 # When bdb sets tracing, a number of call and line events happens
1169 # BEFORE debugger even reaches user's code (and the exact sequence of
1170 # events depends on python version). So we take special measures to
1171 # avoid stopping before we reach the main script (see user_line and
1172 # user_call for details).
1173 self._wait_for_mainpyfile = 1
1174 self.mainpyfile = self.canonic(filename)
1175 self._user_requested_quit = 0
1176 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001177 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001178
Guido van Rossum35771131992-09-08 11:59:04 +00001179# Simplified interface
1180
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001181def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001182 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001183
1184def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001185 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001186
1187def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001188 # B/W compatibility
1189 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001190
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001191def runcall(*args, **kwds):
1192 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001193
Guido van Rossumb6775db1994-08-01 11:34:53 +00001194def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001195 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001196
1197# Post-Mortem interface
1198
1199def post_mortem(t):
Tim Peters2344fae2001-01-15 00:50:52 +00001200 p = Pdb()
1201 p.reset()
1202 while t.tb_next is not None:
1203 t = t.tb_next
1204 p.interaction(t.tb_frame, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001205
1206def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001207 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001208
1209
1210# Main program for testing
1211
Guido van Rossum23efba41992-01-27 16:58:47 +00001212TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001213
Guido van Rossum921c8241992-01-10 14:54:42 +00001214def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001215 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001216
1217# print help
1218def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001219 for dirname in sys.path:
1220 fullname = os.path.join(dirname, 'pdb.doc')
1221 if os.path.exists(fullname):
1222 sts = os.system('${PAGER-more} '+fullname)
1223 if sts: print '*** Pager exit status:', sts
1224 break
1225 else:
1226 print 'Sorry, can\'t find the help file "pdb.doc"',
1227 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001228
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001229def main():
Tim Peters2344fae2001-01-15 00:50:52 +00001230 if not sys.argv[1:]:
1231 print "usage: pdb.py scriptfile [arg] ..."
1232 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001233
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001234 mainpyfile = sys.argv[1] # Get script filename
1235 if not os.path.exists(mainpyfile):
1236 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001237 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001238
Tim Peters2344fae2001-01-15 00:50:52 +00001239 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001240
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001241 # Replace pdb's dir with script's dir in front of module search path.
1242 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001243
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001244 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1245 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl8e84c652007-03-13 21:08:15 +00001246 # changed by the user from the command line. There is a "restart" command which
1247 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001248 pdb = Pdb()
1249 while 1:
1250 try:
1251 pdb._runscript(mainpyfile)
1252 if pdb._user_requested_quit:
1253 break
Tim Peterse718f612004-10-12 21:51:32 +00001254 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001255 except Restart:
1256 print "Restarting", mainpyfile, "with arguments:"
1257 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001258 except SystemExit:
1259 # In most cases SystemExit does not warrant a post-mortem session.
1260 print "The program exited via sys.exit(). Exit status: ",
1261 print sys.exc_info()[1]
1262 except:
1263 traceback.print_exc()
1264 print "Uncaught exception. Entering post mortem debugging"
1265 print "Running 'cont' or 'step' will restart the program"
1266 t = sys.exc_info()[2]
1267 while t.tb_next is not None:
1268 t = t.tb_next
1269 pdb.interaction(t.tb_frame,t)
1270 print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
1271
1272
1273# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001274if __name__ == '__main__':
1275 import pdb
1276 pdb.main()