blob: e9f5632b14f777c383833eaf9f88aec7446f874f [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumf17361d1996-07-30 16:28:13 +00002
Guido van Rossum4b8c6ea2000-02-04 15:39:30 +00003"""A Python debugger."""
Guido van Rossum92df0c61992-01-14 18:30:15 +00004
Guido van Rossum23efba41992-01-27 16:58:47 +00005# (See pdb.doc for documentation.)
Guido van Rossum921c8241992-01-10 14:54:42 +00006
Guido van Rossum921c8241992-01-10 14:54:42 +00007import sys
8import linecache
Guido van Rossum23efba41992-01-27 16:58:47 +00009import cmd
10import bdb
Brett Cannon2ee0e8e2008-05-23 05:03:59 +000011from repr import Repr
Guido van Rossumb5699c71998-07-20 23:13:54 +000012import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000013import re
Barry Warsaw210bd202002-11-05 22:40:20 +000014import pprint
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000015import traceback
Georg Brandl8e84c652007-03-13 21:08:15 +000016
17
18class Restart(Exception):
19 """Causes a debugger to be restarted for the debugged python program."""
20 pass
21
Guido van Rossumef1b41b2002-09-10 21:57:14 +000022# Create a custom safe Repr instance and increase its maxstring.
23# The default of 30 truncates error messages too easily.
24_repr = Repr()
25_repr.maxstring = 200
26_saferepr = _repr.repr
27
Skip Montanaro352674d2001-02-07 23:14:30 +000028__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
29 "post_mortem", "help"]
30
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000031def find_function(funcname, filename):
Andrew M. Kuchlinge6728252006-09-05 13:19:18 +000032 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000033 try:
34 fp = open(filename)
35 except IOError:
36 return None
37 # consumer of this info expects the first line to be 1
38 lineno = 1
39 answer = None
40 while 1:
41 line = fp.readline()
42 if line == '':
43 break
44 if cre.match(line):
45 answer = funcname, filename, lineno
46 break
47 lineno = lineno + 1
48 fp.close()
49 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +000050
51
Guido van Rossuma558e371994-11-10 22:27:35 +000052# Interaction prompt line will separate file and call info from code
53# text using value of line_prefix string. A newline and arrow may
54# be to your liking. You can set it once pdb is imported using the
55# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +000056# line_prefix = ': ' # Use this to get the old situation back
57line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +000058
Guido van Rossum23efba41992-01-27 16:58:47 +000059class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +000060
Georg Brandl19564802006-05-10 17:13:20 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None):
Tim Peters2344fae2001-01-15 00:50:52 +000062 bdb.Bdb.__init__(self)
Georg Brandl19564802006-05-10 17:13:20 +000063 cmd.Cmd.__init__(self, completekey, stdin, stdout)
64 if stdout:
65 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +000066 self.prompt = '(Pdb) '
67 self.aliases = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000068 self.mainpyfile = ''
69 self._wait_for_mainpyfile = 0
Tim Peters2344fae2001-01-15 00:50:52 +000070 # Try to load readline if it exists
71 try:
72 import readline
73 except ImportError:
74 pass
Guido van Rossum2424f851998-09-11 22:50:09 +000075
Tim Peters2344fae2001-01-15 00:50:52 +000076 # Read $HOME/.pdbrc and ./.pdbrc
77 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +000078 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +000079 envHome = os.environ['HOME']
80 try:
81 rcFile = open(os.path.join(envHome, ".pdbrc"))
82 except IOError:
83 pass
84 else:
85 for line in rcFile.readlines():
86 self.rcLines.append(line)
87 rcFile.close()
88 try:
89 rcFile = open(".pdbrc")
90 except IOError:
91 pass
92 else:
93 for line in rcFile.readlines():
94 self.rcLines.append(line)
95 rcFile.close()
Guido van Rossum23efba41992-01-27 16:58:47 +000096
Martin v. Löwisbd30f522006-04-17 17:08:37 +000097 self.commands = {} # associates a command list to breakpoint numbers
98 self.commands_doprompt = {} # for each bp num, tells if the prompt must be disp. after execing the cmd list
99 self.commands_silent = {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list
100 self.commands_defining = False # True while in the process of defining a command list
101 self.commands_bnum = None # The breakpoint number for which we are defining a list
102
Tim Peters2344fae2001-01-15 00:50:52 +0000103 def reset(self):
104 bdb.Bdb.reset(self)
105 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000106
Tim Peters2344fae2001-01-15 00:50:52 +0000107 def forget(self):
108 self.lineno = None
109 self.stack = []
110 self.curindex = 0
111 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000112
Tim Peters2344fae2001-01-15 00:50:52 +0000113 def setup(self, f, t):
114 self.forget()
115 self.stack, self.curindex = self.get_stack(f, t)
116 self.curframe = self.stack[self.curindex][0]
117 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118
Tim Peters2344fae2001-01-15 00:50:52 +0000119 # Can be executed earlier than 'setup' if desired
120 def execRcLines(self):
121 if self.rcLines:
122 # Make local copy because of recursion
123 rcLines = self.rcLines
124 # executed only once
125 self.rcLines = []
126 for line in rcLines:
127 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000128 if len(line) > 0 and line[0] != '#':
129 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000130
Tim Peters280488b2002-08-23 18:19:30 +0000131 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000132
133 def user_call(self, frame, argument_list):
134 """This method is called when there is the remote possibility
135 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000136 if self._wait_for_mainpyfile:
137 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000138 if self.stop_here(frame):
Georg Brandl19564802006-05-10 17:13:20 +0000139 print >>self.stdout, '--Call--'
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000140 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000141
Tim Peters2344fae2001-01-15 00:50:52 +0000142 def user_line(self, frame):
143 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 if self._wait_for_mainpyfile:
145 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
146 or frame.f_lineno<= 0):
147 return
148 self._wait_for_mainpyfile = 0
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000149 if self.bp_commands(frame):
150 self.interaction(frame, None)
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000151
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000152 def bp_commands(self,frame):
153 """ Call every command that was set for the current active breakpoint (if there is one)
154 Returns True if the normal interaction function must be called, False otherwise """
155 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
156 if getattr(self,"currentbp",False) and self.currentbp in self.commands:
157 currentbp = self.currentbp
158 self.currentbp = 0
159 lastcmd_back = self.lastcmd
160 self.setup(frame, None)
161 for line in self.commands[currentbp]:
162 self.onecmd(line)
163 self.lastcmd = lastcmd_back
164 if not self.commands_silent[currentbp]:
165 self.print_stack_entry(self.stack[self.curindex])
166 if self.commands_doprompt[currentbp]:
167 self.cmdloop()
168 self.forget()
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000169 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000170 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000171
Tim Peters2344fae2001-01-15 00:50:52 +0000172 def user_return(self, frame, return_value):
173 """This function is called when a return trap is set here."""
174 frame.f_locals['__return__'] = return_value
Georg Brandl19564802006-05-10 17:13:20 +0000175 print >>self.stdout, '--Return--'
Tim Peters2344fae2001-01-15 00:50:52 +0000176 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000177
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000178 def user_exception(self, frame, exc_info):
179 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000180 """This function is called if an exception occurs,
181 but only if we are to stop at or just below this level."""
182 frame.f_locals['__exception__'] = exc_type, exc_value
183 if type(exc_type) == type(''):
184 exc_type_name = exc_type
185 else: exc_type_name = exc_type.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000186 print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters2344fae2001-01-15 00:50:52 +0000187 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000188
Tim Peters2344fae2001-01-15 00:50:52 +0000189 # General interaction function
190
191 def interaction(self, frame, traceback):
192 self.setup(frame, traceback)
193 self.print_stack_entry(self.stack[self.curindex])
194 self.cmdloop()
195 self.forget()
196
Georg Brandl9b08e052009-04-05 21:21:05 +0000197 def displayhook(self, obj):
198 """Custom displayhook for the exec in default(), which prevents
199 assignment of the _ variable in the builtins.
200 """
201 print repr(obj)
202
Tim Peters2344fae2001-01-15 00:50:52 +0000203 def default(self, line):
204 if line[:1] == '!': line = line[1:]
205 locals = self.curframe.f_locals
206 globals = self.curframe.f_globals
207 try:
208 code = compile(line + '\n', '<stdin>', 'single')
Amaury Forgeot d'Arcff0f2672008-01-15 21:25:11 +0000209 save_stdout = sys.stdout
210 save_stdin = sys.stdin
Georg Brandl9b08e052009-04-05 21:21:05 +0000211 save_displayhook = sys.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000212 try:
213 sys.stdin = self.stdin
214 sys.stdout = self.stdout
Georg Brandl9b08e052009-04-05 21:21:05 +0000215 sys.displayhook = self.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000216 exec code in globals, locals
217 finally:
218 sys.stdout = save_stdout
219 sys.stdin = save_stdin
Georg Brandl9b08e052009-04-05 21:21:05 +0000220 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000221 except:
222 t, v = sys.exc_info()[:2]
223 if type(t) == type(''):
224 exc_type_name = t
225 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000226 print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters2344fae2001-01-15 00:50:52 +0000227
228 def precmd(self, line):
229 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000230 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000231 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000232 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000233 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000234 line = self.aliases[args[0]]
235 ii = 1
236 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000237 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000238 tmpArg)
239 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000240 line = line.replace("%*", ' '.join(args[1:]))
241 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000242 # split into ';;' separated commands
243 # unless it's an alias command
244 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000245 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000246 if marker >= 0:
247 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000248 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000249 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000250 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000251 return line
252
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000253 def onecmd(self, line):
254 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000255 to the prompt.
256
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000257 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000258 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000259 """
260 if not self.commands_defining:
261 return cmd.Cmd.onecmd(self, line)
262 else:
263 return self.handle_command_def(line)
264
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000265 def handle_command_def(self,line):
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000266 """ Handles one command line during command list definition. """
267 cmd, arg, line = self.parseline(line)
268 if cmd == 'silent':
269 self.commands_silent[self.commands_bnum] = True
270 return # continue to handle other cmd def in the cmd list
271 elif cmd == 'end':
272 self.cmdqueue = []
273 return 1 # end of cmd list
274 cmdlist = self.commands[self.commands_bnum]
275 if (arg):
276 cmdlist.append(cmd+' '+arg)
277 else:
278 cmdlist.append(cmd)
279 # Determine if we must stop
280 try:
281 func = getattr(self, 'do_' + cmd)
282 except AttributeError:
283 func = self.default
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000284 if func.func_name in self.commands_resuming : # one of the resuming commands.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000285 self.commands_doprompt[self.commands_bnum] = False
286 self.cmdqueue = []
287 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000288 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000289
Tim Peters2344fae2001-01-15 00:50:52 +0000290 # Command definitions, called by cmdloop()
291 # The argument is the remaining string on the command line
292 # Return true to exit from the command loop
293
294 do_h = cmd.Cmd.do_help
295
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000296 def do_commands(self, arg):
297 """Defines a list of commands associated to a breakpoint
298 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
299 if not arg:
300 bnum = len(bdb.Breakpoint.bpbynumber)-1
301 else:
302 try:
303 bnum = int(arg)
304 except:
Georg Brandl19564802006-05-10 17:13:20 +0000305 print >>self.stdout, "Usage : commands [bnum]\n ...\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000306 return
307 self.commands_bnum = bnum
308 self.commands[bnum] = []
309 self.commands_doprompt[bnum] = True
310 self.commands_silent[bnum] = False
311 prompt_back = self.prompt
312 self.prompt = '(com) '
313 self.commands_defining = True
314 self.cmdloop()
315 self.commands_defining = False
316 self.prompt = prompt_back
317
Tim Peters2344fae2001-01-15 00:50:52 +0000318 def do_break(self, arg, temporary = 0):
319 # break [ ([filename:]lineno | function) [, "condition"] ]
320 if not arg:
321 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000322 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000323 for bp in bdb.Breakpoint.bpbynumber:
324 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000325 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000326 return
327 # parse arguments; comma has lowest precedence
328 # and cannot occur in filename
329 filename = None
330 lineno = None
331 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000332 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000333 if comma > 0:
334 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000335 cond = arg[comma+1:].lstrip()
336 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000337 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000338 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000339 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000340 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000341 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000342 f = self.lookupmodule(filename)
343 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000344 print >>self.stdout, '*** ', repr(filename),
345 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000346 return
347 else:
348 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000349 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000350 try:
351 lineno = int(arg)
352 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000353 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000354 return
355 else:
356 # no colon; can be lineno or function
357 try:
358 lineno = int(arg)
359 except ValueError:
360 try:
361 func = eval(arg,
362 self.curframe.f_globals,
363 self.curframe.f_locals)
364 except:
365 func = arg
366 try:
367 if hasattr(func, 'im_func'):
368 func = func.im_func
369 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000370 #use co_name to identify the bkpt (function names
371 #could be aliased, but co_name is invariant)
372 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000373 lineno = code.co_firstlineno
374 filename = code.co_filename
375 except:
376 # last thing to try
377 (ok, filename, ln) = self.lineinfo(arg)
378 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000379 print >>self.stdout, '*** The specified object',
380 print >>self.stdout, repr(arg),
381 print >>self.stdout, 'is not a function'
382 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000383 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000384 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000385 lineno = int(ln)
386 if not filename:
387 filename = self.defaultFile()
388 # Check for reasonable breakpoint
389 line = self.checkline(filename, lineno)
390 if line:
391 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000392 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000393 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000394 else:
395 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000396 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
397 bp.file,
398 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000399
400 # To be overridden in derived debuggers
401 def defaultFile(self):
402 """Produce a reasonable default."""
403 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000404 if filename == '<string>' and self.mainpyfile:
405 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000406 return filename
407
408 do_b = do_break
409
410 def do_tbreak(self, arg):
411 self.do_break(arg, 1)
412
413 def lineinfo(self, identifier):
414 failed = (None, None, None)
415 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000416 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000417 if len(idstring) == 1:
418 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000419 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000420 elif len(idstring) == 3:
421 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000422 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000423 else:
424 return failed
425 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000426 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000427 # Protection for derived debuggers
428 if parts[0] == 'self':
429 del parts[0]
430 if len(parts) == 0:
431 return failed
432 # Best first guess at file to look at
433 fname = self.defaultFile()
434 if len(parts) == 1:
435 item = parts[0]
436 else:
437 # More than one part.
438 # First is module, second is method/class
439 f = self.lookupmodule(parts[0])
440 if f:
441 fname = f
442 item = parts[1]
443 answer = find_function(item, fname)
444 return answer or failed
445
446 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000447 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000448
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000449 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
450 line or EOF). Warning: testing is not comprehensive.
451 """
Nick Coghlan30327242008-12-14 11:30:16 +0000452 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000453 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000454 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000455 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000456 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000457 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000458 if (not line or (line[0] == '#') or
459 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000460 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000461 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000462 return lineno
463
464 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000465 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000466 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000467 try:
468 i = int(i)
469 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000470 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000471 continue
472
473 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000474 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000475 continue
476
477 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000478 if bp:
479 bp.enable()
480
481 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000482 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000483 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000484 try:
485 i = int(i)
486 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000487 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000488 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000489
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000490 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000491 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000492 continue
493
494 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000495 if bp:
496 bp.disable()
497
498 def do_condition(self, arg):
499 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000500 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000501 try:
502 bpnum = int(args[0].strip())
503 except ValueError:
504 # something went wrong
505 print >>self.stdout, \
506 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000507 return
Tim Peters2344fae2001-01-15 00:50:52 +0000508 try:
509 cond = args[1]
510 except:
511 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000512 try:
513 bp = bdb.Breakpoint.bpbynumber[bpnum]
514 except IndexError:
515 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
516 return
Tim Peters2344fae2001-01-15 00:50:52 +0000517 if bp:
518 bp.cond = cond
519 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000520 print >>self.stdout, 'Breakpoint', bpnum,
521 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000522
523 def do_ignore(self,arg):
524 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000525 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000526 try:
527 bpnum = int(args[0].strip())
528 except ValueError:
529 # something went wrong
530 print >>self.stdout, \
531 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000532 return
Tim Peters2344fae2001-01-15 00:50:52 +0000533 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000534 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000535 except:
536 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000537 try:
538 bp = bdb.Breakpoint.bpbynumber[bpnum]
539 except IndexError:
540 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
541 return
Tim Peters2344fae2001-01-15 00:50:52 +0000542 if bp:
543 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000544 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000545 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000546 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000547 reply = reply + '%d crossings' % count
548 else:
549 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000550 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000551 else:
Georg Brandl19564802006-05-10 17:13:20 +0000552 print >>self.stdout, 'Will stop next time breakpoint',
553 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000554
555 def do_clear(self, arg):
556 """Three possibilities, tried in this order:
557 clear -> clear all breaks, ask for confirmation
558 clear file:lineno -> clear all breaks at file:lineno
559 clear bpno bpno ... -> clear breakpoints by number"""
560 if not arg:
561 try:
562 reply = raw_input('Clear all breaks? ')
563 except EOFError:
564 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000565 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000566 if reply in ('y', 'yes'):
567 self.clear_all_breaks()
568 return
569 if ':' in arg:
570 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000571 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000572 filename = arg[:i]
573 arg = arg[i+1:]
574 try:
575 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000576 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000577 err = "Invalid line number (%s)" % arg
578 else:
579 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000580 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000581 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000582 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000583 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000584 try:
585 i = int(i)
586 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000587 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000588 continue
589
Georg Brandl6d2b3462005-08-24 07:36:17 +0000590 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000591 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000592 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000593 err = self.clear_bpbynumber(i)
594 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000595 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000596 else:
Georg Brandl19564802006-05-10 17:13:20 +0000597 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000598 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
599
600 def do_where(self, arg):
601 self.print_stack_trace()
602 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000603 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000604
605 def do_up(self, arg):
606 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000607 print >>self.stdout, '*** Oldest 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_u = do_up
614
615 def do_down(self, arg):
616 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000617 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000618 else:
619 self.curindex = self.curindex + 1
620 self.curframe = self.stack[self.curindex][0]
621 self.print_stack_entry(self.stack[self.curindex])
622 self.lineno = None
623 do_d = do_down
624
Benjamin Peterson98353942008-05-11 14:13:25 +0000625 def do_until(self, arg):
626 self.set_until(self.curframe)
627 return 1
628 do_unt = do_until
629
Tim Peters2344fae2001-01-15 00:50:52 +0000630 def do_step(self, arg):
631 self.set_step()
632 return 1
633 do_s = do_step
634
635 def do_next(self, arg):
636 self.set_next(self.curframe)
637 return 1
638 do_n = do_next
639
Georg Brandl8e84c652007-03-13 21:08:15 +0000640 def do_run(self, arg):
641 """Restart program by raising an exception to be caught in the main debugger
642 loop. If arguments were given, set them in sys.argv."""
643 if arg:
644 import shlex
645 argv0 = sys.argv[0:1]
646 sys.argv = shlex.split(arg)
647 sys.argv[:0] = argv0
648 raise Restart
649
650 do_restart = do_run
651
Tim Peters2344fae2001-01-15 00:50:52 +0000652 def do_return(self, arg):
653 self.set_return(self.curframe)
654 return 1
655 do_r = do_return
656
657 def do_continue(self, arg):
658 self.set_continue()
659 return 1
660 do_c = do_cont = do_continue
661
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000662 def do_jump(self, arg):
663 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000664 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000665 return
666 try:
667 arg = int(arg)
668 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000669 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000670 else:
671 try:
672 # Do the jump, fix up our copy of the stack, and display the
673 # new position
674 self.curframe.f_lineno = arg
675 self.stack[self.curindex] = self.stack[self.curindex][0], arg
676 self.print_stack_entry(self.stack[self.curindex])
677 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000678 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000679 do_j = do_jump
680
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000681 def do_debug(self, arg):
682 sys.settrace(None)
683 globals = self.curframe.f_globals
684 locals = self.curframe.f_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000685 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000686 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000687 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000688 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000689 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000690 sys.settrace(self.trace_dispatch)
691 self.lastcmd = p.lastcmd
692
Tim Peters2344fae2001-01-15 00:50:52 +0000693 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000694 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000695 self.set_quit()
696 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000697
Tim Peters2344fae2001-01-15 00:50:52 +0000698 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000699 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000700
Guido van Rossumeef26072003-01-13 21:13:55 +0000701 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000702 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000703 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000704 self.set_quit()
705 return 1
706
Tim Peters2344fae2001-01-15 00:50:52 +0000707 def do_args(self, arg):
708 f = self.curframe
709 co = f.f_code
710 dict = f.f_locals
711 n = co.co_argcount
712 if co.co_flags & 4: n = n+1
713 if co.co_flags & 8: n = n+1
714 for i in range(n):
715 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000716 print >>self.stdout, name, '=',
717 if name in dict: print >>self.stdout, dict[name]
718 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000719 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000720
Tim Peters2344fae2001-01-15 00:50:52 +0000721 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000722 if '__return__' in self.curframe.f_locals:
Georg Brandl19564802006-05-10 17:13:20 +0000723 print >>self.stdout, self.curframe.f_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000724 else:
Georg Brandl19564802006-05-10 17:13:20 +0000725 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000726 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000727
Barry Warsaw210bd202002-11-05 22:40:20 +0000728 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000729 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000730 return eval(arg, self.curframe.f_globals,
731 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000732 except:
733 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000734 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000735 exc_type_name = t
736 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000737 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000738 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000739
Barry Warsaw210bd202002-11-05 22:40:20 +0000740 def do_p(self, arg):
741 try:
Georg Brandl19564802006-05-10 17:13:20 +0000742 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000743 except:
744 pass
745
746 def do_pp(self, arg):
747 try:
Georg Brandl19564802006-05-10 17:13:20 +0000748 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000749 except:
750 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000751
Tim Peters2344fae2001-01-15 00:50:52 +0000752 def do_list(self, arg):
753 self.lastcmd = 'list'
754 last = None
755 if arg:
756 try:
757 x = eval(arg, {}, {})
758 if type(x) == type(()):
759 first, last = x
760 first = int(first)
761 last = int(last)
762 if last < first:
763 # Assume it's a count
764 last = first + last
765 else:
766 first = max(1, int(x) - 5)
767 except:
Georg Brandl19564802006-05-10 17:13:20 +0000768 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000769 return
770 elif self.lineno is None:
771 first = max(1, self.curframe.f_lineno - 5)
772 else:
773 first = self.lineno + 1
774 if last is None:
775 last = first + 10
776 filename = self.curframe.f_code.co_filename
777 breaklist = self.get_file_breaks(filename)
778 try:
779 for lineno in range(first, last+1):
Nick Coghlan30327242008-12-14 11:30:16 +0000780 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000781 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000782 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000783 break
784 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000785 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000786 if len(s) < 4: s = s + ' '
787 if lineno in breaklist: s = s + 'B'
788 else: s = s + ' '
789 if lineno == self.curframe.f_lineno:
790 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000791 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000792 self.lineno = lineno
793 except KeyboardInterrupt:
794 pass
795 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000796
Tim Peters2344fae2001-01-15 00:50:52 +0000797 def do_whatis(self, arg):
798 try:
799 value = eval(arg, self.curframe.f_globals,
800 self.curframe.f_locals)
801 except:
802 t, v = sys.exc_info()[:2]
803 if type(t) == type(''):
804 exc_type_name = t
805 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000806 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000807 return
808 code = None
809 # Is it a function?
810 try: code = value.func_code
811 except: pass
812 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000813 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000814 return
815 # Is it an instance method?
816 try: code = value.im_func.func_code
817 except: pass
818 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000819 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000820 return
821 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000822 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000823
Tim Peters2344fae2001-01-15 00:50:52 +0000824 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000825 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000826 if len(args) == 0:
827 keys = self.aliases.keys()
828 keys.sort()
829 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000830 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000831 return
Guido van Rossum08454592002-07-12 13:10:53 +0000832 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000833 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000834 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000835 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000836
Tim Peters2344fae2001-01-15 00:50:52 +0000837 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000838 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000839 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000840 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000841 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000842
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000843 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000844 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
845 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000846
Tim Peters2344fae2001-01-15 00:50:52 +0000847 # Print a traceback starting at the top stack frame.
848 # The most recently entered frame is printed last;
849 # this is different from dbx and gdb, but consistent with
850 # the Python interpreter's stack trace.
851 # It is also consistent with the up/down commands (which are
852 # compatible with dbx and gdb: up moves towards 'main()'
853 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000854
Tim Peters2344fae2001-01-15 00:50:52 +0000855 def print_stack_trace(self):
856 try:
857 for frame_lineno in self.stack:
858 self.print_stack_entry(frame_lineno)
859 except KeyboardInterrupt:
860 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000861
Tim Peters2344fae2001-01-15 00:50:52 +0000862 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
863 frame, lineno = frame_lineno
864 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000865 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000866 else:
Georg Brandl19564802006-05-10 17:13:20 +0000867 print >>self.stdout, ' ',
868 print >>self.stdout, self.format_stack_entry(frame_lineno,
869 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000870
Guido van Rossum921c8241992-01-10 14:54:42 +0000871
Tim Peters2344fae2001-01-15 00:50:52 +0000872 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000873
Tim Peters2344fae2001-01-15 00:50:52 +0000874 def help_help(self):
875 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000876
Tim Peters2344fae2001-01-15 00:50:52 +0000877 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000878 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000879Without argument, print the list of available commands.
880With a command name as argument, print help about that command
881"help pdb" pipes the full documentation file to the $PAGER
882"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000883
Tim Peters2344fae2001-01-15 00:50:52 +0000884 def help_where(self):
885 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886
Tim Peters2344fae2001-01-15 00:50:52 +0000887 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000888 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000889Print a stack trace, with the most recent frame at the bottom.
890An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000891context of most commands. 'bt' is an alias for this command."""
892
893 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894
Tim Peters2344fae2001-01-15 00:50:52 +0000895 def help_down(self):
896 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000897
Tim Peters2344fae2001-01-15 00:50:52 +0000898 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000899 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000900Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000901(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902
Tim Peters2344fae2001-01-15 00:50:52 +0000903 def help_up(self):
904 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000905
Tim Peters2344fae2001-01-15 00:50:52 +0000906 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000907 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000908Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000909(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910
Tim Peters2344fae2001-01-15 00:50:52 +0000911 def help_break(self):
912 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000913
Tim Peters2344fae2001-01-15 00:50:52 +0000914 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000915 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000916With a line number argument, set a break there in the current
917file. With a function name, set a break at first executable line
918of that function. Without argument, list all breaks. If a second
919argument is present, it is a string specifying an expression
920which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921
Tim Peters2344fae2001-01-15 00:50:52 +0000922The line number may be prefixed with a filename and a colon,
923to specify a breakpoint in another file (probably one that
924hasn't been loaded yet). The file is searched for on sys.path;
925the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000926
Tim Peters2344fae2001-01-15 00:50:52 +0000927 def help_clear(self):
928 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929
Tim Peters2344fae2001-01-15 00:50:52 +0000930 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000931 print >>self.stdout, "cl(ear) filename:lineno"
932 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000933With a space separated list of breakpoint numbers, clear
934those breakpoints. Without argument, clear all breaks (but
935first ask confirmation). With a filename:lineno argument,
936clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000937
Tim Peters2344fae2001-01-15 00:50:52 +0000938Note that the argument is different from previous versions of
939the debugger (in python distributions 1.5.1 and before) where
940a linenumber was used instead of either filename:lineno or
941breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000942
Tim Peters2344fae2001-01-15 00:50:52 +0000943 def help_tbreak(self):
Georg Brandl19564802006-05-10 17:13:20 +0000944 print >>self.stdout, """tbreak same arguments as break, but breakpoint is
Tim Peters2344fae2001-01-15 00:50:52 +0000945removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000946
Tim Peters2344fae2001-01-15 00:50:52 +0000947 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000948 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000949Enables the breakpoints given as a space separated list of
950bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000951
Tim Peters2344fae2001-01-15 00:50:52 +0000952 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000953 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000954Disables the breakpoints given as a space separated list of
955bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000956
Tim Peters2344fae2001-01-15 00:50:52 +0000957 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000958 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000959Sets the ignore count for the given breakpoint number. A breakpoint
960becomes active when the ignore count is zero. When non-zero, the
961count is decremented each time the breakpoint is reached and the
962breakpoint is not disabled and any associated condition evaluates
963to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000964
Tim Peters2344fae2001-01-15 00:50:52 +0000965 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000966 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000967str_condition is a string specifying an expression which
968must evaluate to true before the breakpoint is honored.
969If str_condition is absent, any existing condition is removed;
970i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000971
Tim Peters2344fae2001-01-15 00:50:52 +0000972 def help_step(self):
973 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000974
Tim Peters2344fae2001-01-15 00:50:52 +0000975 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000976 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000977Execute the current line, stop at the first possible occasion
978(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000979
Benjamin Peterson98353942008-05-11 14:13:25 +0000980 def help_until(self):
981 self.help_unt()
982
983 def help_unt(self):
984 print """unt(il)
985Continue execution until the line with a number greater than the current
986one is reached or until the current frame returns"""
987
Tim Peters2344fae2001-01-15 00:50:52 +0000988 def help_next(self):
989 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000990
Tim Peters2344fae2001-01-15 00:50:52 +0000991 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +0000992 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000993Continue execution until the next line in the current function
994is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000995
Tim Peters2344fae2001-01-15 00:50:52 +0000996 def help_return(self):
997 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998
Tim Peters2344fae2001-01-15 00:50:52 +0000999 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +00001000 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +00001001Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001002
Tim Peters2344fae2001-01-15 00:50:52 +00001003 def help_continue(self):
1004 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005
Tim Peters2344fae2001-01-15 00:50:52 +00001006 def help_cont(self):
1007 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008
Tim Peters2344fae2001-01-15 00:50:52 +00001009 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +00001010 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +00001011Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001013 def help_jump(self):
1014 self.help_j()
1015
1016 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +00001017 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001018Set the next line that will be executed."""
1019
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001020 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +00001021 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001022Enter a recursive debugger that steps through the code argument
1023(which is an arbitrary expression or statement to be executed
1024in the current environment)."""
1025
Tim Peters2344fae2001-01-15 00:50:52 +00001026 def help_list(self):
1027 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028
Tim Peters2344fae2001-01-15 00:50:52 +00001029 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001030 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001031List source code for the current file.
1032Without arguments, list 11 lines around the current line
1033or continue the previous listing.
1034With one argument, list 11 lines starting at that line.
1035With two arguments, list the given range;
1036if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001037
Tim Peters2344fae2001-01-15 00:50:52 +00001038 def help_args(self):
1039 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001040
Tim Peters2344fae2001-01-15 00:50:52 +00001041 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001042 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001043Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001044
Tim Peters2344fae2001-01-15 00:50:52 +00001045 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001046 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001047Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001048
Barry Warsaw210bd202002-11-05 22:40:20 +00001049 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001050 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001051Pretty-print the value of the expression."""
1052
Tim Peters2344fae2001-01-15 00:50:52 +00001053 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001054 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001055Execute the (one-line) statement in the context of
1056the current stack frame.
1057The exclamation point can be omitted unless the first word
1058of the statement resembles a debugger command.
1059To assign to a global variable you must always prefix the
1060command with a 'global' command, e.g.:
1061(Pdb) global list_options; list_options = ['-l']
1062(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063
Georg Brandl8e84c652007-03-13 21:08:15 +00001064 def help_run(self):
1065 print """run [args...]
1066Restart the debugged python program. If a string is supplied, it is
1067splitted with "shlex" and the result is used as the new sys.argv.
1068History, breakpoints, actions and debugger options are preserved.
1069"restart" is an alias for "run"."""
1070
1071 help_restart = help_run
1072
Tim Peters2344fae2001-01-15 00:50:52 +00001073 def help_quit(self):
1074 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001077 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001078The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001079
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001080 help_exit = help_q
1081
Tim Peters2344fae2001-01-15 00:50:52 +00001082 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001083 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001084Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001085
Tim Peters2344fae2001-01-15 00:50:52 +00001086 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001087 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001088Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001089
Tim Peters2344fae2001-01-15 00:50:52 +00001090 def help_alias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001091 print >>self.stdout, """alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001092Creates an alias called 'name' the executes 'command'. The command
1093must *not* be enclosed in quotes. Replaceable parameters are
1094indicated by %1, %2, and so on, while %* is replaced by all the
1095parameters. If no command is given, the current alias for name
1096is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001097
Tim Peters2344fae2001-01-15 00:50:52 +00001098Aliases may be nested and can contain anything that can be
1099legally typed at the pdb prompt. Note! You *can* override
1100internal pdb commands with aliases! Those internal commands
1101are then hidden until the alias is removed. Aliasing is recursively
1102applied to the first word of the command line; all other words
1103in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001104
Tim Peters2344fae2001-01-15 00:50:52 +00001105Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001106
Tim Peters2344fae2001-01-15 00:50:52 +00001107#Print instance variables (usage "pi classInst")
1108alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001109
Tim Peters2344fae2001-01-15 00:50:52 +00001110#Print instance variables in self
1111alias ps pi self
1112"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001113
Tim Peters2344fae2001-01-15 00:50:52 +00001114 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001115 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001116Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001117
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001118 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001119 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001120(com) ...
1121(com) end
1122(Pdb)
1123
1124Specify a list of commands for breakpoint number bpnumber. The
1125commands themselves appear on the following lines. Type a line
1126containing just 'end' to terminate the commands.
1127
1128To remove all commands from a breakpoint, type commands and
1129follow it immediately with end; that is, give no commands.
1130
1131With no bpnumber argument, commands refers to the last
1132breakpoint set.
1133
1134You can use breakpoint commands to start your program up again.
1135Simply use the continue command, or step, or any other
1136command that resumes execution.
1137
1138Specifying any command resuming execution (currently continue,
1139step, next, return, jump, quit and their abbreviations) terminates
1140the command list (as if that command was immediately followed by end).
1141This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001142(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001143another breakpoint--which could have its own command list, leading to
1144ambiguities about which list to execute.
1145
1146 If you use the 'silent' command in the command list, the
1147usual message about stopping at a breakpoint is not printed. This may
1148be desirable for breakpoints that are to print a specific message and
1149then continue. If none of the other commands print anything, you
1150see no sign that the breakpoint was reached.
1151"""
1152
Tim Peters2344fae2001-01-15 00:50:52 +00001153 def help_pdb(self):
1154 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001155
Tim Peters2344fae2001-01-15 00:50:52 +00001156 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001157 """Helper function for break/clear parsing -- may be overridden.
1158
1159 lookupmodule() translates (possibly incomplete) file or module name
1160 into an absolute file name.
1161 """
1162 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001163 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001164 f = os.path.join(sys.path[0], filename)
1165 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1166 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001167 root, ext = os.path.splitext(filename)
1168 if ext == '':
1169 filename = filename + '.py'
1170 if os.path.isabs(filename):
1171 return filename
1172 for dirname in sys.path:
1173 while os.path.islink(dirname):
1174 dirname = os.readlink(dirname)
1175 fullname = os.path.join(dirname, filename)
1176 if os.path.exists(fullname):
1177 return fullname
1178 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001179
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001180 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001181 # The script has to run in __main__ namespace (or imports from
1182 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001183 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001184 # So we clear up the __main__ and set several special variables
1185 # (this gets rid of pdb's globals and cleans old variables on restarts).
1186 import __main__
1187 __main__.__dict__.clear()
1188 __main__.__dict__.update({"__name__" : "__main__",
1189 "__file__" : filename,
1190 "__builtins__": __builtins__,
1191 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001192
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001193 # When bdb sets tracing, a number of call and line events happens
1194 # BEFORE debugger even reaches user's code (and the exact sequence of
1195 # events depends on python version). So we take special measures to
1196 # avoid stopping before we reach the main script (see user_line and
1197 # user_call for details).
1198 self._wait_for_mainpyfile = 1
1199 self.mainpyfile = self.canonic(filename)
1200 self._user_requested_quit = 0
1201 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001202 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001203
Guido van Rossum35771131992-09-08 11:59:04 +00001204# Simplified interface
1205
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001206def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001207 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001208
1209def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001210 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001211
1212def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001213 # B/W compatibility
1214 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001215
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001216def runcall(*args, **kwds):
1217 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001218
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001220 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001221
1222# Post-Mortem interface
1223
Facundo Batistac54aec12008-03-08 16:50:27 +00001224def post_mortem(t=None):
1225 # handling the default
1226 if t is None:
1227 # sys.exc_info() returns (type, value, traceback) if an exception is
1228 # being handled, otherwise it returns None
1229 t = sys.exc_info()[2]
1230 if t is None:
1231 raise ValueError("A valid traceback must be passed if no "
1232 "exception is being handled")
1233
Tim Peters2344fae2001-01-15 00:50:52 +00001234 p = Pdb()
1235 p.reset()
Benjamin Petersonaf956f12008-10-22 21:19:41 +00001236 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001237
1238def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001239 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001240
1241
1242# Main program for testing
1243
Guido van Rossum23efba41992-01-27 16:58:47 +00001244TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001245
Guido van Rossum921c8241992-01-10 14:54:42 +00001246def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001247 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001248
1249# print help
1250def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001251 for dirname in sys.path:
1252 fullname = os.path.join(dirname, 'pdb.doc')
1253 if os.path.exists(fullname):
1254 sts = os.system('${PAGER-more} '+fullname)
1255 if sts: print '*** Pager exit status:', sts
1256 break
1257 else:
1258 print 'Sorry, can\'t find the help file "pdb.doc"',
1259 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001260
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001261def main():
Benjamin Peterson13be2cf2008-03-26 11:57:47 +00001262 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters2344fae2001-01-15 00:50:52 +00001263 print "usage: pdb.py scriptfile [arg] ..."
1264 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001265
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001266 mainpyfile = sys.argv[1] # Get script filename
1267 if not os.path.exists(mainpyfile):
1268 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001269 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001270
Tim Peters2344fae2001-01-15 00:50:52 +00001271 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001272
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001273 # Replace pdb's dir with script's dir in front of module search path.
1274 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001275
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001276 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1277 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl8e84c652007-03-13 21:08:15 +00001278 # changed by the user from the command line. There is a "restart" command which
1279 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001280 pdb = Pdb()
1281 while 1:
1282 try:
1283 pdb._runscript(mainpyfile)
1284 if pdb._user_requested_quit:
1285 break
Tim Peterse718f612004-10-12 21:51:32 +00001286 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001287 except Restart:
1288 print "Restarting", mainpyfile, "with arguments:"
1289 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001290 except SystemExit:
1291 # In most cases SystemExit does not warrant a post-mortem session.
1292 print "The program exited via sys.exit(). Exit status: ",
1293 print sys.exc_info()[1]
1294 except:
1295 traceback.print_exc()
1296 print "Uncaught exception. Entering post mortem debugging"
1297 print "Running 'cont' or 'step' will restart the program"
1298 t = sys.exc_info()[2]
Benjamin Petersonaf956f12008-10-22 21:19:41 +00001299 pdb.interaction(None, t)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001300 print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
1301
1302
1303# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001304if __name__ == '__main__':
1305 import pdb
1306 pdb.main()