blob: 7e1edb5f0b5bd50b1482e4879186521cf4c8272c [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
Guido van Rossumd8faa362007-04-27 19:54:29 +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):
Thomas Wouters89f507f2006-12-13 04:49:30 +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
Thomas Wouters477c8d52006-05-27 19:21:47 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None):
Tim Peters2344fae2001-01-15 00:50:52 +000062 bdb.Bdb.__init__(self)
Thomas Wouters477c8d52006-05-27 19:21:47 +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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +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):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000139 print('--Call--', file=self.stdout)
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
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000149 if self.bp_commands(frame):
150 self.interaction(frame, None)
151
152 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()
169 return
170 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
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000175 print('--Return--', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000176 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000177
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000178 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000179 """This function is called if an exception occurs,
180 but only if we are to stop at or just below this level."""
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000181 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000182 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000183 exc_type_name = exc_type.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000184 print(exc_type_name + ':', _saferepr(exc_value), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000185 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000186
Tim Peters2344fae2001-01-15 00:50:52 +0000187 # General interaction function
188
189 def interaction(self, frame, traceback):
190 self.setup(frame, traceback)
191 self.print_stack_entry(self.stack[self.curindex])
192 self.cmdloop()
193 self.forget()
194
195 def default(self, line):
196 if line[:1] == '!': line = line[1:]
197 locals = self.curframe.f_locals
198 globals = self.curframe.f_globals
199 try:
200 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000201 save_stdout = sys.stdout
202 save_stdin = sys.stdin
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000203 try:
204 sys.stdin = self.stdin
205 sys.stdout = self.stdout
206 exec(code, globals, locals)
207 finally:
208 sys.stdout = save_stdout
209 sys.stdin = save_stdin
Tim Peters2344fae2001-01-15 00:50:52 +0000210 except:
211 t, v = sys.exc_info()[:2]
212 if type(t) == type(''):
213 exc_type_name = t
214 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000215 print('***', exc_type_name + ':', v, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000216
217 def precmd(self, line):
218 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000219 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000220 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000221 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000222 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000223 line = self.aliases[args[0]]
224 ii = 1
225 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000226 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000227 tmpArg)
228 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000229 line = line.replace("%*", ' '.join(args[1:]))
230 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000231 # split into ';;' separated commands
232 # unless it's an alias command
233 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000234 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000235 if marker >= 0:
236 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000237 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000238 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000239 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000240 return line
241
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000242 def onecmd(self, line):
243 """Interpret the argument as though it had been typed in response
244 to the prompt.
245
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000246 Checks whether this line is typed at the normal prompt or in
247 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000248 """
249 if not self.commands_defining:
250 return cmd.Cmd.onecmd(self, line)
251 else:
252 return self.handle_command_def(line)
253
254 def handle_command_def(self,line):
255 """ Handles one command line during command list definition. """
256 cmd, arg, line = self.parseline(line)
257 if cmd == 'silent':
258 self.commands_silent[self.commands_bnum] = True
259 return # continue to handle other cmd def in the cmd list
260 elif cmd == 'end':
261 self.cmdqueue = []
262 return 1 # end of cmd list
263 cmdlist = self.commands[self.commands_bnum]
264 if (arg):
265 cmdlist.append(cmd+' '+arg)
266 else:
267 cmdlist.append(cmd)
268 # Determine if we must stop
269 try:
270 func = getattr(self, 'do_' + cmd)
271 except AttributeError:
272 func = self.default
Neal Norwitz221085d2007-02-25 20:55:47 +0000273 if func.__name__ in self.commands_resuming : # one of the resuming commands.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000274 self.commands_doprompt[self.commands_bnum] = False
275 self.cmdqueue = []
276 return 1
277 return
278
Tim Peters2344fae2001-01-15 00:50:52 +0000279 # Command definitions, called by cmdloop()
280 # The argument is the remaining string on the command line
281 # Return true to exit from the command loop
282
283 do_h = cmd.Cmd.do_help
284
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000285 def do_commands(self, arg):
286 """Defines a list of commands associated to a breakpoint
287 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
288 if not arg:
289 bnum = len(bdb.Breakpoint.bpbynumber)-1
290 else:
291 try:
292 bnum = int(arg)
293 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000294 print("Usage : commands [bnum]\n ...\n end", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000295 return
296 self.commands_bnum = bnum
297 self.commands[bnum] = []
298 self.commands_doprompt[bnum] = True
299 self.commands_silent[bnum] = False
300 prompt_back = self.prompt
301 self.prompt = '(com) '
302 self.commands_defining = True
303 self.cmdloop()
304 self.commands_defining = False
305 self.prompt = prompt_back
306
Tim Peters2344fae2001-01-15 00:50:52 +0000307 def do_break(self, arg, temporary = 0):
308 # break [ ([filename:]lineno | function) [, "condition"] ]
309 if not arg:
310 if self.breaks: # There's at least one
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000311 print("Num Type Disp Enb Where", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000312 for bp in bdb.Breakpoint.bpbynumber:
313 if bp:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000314 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000315 return
316 # parse arguments; comma has lowest precedence
317 # and cannot occur in filename
318 filename = None
319 lineno = None
320 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000321 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000322 if comma > 0:
323 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000324 cond = arg[comma+1:].lstrip()
325 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000326 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000327 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000328 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000329 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000330 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000331 f = self.lookupmodule(filename)
332 if not f:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000333 print('*** ', repr(filename), end=' ', file=self.stdout)
334 print('not found from sys.path', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000335 return
336 else:
337 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000338 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000339 try:
340 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000341 except ValueError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000342 print('*** Bad lineno:', arg, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000343 return
344 else:
345 # no colon; can be lineno or function
346 try:
347 lineno = int(arg)
348 except ValueError:
349 try:
350 func = eval(arg,
351 self.curframe.f_globals,
352 self.curframe.f_locals)
353 except:
354 func = arg
355 try:
Christian Heimesff737952007-11-27 10:40:20 +0000356 if hasattr(func, '__func__'):
357 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000358 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000359 #use co_name to identify the bkpt (function names
360 #could be aliased, but co_name is invariant)
361 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000362 lineno = code.co_firstlineno
363 filename = code.co_filename
364 except:
365 # last thing to try
366 (ok, filename, ln) = self.lineinfo(arg)
367 if not ok:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000368 print('*** The specified object', end=' ', file=self.stdout)
369 print(repr(arg), end=' ', file=self.stdout)
370 print('is not a function', file=self.stdout)
371 print('or was not found along sys.path.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000372 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000373 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000374 lineno = int(ln)
375 if not filename:
376 filename = self.defaultFile()
377 # Check for reasonable breakpoint
378 line = self.checkline(filename, lineno)
379 if line:
380 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000381 err = self.set_break(filename, line, temporary, cond, funcname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000382 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000383 else:
384 bp = self.get_breaks(filename, line)[-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000385 print("Breakpoint %d at %s:%d" % (bp.number,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000386 bp.file,
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000387 bp.line), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000388
389 # To be overridden in derived debuggers
390 def defaultFile(self):
391 """Produce a reasonable default."""
392 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000393 if filename == '<string>' and self.mainpyfile:
394 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000395 return filename
396
397 do_b = do_break
398
399 def do_tbreak(self, arg):
400 self.do_break(arg, 1)
401
402 def lineinfo(self, identifier):
403 failed = (None, None, None)
404 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000405 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000406 if len(idstring) == 1:
407 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000408 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000409 elif len(idstring) == 3:
410 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000411 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000412 else:
413 return failed
414 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000415 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000416 # Protection for derived debuggers
417 if parts[0] == 'self':
418 del parts[0]
419 if len(parts) == 0:
420 return failed
421 # Best first guess at file to look at
422 fname = self.defaultFile()
423 if len(parts) == 1:
424 item = parts[0]
425 else:
426 # More than one part.
427 # First is module, second is method/class
428 f = self.lookupmodule(parts[0])
429 if f:
430 fname = f
431 item = parts[1]
432 answer = find_function(item, fname)
433 return answer or failed
434
435 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000436 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000437
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000438 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
439 line or EOF). Warning: testing is not comprehensive.
440 """
Tim Peters2344fae2001-01-15 00:50:52 +0000441 line = linecache.getline(filename, lineno)
442 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000443 print('End of file', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000444 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000445 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000446 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000447 if (not line or (line[0] == '#') or
448 (line[:3] == '"""') or line[:3] == "'''"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000449 print('*** Blank or comment', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000450 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000451 return lineno
452
453 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000454 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000455 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000456 try:
457 i = int(i)
458 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000459 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000460 continue
461
462 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000463 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000464 continue
465
466 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000467 if bp:
468 bp.enable()
469
470 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000471 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000472 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000473 try:
474 i = int(i)
475 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000476 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000477 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000478
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000479 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000480 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000481 continue
482
483 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000484 if bp:
485 bp.disable()
486
487 def do_condition(self, arg):
488 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000489 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000490 try:
491 bpnum = int(args[0].strip())
492 except ValueError:
493 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000494 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495 return
Tim Peters2344fae2001-01-15 00:50:52 +0000496 try:
497 cond = args[1]
498 except:
499 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000500 try:
501 bp = bdb.Breakpoint.bpbynumber[bpnum]
502 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000503 print('Breakpoint index %r is not valid' % args[0],
504 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000505 return
Tim Peters2344fae2001-01-15 00:50:52 +0000506 if bp:
507 bp.cond = cond
508 if not cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000509 print('Breakpoint', bpnum, end=' ', file=self.stdout)
510 print('is now unconditional.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000511
512 def do_ignore(self,arg):
513 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000514 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000515 try:
516 bpnum = int(args[0].strip())
517 except ValueError:
518 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000519 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +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
Guido van Rossumd8faa362007-04-27 19:54:29 +0000525 try:
526 bp = bdb.Breakpoint.bpbynumber[bpnum]
527 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000528 print('Breakpoint index %r is not valid' % args[0],
529 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000530 return
Tim Peters2344fae2001-01-15 00:50:52 +0000531 if bp:
532 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000533 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000534 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000535 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000536 reply = reply + '%d crossings' % count
537 else:
538 reply = reply + '1 crossing'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000539 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000540 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000541 print('Will stop next time breakpoint', end=' ', file=self.stdout)
542 print(bpnum, 'is reached.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000543
544 def do_clear(self, arg):
545 """Three possibilities, tried in this order:
546 clear -> clear all breaks, ask for confirmation
547 clear file:lineno -> clear all breaks at file:lineno
548 clear bpno bpno ... -> clear breakpoints by number"""
549 if not arg:
550 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000551 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000552 except EOFError:
553 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000554 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000555 if reply in ('y', 'yes'):
556 self.clear_all_breaks()
557 return
558 if ':' in arg:
559 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000560 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000561 filename = arg[:i]
562 arg = arg[i+1:]
563 try:
564 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000565 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000566 err = "Invalid line number (%s)" % arg
567 else:
568 err = self.clear_break(filename, lineno)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000569 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000570 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000571 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000572 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000573 try:
574 i = int(i)
575 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000576 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000577 continue
578
Georg Brandl6d2b3462005-08-24 07:36:17 +0000579 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000580 print('No breakpoint numbered', i, file=self.stdout)
Georg Brandl6d2b3462005-08-24 07:36:17 +0000581 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000582 err = self.clear_bpbynumber(i)
583 if err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000584 print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000585 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000586 print('Deleted breakpoint', i, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000587 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
588
589 def do_where(self, arg):
590 self.print_stack_trace()
591 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000592 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000593
594 def do_up(self, arg):
595 if self.curindex == 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000596 print('*** Oldest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000597 else:
598 self.curindex = self.curindex - 1
599 self.curframe = self.stack[self.curindex][0]
600 self.print_stack_entry(self.stack[self.curindex])
601 self.lineno = None
602 do_u = do_up
603
604 def do_down(self, arg):
605 if self.curindex + 1 == len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000606 print('*** Newest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000607 else:
608 self.curindex = self.curindex + 1
609 self.curframe = self.stack[self.curindex][0]
610 self.print_stack_entry(self.stack[self.curindex])
611 self.lineno = None
612 do_d = do_down
613
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000614 def do_until(self, arg):
615 self.set_until(self.curframe)
616 return 1
617 do_unt = do_until
618
Tim Peters2344fae2001-01-15 00:50:52 +0000619 def do_step(self, arg):
620 self.set_step()
621 return 1
622 do_s = do_step
623
624 def do_next(self, arg):
625 self.set_next(self.curframe)
626 return 1
627 do_n = do_next
628
Guido van Rossumd8faa362007-04-27 19:54:29 +0000629 def do_run(self, arg):
630 """Restart program by raising an exception to be caught in the main debugger
631 loop. If arguments were given, set them in sys.argv."""
632 if arg:
633 import shlex
634 argv0 = sys.argv[0:1]
635 sys.argv = shlex.split(arg)
636 sys.argv[:0] = argv0
637 raise Restart
638
639 do_restart = do_run
640
Tim Peters2344fae2001-01-15 00:50:52 +0000641 def do_return(self, arg):
642 self.set_return(self.curframe)
643 return 1
644 do_r = do_return
645
646 def do_continue(self, arg):
647 self.set_continue()
648 return 1
649 do_c = do_cont = do_continue
650
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000651 def do_jump(self, arg):
652 if self.curindex + 1 != len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000653 print("*** You can only jump within the bottom frame", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000654 return
655 try:
656 arg = int(arg)
657 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000658 print("*** The 'jump' command requires a line number.", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000659 else:
660 try:
661 # Do the jump, fix up our copy of the stack, and display the
662 # new position
663 self.curframe.f_lineno = arg
664 self.stack[self.curindex] = self.stack[self.curindex][0], arg
665 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000666 except ValueError as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000667 print('*** Jump failed:', e, file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000668 do_j = do_jump
669
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000670 def do_debug(self, arg):
671 sys.settrace(None)
672 globals = self.curframe.f_globals
673 locals = self.curframe.f_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000674 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000675 p.prompt = "(%s) " % self.prompt.strip()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000676 print("ENTERING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000677 sys.call_tracing(p.run, (arg, globals, locals))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000678 print("LEAVING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000679 sys.settrace(self.trace_dispatch)
680 self.lastcmd = p.lastcmd
681
Tim Peters2344fae2001-01-15 00:50:52 +0000682 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000683 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000684 self.set_quit()
685 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000686
Tim Peters2344fae2001-01-15 00:50:52 +0000687 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000688 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000689
Guido van Rossumeef26072003-01-13 21:13:55 +0000690 def do_EOF(self, arg):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000691 print(file=self.stdout)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000692 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000693 self.set_quit()
694 return 1
695
Tim Peters2344fae2001-01-15 00:50:52 +0000696 def do_args(self, arg):
697 f = self.curframe
698 co = f.f_code
699 dict = f.f_locals
700 n = co.co_argcount
701 if co.co_flags & 4: n = n+1
702 if co.co_flags & 8: n = n+1
703 for i in range(n):
704 name = co.co_varnames[i]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000705 print(name, '=', end=' ', file=self.stdout)
706 if name in dict: print(dict[name], file=self.stdout)
707 else: print("*** undefined ***", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000708 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000709
Tim Peters2344fae2001-01-15 00:50:52 +0000710 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000711 if '__return__' in self.curframe.f_locals:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000712 print(self.curframe.f_locals['__return__'], file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000713 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000714 print('*** Not yet returned!', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000715 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000716
Barry Warsaw210bd202002-11-05 22:40:20 +0000717 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000718 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000719 return eval(arg, self.curframe.f_globals,
720 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000721 except:
722 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000723 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000724 exc_type_name = t
725 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000726 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000727 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000728
Barry Warsaw210bd202002-11-05 22:40:20 +0000729 def do_p(self, arg):
730 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000731 print(repr(self._getval(arg)), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000732 except:
733 pass
Georg Brandlc9879242007-09-04 07:07:56 +0000734 # make "print" an alias of "p" since print isn't a Python statement anymore
735 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +0000736
737 def do_pp(self, arg):
738 try:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000739 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000740 except:
741 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000742
Tim Peters2344fae2001-01-15 00:50:52 +0000743 def do_list(self, arg):
744 self.lastcmd = 'list'
745 last = None
746 if arg:
747 try:
748 x = eval(arg, {}, {})
749 if type(x) == type(()):
750 first, last = x
751 first = int(first)
752 last = int(last)
753 if last < first:
754 # Assume it's a count
755 last = first + last
756 else:
757 first = max(1, int(x) - 5)
758 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000759 print('*** Error in argument:', repr(arg), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000760 return
761 elif self.lineno is None:
762 first = max(1, self.curframe.f_lineno - 5)
763 else:
764 first = self.lineno + 1
765 if last is None:
766 last = first + 10
767 filename = self.curframe.f_code.co_filename
768 breaklist = self.get_file_breaks(filename)
769 try:
770 for lineno in range(first, last+1):
771 line = linecache.getline(filename, lineno)
772 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000773 print('[EOF]', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000774 break
775 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000776 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000777 if len(s) < 4: s = s + ' '
778 if lineno in breaklist: s = s + 'B'
779 else: s = s + ' '
780 if lineno == self.curframe.f_lineno:
781 s = s + '->'
Guido van Rossumceae3752007-02-09 22:16:54 +0000782 print(s + '\t' + line, end='', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000783 self.lineno = lineno
784 except KeyboardInterrupt:
785 pass
786 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000787
Tim Peters2344fae2001-01-15 00:50:52 +0000788 def do_whatis(self, arg):
789 try:
790 value = eval(arg, self.curframe.f_globals,
791 self.curframe.f_locals)
792 except:
793 t, v = sys.exc_info()[:2]
794 if type(t) == type(''):
795 exc_type_name = t
796 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000797 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000798 return
799 code = None
800 # Is it a function?
Neal Norwitz221085d2007-02-25 20:55:47 +0000801 try: code = value.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000802 except: pass
803 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000804 print('Function', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000805 return
806 # Is it an instance method?
Christian Heimesff737952007-11-27 10:40:20 +0000807 try: code = value.__func__.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000808 except: pass
809 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000810 print('Method', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000811 return
812 # None of the above...
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000813 print(type(value), file=self.stdout)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000814
Tim Peters2344fae2001-01-15 00:50:52 +0000815 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000816 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000817 if len(args) == 0:
818 keys = self.aliases.keys()
819 keys.sort()
820 for alias in keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000821 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000822 return
Guido van Rossum08454592002-07-12 13:10:53 +0000823 if args[0] in self.aliases and len(args) == 1:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000824 print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000825 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000826 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000827
Tim Peters2344fae2001-01-15 00:50:52 +0000828 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000829 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000830 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000831 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000832 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000833
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000834 #list of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000835 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
836 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000837
Tim Peters2344fae2001-01-15 00:50:52 +0000838 # Print a traceback starting at the top stack frame.
839 # The most recently entered frame is printed last;
840 # this is different from dbx and gdb, but consistent with
841 # the Python interpreter's stack trace.
842 # It is also consistent with the up/down commands (which are
843 # compatible with dbx and gdb: up moves towards 'main()'
844 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000845
Tim Peters2344fae2001-01-15 00:50:52 +0000846 def print_stack_trace(self):
847 try:
848 for frame_lineno in self.stack:
849 self.print_stack_entry(frame_lineno)
850 except KeyboardInterrupt:
851 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000852
Tim Peters2344fae2001-01-15 00:50:52 +0000853 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
854 frame, lineno = frame_lineno
855 if frame is self.curframe:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000856 print('>', end=' ', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000857 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000858 print(' ', end=' ', file=self.stdout)
859 print(self.format_stack_entry(frame_lineno,
860 prompt_prefix), file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000861
Guido van Rossum921c8241992-01-10 14:54:42 +0000862
Tim Peters2344fae2001-01-15 00:50:52 +0000863 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000864
Tim Peters2344fae2001-01-15 00:50:52 +0000865 def help_help(self):
866 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000867
Tim Peters2344fae2001-01-15 00:50:52 +0000868 def help_h(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000869 print("""h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000870Without argument, print the list of available commands.
871With a command name as argument, print help about that command
872"help pdb" pipes the full documentation file to the $PAGER
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000873"help exec" gives help on the ! command""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000874
Tim Peters2344fae2001-01-15 00:50:52 +0000875 def help_where(self):
876 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000877
Tim Peters2344fae2001-01-15 00:50:52 +0000878 def help_w(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000879 print("""w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000880Print a stack trace, with the most recent frame at the bottom.
881An arrow indicates the "current frame", which determines the
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000882context of most commands. 'bt' is an alias for this command.""", file=self.stdout)
Guido van Rossum6bd68352001-01-20 17:57:37 +0000883
884 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000885
Tim Peters2344fae2001-01-15 00:50:52 +0000886 def help_down(self):
887 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000888
Tim Peters2344fae2001-01-15 00:50:52 +0000889 def help_d(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000890 print("""d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000891Move the current frame one level down in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000892(to a newer frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000893
Tim Peters2344fae2001-01-15 00:50:52 +0000894 def help_up(self):
895 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896
Tim Peters2344fae2001-01-15 00:50:52 +0000897 def help_u(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000898 print("""u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000899Move the current frame one level up in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000900(to an older frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000901
Tim Peters2344fae2001-01-15 00:50:52 +0000902 def help_break(self):
903 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000904
Tim Peters2344fae2001-01-15 00:50:52 +0000905 def help_b(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000906 print("""b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000907With a line number argument, set a break there in the current
908file. With a function name, set a break at first executable line
909of that function. Without argument, list all breaks. If a second
910argument is present, it is a string specifying an expression
911which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912
Tim Peters2344fae2001-01-15 00:50:52 +0000913The line number may be prefixed with a filename and a colon,
914to specify a breakpoint in another file (probably one that
915hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000916the .py suffix may be omitted.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000917
Tim Peters2344fae2001-01-15 00:50:52 +0000918 def help_clear(self):
919 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000920
Tim Peters2344fae2001-01-15 00:50:52 +0000921 def help_cl(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000922 print("cl(ear) filename:lineno", file=self.stdout)
923 print("""cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000924With a space separated list of breakpoint numbers, clear
925those breakpoints. Without argument, clear all breaks (but
926first ask confirmation). With a filename:lineno argument,
Georg Brandld348b252008-01-05 20:00:55 +0000927clear all breaks at that line in that file.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000928
Tim Peters2344fae2001-01-15 00:50:52 +0000929 def help_tbreak(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000930 print("""tbreak same arguments as break, but breakpoint is
931removed when first hit.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000932
Tim Peters2344fae2001-01-15 00:50:52 +0000933 def help_enable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000934 print("""enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000935Enables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000936bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000937
Tim Peters2344fae2001-01-15 00:50:52 +0000938 def help_disable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000939 print("""disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000940Disables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000941bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000942
Tim Peters2344fae2001-01-15 00:50:52 +0000943 def help_ignore(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000944 print("""ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000945Sets the ignore count for the given breakpoint number. A breakpoint
946becomes active when the ignore count is zero. When non-zero, the
947count is decremented each time the breakpoint is reached and the
948breakpoint is not disabled and any associated condition evaluates
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000949to true.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000950
Tim Peters2344fae2001-01-15 00:50:52 +0000951 def help_condition(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000952 print("""condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000953str_condition is a string specifying an expression which
954must evaluate to true before the breakpoint is honored.
955If str_condition is absent, any existing condition is removed;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000956i.e., the breakpoint is made unconditional.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000957
Tim Peters2344fae2001-01-15 00:50:52 +0000958 def help_step(self):
959 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000960
Tim Peters2344fae2001-01-15 00:50:52 +0000961 def help_s(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000962 print("""s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000963Execute the current line, stop at the first possible occasion
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000964(either in a function that is called or in the current function).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000966 def help_until(self):
967 self.help_unt()
968
969 def help_unt(self):
970 print("""unt(il)
971Continue execution until the line with a number greater than the current
972one is reached or until the current frame returns""")
973
Tim Peters2344fae2001-01-15 00:50:52 +0000974 def help_next(self):
975 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000976
Tim Peters2344fae2001-01-15 00:50:52 +0000977 def help_n(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000978 print("""n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000979Continue execution until the next line in the current function
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000980is reached or it returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000981
Tim Peters2344fae2001-01-15 00:50:52 +0000982 def help_return(self):
983 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000984
Tim Peters2344fae2001-01-15 00:50:52 +0000985 def help_r(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000986 print("""r(eturn)
987Continue execution until the current function returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000988
Tim Peters2344fae2001-01-15 00:50:52 +0000989 def help_continue(self):
990 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000991
Tim Peters2344fae2001-01-15 00:50:52 +0000992 def help_cont(self):
993 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000994
Tim Peters2344fae2001-01-15 00:50:52 +0000995 def help_c(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000996 print("""c(ont(inue))
997Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000999 def help_jump(self):
1000 self.help_j()
1001
1002 def help_j(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001003 print("""j(ump) lineno
1004Set the next line that will be executed.""", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001005
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001006 def help_debug(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001007 print("""debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001008Enter a recursive debugger that steps through the code argument
1009(which is an arbitrary expression or statement to be executed
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001010in the current environment).""", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001011
Tim Peters2344fae2001-01-15 00:50:52 +00001012 def help_list(self):
1013 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001014
Tim Peters2344fae2001-01-15 00:50:52 +00001015 def help_l(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001016 print("""l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001017List source code for the current file.
1018Without arguments, list 11 lines around the current line
1019or continue the previous listing.
1020With one argument, list 11 lines starting at that line.
1021With two arguments, list the given range;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001022if the second argument is less than the first, it is a count.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001023
Tim Peters2344fae2001-01-15 00:50:52 +00001024 def help_args(self):
1025 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026
Tim Peters2344fae2001-01-15 00:50:52 +00001027 def help_a(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001028 print("""a(rgs)
1029Print the arguments of the current function.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030
Tim Peters2344fae2001-01-15 00:50:52 +00001031 def help_p(self):
Georg Brandlc9879242007-09-04 07:07:56 +00001032 print("""p(rint) expression
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001033Print the value of the expression.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001034
Barry Warsaw210bd202002-11-05 22:40:20 +00001035 def help_pp(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001036 print("""pp expression
1037Pretty-print the value of the expression.""", file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +00001038
Tim Peters2344fae2001-01-15 00:50:52 +00001039 def help_exec(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001040 print("""(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001041Execute the (one-line) statement in the context of
1042the current stack frame.
1043The exclamation point can be omitted unless the first word
1044of the statement resembles a debugger command.
1045To assign to a global variable you must always prefix the
1046command with a 'global' command, e.g.:
1047(Pdb) global list_options; list_options = ['-l']
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001048(Pdb)""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001049
Guido van Rossumd8faa362007-04-27 19:54:29 +00001050 def help_run(self):
1051 print("""run [args...]
1052Restart the debugged python program. If a string is supplied, it is
1053splitted with "shlex" and the result is used as the new sys.argv.
1054History, breakpoints, actions and debugger options are preserved.
1055"restart" is an alias for "run".""")
1056
1057 help_restart = help_run
1058
Tim Peters2344fae2001-01-15 00:50:52 +00001059 def help_quit(self):
1060 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061
Tim Peters2344fae2001-01-15 00:50:52 +00001062 def help_q(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001063 print("""q(uit) or exit - Quit from the debugger.
1064The program being executed is aborted.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001065
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001066 help_exit = help_q
1067
Tim Peters2344fae2001-01-15 00:50:52 +00001068 def help_whatis(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001069 print("""whatis arg
1070Prints the type of the argument.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001071
Tim Peters2344fae2001-01-15 00:50:52 +00001072 def help_EOF(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001073 print("""EOF
1074Handles the receipt of EOF as a command.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076 def help_alias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001077 print("""alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001078Creates an alias called 'name' the executes 'command'. The command
1079must *not* be enclosed in quotes. Replaceable parameters are
1080indicated by %1, %2, and so on, while %* is replaced by all the
1081parameters. If no command is given, the current alias for name
1082is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001083
Tim Peters2344fae2001-01-15 00:50:52 +00001084Aliases may be nested and can contain anything that can be
1085legally typed at the pdb prompt. Note! You *can* override
1086internal pdb commands with aliases! Those internal commands
1087are then hidden until the alias is removed. Aliasing is recursively
1088applied to the first word of the command line; all other words
1089in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001090
Tim Peters2344fae2001-01-15 00:50:52 +00001091Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001092
Tim Peters2344fae2001-01-15 00:50:52 +00001093#Print instance variables (usage "pi classInst")
1094alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001095
Tim Peters2344fae2001-01-15 00:50:52 +00001096#Print instance variables in self
1097alias ps pi self
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001098""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001099
Tim Peters2344fae2001-01-15 00:50:52 +00001100 def help_unalias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001101 print("""unalias name
1102Deletes the specified alias.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001103
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 def help_commands(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001105 print("""commands [bpnumber]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001106(com) ...
1107(com) end
1108(Pdb)
1109
1110Specify a list of commands for breakpoint number bpnumber. The
1111commands themselves appear on the following lines. Type a line
1112containing just 'end' to terminate the commands.
1113
1114To remove all commands from a breakpoint, type commands and
1115follow it immediately with end; that is, give no commands.
1116
1117With no bpnumber argument, commands refers to the last
1118breakpoint set.
1119
1120You can use breakpoint commands to start your program up again.
1121Simply use the continue command, or step, or any other
1122command that resumes execution.
1123
1124Specifying any command resuming execution (currently continue,
1125step, next, return, jump, quit and their abbreviations) terminates
1126the command list (as if that command was immediately followed by end).
1127This is because any time you resume execution
1128(even with a simple next or step), you may encounter
1129another breakpoint--which could have its own command list, leading to
1130ambiguities about which list to execute.
1131
1132 If you use the 'silent' command in the command list, the
1133usual message about stopping at a breakpoint is not printed. This may
1134be desirable for breakpoints that are to print a specific message and
1135then continue. If none of the other commands print anything, you
1136see no sign that the breakpoint was reached.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001137""", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001138
Tim Peters2344fae2001-01-15 00:50:52 +00001139 def help_pdb(self):
1140 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001141
Tim Peters2344fae2001-01-15 00:50:52 +00001142 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001143 """Helper function for break/clear parsing -- may be overridden.
1144
1145 lookupmodule() translates (possibly incomplete) file or module name
1146 into an absolute file name.
1147 """
1148 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001149 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001150 f = os.path.join(sys.path[0], filename)
1151 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1152 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001153 root, ext = os.path.splitext(filename)
1154 if ext == '':
1155 filename = filename + '.py'
1156 if os.path.isabs(filename):
1157 return filename
1158 for dirname in sys.path:
1159 while os.path.islink(dirname):
1160 dirname = os.readlink(dirname)
1161 fullname = os.path.join(dirname, filename)
1162 if os.path.exists(fullname):
1163 return fullname
1164 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001165
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001166 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001167 # The script has to run in __main__ namespace (or imports from
1168 # __main__ will break).
1169 #
1170 # So we clear up the __main__ and set several special variables
1171 # (this gets rid of pdb's globals and cleans old variables on restarts).
1172 import __main__
1173 __main__.__dict__.clear()
1174 __main__.__dict__.update({"__name__" : "__main__",
1175 "__file__" : filename,
1176 "__builtins__": __builtins__,
1177 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001178
1179 # When bdb sets tracing, a number of call and line events happens
1180 # BEFORE debugger even reaches user's code (and the exact sequence of
1181 # events depends on python version). So we take special measures to
1182 # avoid stopping before we reach the main script (see user_line and
1183 # user_call for details).
1184 self._wait_for_mainpyfile = 1
1185 self.mainpyfile = self.canonic(filename)
1186 self._user_requested_quit = 0
Georg Brandl7dd803a2007-09-12 19:44:18 +00001187 with open(filename) as fp:
1188 statement = fp.read()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001189 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001190
Guido van Rossum35771131992-09-08 11:59:04 +00001191# Simplified interface
1192
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001193def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001194 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001195
1196def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001197 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001198
1199def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001200 # B/W compatibility
1201 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001202
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001203def runcall(*args, **kwds):
1204 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001205
Guido van Rossumb6775db1994-08-01 11:34:53 +00001206def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001207 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001208
1209# Post-Mortem interface
1210
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001211def post_mortem(t=None):
1212 # handling the default
1213 if t is None:
1214 # sys.exc_info() returns (type, value, traceback) if an exception is
1215 # being handled, otherwise it returns None
1216 t = sys.exc_info()[2]
1217 if t is None:
1218 raise ValueError("A valid traceback must be passed if no "
1219 "exception is being handled")
1220
Tim Peters2344fae2001-01-15 00:50:52 +00001221 p = Pdb()
1222 p.reset()
1223 while t.tb_next is not None:
1224 t = t.tb_next
1225 p.interaction(t.tb_frame, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001226
1227def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001228 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001229
1230
1231# Main program for testing
1232
Guido van Rossum23efba41992-01-27 16:58:47 +00001233TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001234
Guido van Rossum921c8241992-01-10 14:54:42 +00001235def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001236 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001237
1238# print help
1239def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001240 for dirname in sys.path:
1241 fullname = os.path.join(dirname, 'pdb.doc')
1242 if os.path.exists(fullname):
1243 sts = os.system('${PAGER-more} '+fullname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001244 if sts: print('*** Pager exit status:', sts)
Tim Peters2344fae2001-01-15 00:50:52 +00001245 break
1246 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001247 print('Sorry, can\'t find the help file "pdb.doc"', end=' ')
1248 print('along the Python search path')
Guido van Rossumf17361d1996-07-30 16:28:13 +00001249
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001250def main():
Christian Heimesf6cd9672008-03-26 13:45:42 +00001251 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001252 print("usage: pdb.py scriptfile [arg] ...")
Tim Peters2344fae2001-01-15 00:50:52 +00001253 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001254
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001255 mainpyfile = sys.argv[1] # Get script filename
1256 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001257 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001258 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001259
Tim Peters2344fae2001-01-15 00:50:52 +00001260 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001261
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001262 # Replace pdb's dir with script's dir in front of module search path.
1263 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001264
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001265 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1266 # modified by the script being debugged. It's a bad idea when it was
Guido van Rossumd8faa362007-04-27 19:54:29 +00001267 # changed by the user from the command line. There is a "restart" command which
1268 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001269 pdb = Pdb()
1270 while 1:
1271 try:
1272 pdb._runscript(mainpyfile)
1273 if pdb._user_requested_quit:
1274 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001275 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001276 except Restart:
1277 print("Restarting", mainpyfile, "with arguments:")
1278 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001279 except SystemExit:
1280 # In most cases SystemExit does not warrant a post-mortem session.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001281 print("The program exited via sys.exit(). Exit status: ", end=' ')
1282 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001283 except:
1284 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001285 print("Uncaught exception. Entering post mortem debugging")
1286 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001287 t = sys.exc_info()[2]
1288 while t.tb_next is not None:
1289 t = t.tb_next
1290 pdb.interaction(t.tb_frame,t)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001291 print("Post mortem debugger finished. The "+mainpyfile+" will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001292
1293
1294# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001295if __name__ == '__main__':
1296 import pdb
1297 pdb.main()