blob: 9538f3c7b8c977a3044981eec304e0af051f2af9 [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
Neal Norwitzce96f692006-03-17 06:49:51 +000031def raw_input(prompt):
32 sys.stdout.write(prompt)
33 sys.stdout.flush()
34 return sys.stdin.readline()
35
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000036def find_function(funcname, filename):
Thomas Wouters89f507f2006-12-13 04:49:30 +000037 cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters2344fae2001-01-15 00:50:52 +000038 try:
39 fp = open(filename)
40 except IOError:
41 return None
42 # consumer of this info expects the first line to be 1
43 lineno = 1
44 answer = None
45 while 1:
46 line = fp.readline()
47 if line == '':
48 break
49 if cre.match(line):
50 answer = funcname, filename, lineno
51 break
52 lineno = lineno + 1
53 fp.close()
54 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +000055
56
Guido van Rossuma558e371994-11-10 22:27:35 +000057# Interaction prompt line will separate file and call info from code
58# text using value of line_prefix string. A newline and arrow may
59# be to your liking. You can set it once pdb is imported using the
60# command "pdb.line_prefix = '\n% '".
Tim Peters2344fae2001-01-15 00:50:52 +000061# line_prefix = ': ' # Use this to get the old situation back
62line_prefix = '\n-> ' # Probably a better default
Guido van Rossuma558e371994-11-10 22:27:35 +000063
Guido van Rossum23efba41992-01-27 16:58:47 +000064class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum2424f851998-09-11 22:50:09 +000065
Thomas Wouters477c8d52006-05-27 19:21:47 +000066 def __init__(self, completekey='tab', stdin=None, stdout=None):
Tim Peters2344fae2001-01-15 00:50:52 +000067 bdb.Bdb.__init__(self)
Thomas Wouters477c8d52006-05-27 19:21:47 +000068 cmd.Cmd.__init__(self, completekey, stdin, stdout)
69 if stdout:
70 self.use_rawinput = 0
Tim Peters2344fae2001-01-15 00:50:52 +000071 self.prompt = '(Pdb) '
72 self.aliases = {}
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000073 self.mainpyfile = ''
74 self._wait_for_mainpyfile = 0
Tim Peters2344fae2001-01-15 00:50:52 +000075 # Try to load readline if it exists
76 try:
77 import readline
78 except ImportError:
79 pass
Guido van Rossum2424f851998-09-11 22:50:09 +000080
Tim Peters2344fae2001-01-15 00:50:52 +000081 # Read $HOME/.pdbrc and ./.pdbrc
82 self.rcLines = []
Raymond Hettinger54f02222002-06-01 14:18:47 +000083 if 'HOME' in os.environ:
Tim Peters2344fae2001-01-15 00:50:52 +000084 envHome = os.environ['HOME']
85 try:
86 rcFile = open(os.path.join(envHome, ".pdbrc"))
87 except IOError:
88 pass
89 else:
90 for line in rcFile.readlines():
91 self.rcLines.append(line)
92 rcFile.close()
93 try:
94 rcFile = open(".pdbrc")
95 except IOError:
96 pass
97 else:
98 for line in rcFile.readlines():
99 self.rcLines.append(line)
100 rcFile.close()
Guido van Rossum23efba41992-01-27 16:58:47 +0000101
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000102 self.commands = {} # associates a command list to breakpoint numbers
103 self.commands_doprompt = {} # for each bp num, tells if the prompt must be disp. after execing the cmd list
104 self.commands_silent = {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list
105 self.commands_defining = False # True while in the process of defining a command list
106 self.commands_bnum = None # The breakpoint number for which we are defining a list
107
Tim Peters2344fae2001-01-15 00:50:52 +0000108 def reset(self):
109 bdb.Bdb.reset(self)
110 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000111
Tim Peters2344fae2001-01-15 00:50:52 +0000112 def forget(self):
113 self.lineno = None
114 self.stack = []
115 self.curindex = 0
116 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000117
Tim Peters2344fae2001-01-15 00:50:52 +0000118 def setup(self, f, t):
119 self.forget()
120 self.stack, self.curindex = self.get_stack(f, t)
121 self.curframe = self.stack[self.curindex][0]
122 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123
Tim Peters2344fae2001-01-15 00:50:52 +0000124 # Can be executed earlier than 'setup' if desired
125 def execRcLines(self):
126 if self.rcLines:
127 # Make local copy because of recursion
128 rcLines = self.rcLines
129 # executed only once
130 self.rcLines = []
131 for line in rcLines:
132 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000133 if len(line) > 0 and line[0] != '#':
134 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000135
Tim Peters280488b2002-08-23 18:19:30 +0000136 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000137
138 def user_call(self, frame, argument_list):
139 """This method is called when there is the remote possibility
140 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000141 if self._wait_for_mainpyfile:
142 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000143 if self.stop_here(frame):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000144 print('--Call--', file=self.stdout)
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000145 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000146
Tim Peters2344fae2001-01-15 00:50:52 +0000147 def user_line(self, frame):
148 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000149 if self._wait_for_mainpyfile:
150 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
151 or frame.f_lineno<= 0):
152 return
153 self._wait_for_mainpyfile = 0
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000154 if self.bp_commands(frame):
155 self.interaction(frame, None)
156
157 def bp_commands(self,frame):
158 """ Call every command that was set for the current active breakpoint (if there is one)
159 Returns True if the normal interaction function must be called, False otherwise """
160 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
161 if getattr(self,"currentbp",False) and self.currentbp in self.commands:
162 currentbp = self.currentbp
163 self.currentbp = 0
164 lastcmd_back = self.lastcmd
165 self.setup(frame, None)
166 for line in self.commands[currentbp]:
167 self.onecmd(line)
168 self.lastcmd = lastcmd_back
169 if not self.commands_silent[currentbp]:
170 self.print_stack_entry(self.stack[self.curindex])
171 if self.commands_doprompt[currentbp]:
172 self.cmdloop()
173 self.forget()
174 return
175 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000176
Tim Peters2344fae2001-01-15 00:50:52 +0000177 def user_return(self, frame, return_value):
178 """This function is called when a return trap is set here."""
179 frame.f_locals['__return__'] = return_value
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000180 print('--Return--', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000181 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000182
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000183 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000184 """This function is called if an exception occurs,
185 but only if we are to stop at or just below this level."""
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000186 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000187 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000188 exc_type_name = exc_type.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000189 print(exc_type_name + ':', _saferepr(exc_value), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000190 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000191
Tim Peters2344fae2001-01-15 00:50:52 +0000192 # General interaction function
193
194 def interaction(self, frame, traceback):
195 self.setup(frame, traceback)
196 self.print_stack_entry(self.stack[self.curindex])
197 self.cmdloop()
198 self.forget()
199
200 def default(self, line):
201 if line[:1] == '!': line = line[1:]
202 locals = self.curframe.f_locals
203 globals = self.curframe.f_globals
204 try:
205 code = compile(line + '\n', '<stdin>', 'single')
Georg Brandl7cae87c2006-09-06 06:51:57 +0000206 exec(code, globals, locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000207 except:
208 t, v = sys.exc_info()[:2]
209 if type(t) == type(''):
210 exc_type_name = t
211 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000212 print('***', exc_type_name + ':', v, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000213
214 def precmd(self, line):
215 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000216 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000217 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000218 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000219 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000220 line = self.aliases[args[0]]
221 ii = 1
222 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000223 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000224 tmpArg)
225 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000226 line = line.replace("%*", ' '.join(args[1:]))
227 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000228 # split into ';;' separated commands
229 # unless it's an alias command
230 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000231 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000232 if marker >= 0:
233 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000234 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000235 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000236 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000237 return line
238
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000239 def onecmd(self, line):
240 """Interpret the argument as though it had been typed in response
241 to the prompt.
242
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000243 Checks whether this line is typed at the normal prompt or in
244 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000245 """
246 if not self.commands_defining:
247 return cmd.Cmd.onecmd(self, line)
248 else:
249 return self.handle_command_def(line)
250
251 def handle_command_def(self,line):
252 """ Handles one command line during command list definition. """
253 cmd, arg, line = self.parseline(line)
254 if cmd == 'silent':
255 self.commands_silent[self.commands_bnum] = True
256 return # continue to handle other cmd def in the cmd list
257 elif cmd == 'end':
258 self.cmdqueue = []
259 return 1 # end of cmd list
260 cmdlist = self.commands[self.commands_bnum]
261 if (arg):
262 cmdlist.append(cmd+' '+arg)
263 else:
264 cmdlist.append(cmd)
265 # Determine if we must stop
266 try:
267 func = getattr(self, 'do_' + cmd)
268 except AttributeError:
269 func = self.default
Neal Norwitz221085d2007-02-25 20:55:47 +0000270 if func.__name__ in self.commands_resuming : # one of the resuming commands.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000271 self.commands_doprompt[self.commands_bnum] = False
272 self.cmdqueue = []
273 return 1
274 return
275
Tim Peters2344fae2001-01-15 00:50:52 +0000276 # Command definitions, called by cmdloop()
277 # The argument is the remaining string on the command line
278 # Return true to exit from the command loop
279
280 do_h = cmd.Cmd.do_help
281
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000282 def do_commands(self, arg):
283 """Defines a list of commands associated to a breakpoint
284 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
285 if not arg:
286 bnum = len(bdb.Breakpoint.bpbynumber)-1
287 else:
288 try:
289 bnum = int(arg)
290 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000291 print("Usage : commands [bnum]\n ...\n end", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000292 return
293 self.commands_bnum = bnum
294 self.commands[bnum] = []
295 self.commands_doprompt[bnum] = True
296 self.commands_silent[bnum] = False
297 prompt_back = self.prompt
298 self.prompt = '(com) '
299 self.commands_defining = True
300 self.cmdloop()
301 self.commands_defining = False
302 self.prompt = prompt_back
303
Tim Peters2344fae2001-01-15 00:50:52 +0000304 def do_break(self, arg, temporary = 0):
305 # break [ ([filename:]lineno | function) [, "condition"] ]
306 if not arg:
307 if self.breaks: # There's at least one
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000308 print("Num Type Disp Enb Where", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000309 for bp in bdb.Breakpoint.bpbynumber:
310 if bp:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000311 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000312 return
313 # parse arguments; comma has lowest precedence
314 # and cannot occur in filename
315 filename = None
316 lineno = None
317 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000318 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000319 if comma > 0:
320 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000321 cond = arg[comma+1:].lstrip()
322 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000323 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000324 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000325 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000326 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000327 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000328 f = self.lookupmodule(filename)
329 if not f:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000330 print('*** ', repr(filename), end=' ', file=self.stdout)
331 print('not found from sys.path', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000332 return
333 else:
334 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000335 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000336 try:
337 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000338 except ValueError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000339 print('*** Bad lineno:', arg, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000340 return
341 else:
342 # no colon; can be lineno or function
343 try:
344 lineno = int(arg)
345 except ValueError:
346 try:
347 func = eval(arg,
348 self.curframe.f_globals,
349 self.curframe.f_locals)
350 except:
351 func = arg
352 try:
353 if hasattr(func, 'im_func'):
354 func = func.im_func
Neal Norwitz221085d2007-02-25 20:55:47 +0000355 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000356 #use co_name to identify the bkpt (function names
357 #could be aliased, but co_name is invariant)
358 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000359 lineno = code.co_firstlineno
360 filename = code.co_filename
361 except:
362 # last thing to try
363 (ok, filename, ln) = self.lineinfo(arg)
364 if not ok:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000365 print('*** The specified object', end=' ', file=self.stdout)
366 print(repr(arg), end=' ', file=self.stdout)
367 print('is not a function', file=self.stdout)
368 print('or was not found along sys.path.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000369 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000370 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000371 lineno = int(ln)
372 if not filename:
373 filename = self.defaultFile()
374 # Check for reasonable breakpoint
375 line = self.checkline(filename, lineno)
376 if line:
377 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000378 err = self.set_break(filename, line, temporary, cond, funcname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000379 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000380 else:
381 bp = self.get_breaks(filename, line)[-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000382 print("Breakpoint %d at %s:%d" % (bp.number,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000383 bp.file,
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000384 bp.line), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000385
386 # To be overridden in derived debuggers
387 def defaultFile(self):
388 """Produce a reasonable default."""
389 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000390 if filename == '<string>' and self.mainpyfile:
391 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000392 return filename
393
394 do_b = do_break
395
396 def do_tbreak(self, arg):
397 self.do_break(arg, 1)
398
399 def lineinfo(self, identifier):
400 failed = (None, None, None)
401 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000402 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000403 if len(idstring) == 1:
404 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000405 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000406 elif len(idstring) == 3:
407 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000408 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000409 else:
410 return failed
411 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000412 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000413 # Protection for derived debuggers
414 if parts[0] == 'self':
415 del parts[0]
416 if len(parts) == 0:
417 return failed
418 # Best first guess at file to look at
419 fname = self.defaultFile()
420 if len(parts) == 1:
421 item = parts[0]
422 else:
423 # More than one part.
424 # First is module, second is method/class
425 f = self.lookupmodule(parts[0])
426 if f:
427 fname = f
428 item = parts[1]
429 answer = find_function(item, fname)
430 return answer or failed
431
432 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000433 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000434
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000435 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
436 line or EOF). Warning: testing is not comprehensive.
437 """
Tim Peters2344fae2001-01-15 00:50:52 +0000438 line = linecache.getline(filename, lineno)
439 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000440 print('End of file', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000441 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000442 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000443 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000444 if (not line or (line[0] == '#') or
445 (line[:3] == '"""') or line[:3] == "'''"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000446 print('*** Blank or comment', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000447 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000448 return lineno
449
450 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000451 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000452 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000453 try:
454 i = int(i)
455 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000456 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000457 continue
458
459 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000460 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000461 continue
462
463 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000464 if bp:
465 bp.enable()
466
467 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000468 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000469 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000470 try:
471 i = int(i)
472 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000473 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000474 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000475
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000476 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000477 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000478 continue
479
480 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000481 if bp:
482 bp.disable()
483
484 def do_condition(self, arg):
485 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000486 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000487 try:
488 bpnum = int(args[0].strip())
489 except ValueError:
490 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000491 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 return
Tim Peters2344fae2001-01-15 00:50:52 +0000493 try:
494 cond = args[1]
495 except:
496 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000497 try:
498 bp = bdb.Breakpoint.bpbynumber[bpnum]
499 except IndexError:
500 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
501 return
Tim Peters2344fae2001-01-15 00:50:52 +0000502 if bp:
503 bp.cond = cond
504 if not cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000505 print('Breakpoint', bpnum, end=' ', file=self.stdout)
506 print('is now unconditional.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000507
508 def do_ignore(self,arg):
509 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000510 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000511 try:
512 bpnum = int(args[0].strip())
513 except ValueError:
514 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000515 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000516 return
Tim Peters2344fae2001-01-15 00:50:52 +0000517 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000518 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000519 except:
520 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000521 try:
522 bp = bdb.Breakpoint.bpbynumber[bpnum]
523 except IndexError:
524 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
525 return
Tim Peters2344fae2001-01-15 00:50:52 +0000526 if bp:
527 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000528 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000529 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000530 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000531 reply = reply + '%d crossings' % count
532 else:
533 reply = reply + '1 crossing'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000534 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000535 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000536 print('Will stop next time breakpoint', end=' ', file=self.stdout)
537 print(bpnum, 'is reached.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000538
539 def do_clear(self, arg):
540 """Three possibilities, tried in this order:
541 clear -> clear all breaks, ask for confirmation
542 clear file:lineno -> clear all breaks at file:lineno
543 clear bpno bpno ... -> clear breakpoints by number"""
544 if not arg:
545 try:
546 reply = raw_input('Clear all breaks? ')
547 except EOFError:
548 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000549 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000550 if reply in ('y', 'yes'):
551 self.clear_all_breaks()
552 return
553 if ':' in arg:
554 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000555 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000556 filename = arg[:i]
557 arg = arg[i+1:]
558 try:
559 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000561 err = "Invalid line number (%s)" % arg
562 else:
563 err = self.clear_break(filename, lineno)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000564 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000565 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000566 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000567 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000568 try:
569 i = int(i)
570 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000571 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000572 continue
573
Georg Brandl6d2b3462005-08-24 07:36:17 +0000574 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000575 print('No breakpoint numbered', i, file=self.stdout)
Georg Brandl6d2b3462005-08-24 07:36:17 +0000576 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000577 err = self.clear_bpbynumber(i)
578 if err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000579 print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000580 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000581 print('Deleted breakpoint', i, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000582 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
583
584 def do_where(self, arg):
585 self.print_stack_trace()
586 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000587 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000588
589 def do_up(self, arg):
590 if self.curindex == 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000591 print('*** Oldest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000592 else:
593 self.curindex = self.curindex - 1
594 self.curframe = self.stack[self.curindex][0]
595 self.print_stack_entry(self.stack[self.curindex])
596 self.lineno = None
597 do_u = do_up
598
599 def do_down(self, arg):
600 if self.curindex + 1 == len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000601 print('*** Newest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000602 else:
603 self.curindex = self.curindex + 1
604 self.curframe = self.stack[self.curindex][0]
605 self.print_stack_entry(self.stack[self.curindex])
606 self.lineno = None
607 do_d = do_down
608
609 def do_step(self, arg):
610 self.set_step()
611 return 1
612 do_s = do_step
613
614 def do_next(self, arg):
615 self.set_next(self.curframe)
616 return 1
617 do_n = do_next
618
Guido van Rossumd8faa362007-04-27 19:54:29 +0000619 def do_run(self, arg):
620 """Restart program by raising an exception to be caught in the main debugger
621 loop. If arguments were given, set them in sys.argv."""
622 if arg:
623 import shlex
624 argv0 = sys.argv[0:1]
625 sys.argv = shlex.split(arg)
626 sys.argv[:0] = argv0
627 raise Restart
628
629 do_restart = do_run
630
Tim Peters2344fae2001-01-15 00:50:52 +0000631 def do_return(self, arg):
632 self.set_return(self.curframe)
633 return 1
634 do_r = do_return
635
636 def do_continue(self, arg):
637 self.set_continue()
638 return 1
639 do_c = do_cont = do_continue
640
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000641 def do_jump(self, arg):
642 if self.curindex + 1 != len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000643 print("*** You can only jump within the bottom frame", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000644 return
645 try:
646 arg = int(arg)
647 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000648 print("*** The 'jump' command requires a line number.", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000649 else:
650 try:
651 # Do the jump, fix up our copy of the stack, and display the
652 # new position
653 self.curframe.f_lineno = arg
654 self.stack[self.curindex] = self.stack[self.curindex][0], arg
655 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000656 except ValueError as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000657 print('*** Jump failed:', e, file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000658 do_j = do_jump
659
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000660 def do_debug(self, arg):
661 sys.settrace(None)
662 globals = self.curframe.f_globals
663 locals = self.curframe.f_locals
Guido van Rossumed538d82003-04-09 19:36:34 +0000664 p = Pdb()
665 p.prompt = "(%s) " % self.prompt.strip()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000666 print("ENTERING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000667 sys.call_tracing(p.run, (arg, globals, locals))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000668 print("LEAVING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000669 sys.settrace(self.trace_dispatch)
670 self.lastcmd = p.lastcmd
671
Tim Peters2344fae2001-01-15 00:50:52 +0000672 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000673 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000674 self.set_quit()
675 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000676
Tim Peters2344fae2001-01-15 00:50:52 +0000677 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000678 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000679
Guido van Rossumeef26072003-01-13 21:13:55 +0000680 def do_EOF(self, arg):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000681 print(file=self.stdout)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000682 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000683 self.set_quit()
684 return 1
685
Tim Peters2344fae2001-01-15 00:50:52 +0000686 def do_args(self, arg):
687 f = self.curframe
688 co = f.f_code
689 dict = f.f_locals
690 n = co.co_argcount
691 if co.co_flags & 4: n = n+1
692 if co.co_flags & 8: n = n+1
693 for i in range(n):
694 name = co.co_varnames[i]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000695 print(name, '=', end=' ', file=self.stdout)
696 if name in dict: print(dict[name], file=self.stdout)
697 else: print("*** undefined ***", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000698 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000699
Tim Peters2344fae2001-01-15 00:50:52 +0000700 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000701 if '__return__' in self.curframe.f_locals:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000702 print(self.curframe.f_locals['__return__'], file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000703 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000704 print('*** Not yet returned!', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000705 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000706
Barry Warsaw210bd202002-11-05 22:40:20 +0000707 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000708 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000709 return eval(arg, self.curframe.f_globals,
710 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000711 except:
712 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000713 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000714 exc_type_name = t
715 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000716 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000717 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000718
Barry Warsaw210bd202002-11-05 22:40:20 +0000719 def do_p(self, arg):
720 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000721 print(repr(self._getval(arg)), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000722 except:
723 pass
724
725 def do_pp(self, arg):
726 try:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000727 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000728 except:
729 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000730
Tim Peters2344fae2001-01-15 00:50:52 +0000731 def do_list(self, arg):
732 self.lastcmd = 'list'
733 last = None
734 if arg:
735 try:
736 x = eval(arg, {}, {})
737 if type(x) == type(()):
738 first, last = x
739 first = int(first)
740 last = int(last)
741 if last < first:
742 # Assume it's a count
743 last = first + last
744 else:
745 first = max(1, int(x) - 5)
746 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000747 print('*** Error in argument:', repr(arg), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000748 return
749 elif self.lineno is None:
750 first = max(1, self.curframe.f_lineno - 5)
751 else:
752 first = self.lineno + 1
753 if last is None:
754 last = first + 10
755 filename = self.curframe.f_code.co_filename
756 breaklist = self.get_file_breaks(filename)
757 try:
758 for lineno in range(first, last+1):
759 line = linecache.getline(filename, lineno)
760 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000761 print('[EOF]', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000762 break
763 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000764 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000765 if len(s) < 4: s = s + ' '
766 if lineno in breaklist: s = s + 'B'
767 else: s = s + ' '
768 if lineno == self.curframe.f_lineno:
769 s = s + '->'
Guido van Rossumceae3752007-02-09 22:16:54 +0000770 print(s + '\t' + line, end='', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000771 self.lineno = lineno
772 except KeyboardInterrupt:
773 pass
774 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000775
Tim Peters2344fae2001-01-15 00:50:52 +0000776 def do_whatis(self, arg):
777 try:
778 value = eval(arg, self.curframe.f_globals,
779 self.curframe.f_locals)
780 except:
781 t, v = sys.exc_info()[:2]
782 if type(t) == type(''):
783 exc_type_name = t
784 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000785 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000786 return
787 code = None
788 # Is it a function?
Neal Norwitz221085d2007-02-25 20:55:47 +0000789 try: code = value.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000790 except: pass
791 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000792 print('Function', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000793 return
794 # Is it an instance method?
Neal Norwitz221085d2007-02-25 20:55:47 +0000795 try: code = value.im_func.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000796 except: pass
797 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000798 print('Method', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000799 return
800 # None of the above...
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000801 print(type(value), file=self.stdout)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000802
Tim Peters2344fae2001-01-15 00:50:52 +0000803 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000804 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000805 if len(args) == 0:
806 keys = self.aliases.keys()
807 keys.sort()
808 for alias in keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000809 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000810 return
Guido van Rossum08454592002-07-12 13:10:53 +0000811 if args[0] in self.aliases and len(args) == 1:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000812 print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000813 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000814 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000815
Tim Peters2344fae2001-01-15 00:50:52 +0000816 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000817 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000818 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000819 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000820 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000821
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000822 #list of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000823 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
824 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000825
Tim Peters2344fae2001-01-15 00:50:52 +0000826 # Print a traceback starting at the top stack frame.
827 # The most recently entered frame is printed last;
828 # this is different from dbx and gdb, but consistent with
829 # the Python interpreter's stack trace.
830 # It is also consistent with the up/down commands (which are
831 # compatible with dbx and gdb: up moves towards 'main()'
832 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000833
Tim Peters2344fae2001-01-15 00:50:52 +0000834 def print_stack_trace(self):
835 try:
836 for frame_lineno in self.stack:
837 self.print_stack_entry(frame_lineno)
838 except KeyboardInterrupt:
839 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000840
Tim Peters2344fae2001-01-15 00:50:52 +0000841 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
842 frame, lineno = frame_lineno
843 if frame is self.curframe:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000844 print('>', end=' ', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000845 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000846 print(' ', end=' ', file=self.stdout)
847 print(self.format_stack_entry(frame_lineno,
848 prompt_prefix), file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000849
Guido van Rossum921c8241992-01-10 14:54:42 +0000850
Tim Peters2344fae2001-01-15 00:50:52 +0000851 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000852
Tim Peters2344fae2001-01-15 00:50:52 +0000853 def help_help(self):
854 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000855
Tim Peters2344fae2001-01-15 00:50:52 +0000856 def help_h(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000857 print("""h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000858Without argument, print the list of available commands.
859With a command name as argument, print help about that command
860"help pdb" pipes the full documentation file to the $PAGER
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000861"help exec" gives help on the ! command""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000862
Tim Peters2344fae2001-01-15 00:50:52 +0000863 def help_where(self):
864 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000865
Tim Peters2344fae2001-01-15 00:50:52 +0000866 def help_w(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000867 print("""w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000868Print a stack trace, with the most recent frame at the bottom.
869An arrow indicates the "current frame", which determines the
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000870context of most commands. 'bt' is an alias for this command.""", file=self.stdout)
Guido van Rossum6bd68352001-01-20 17:57:37 +0000871
872 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000873
Tim Peters2344fae2001-01-15 00:50:52 +0000874 def help_down(self):
875 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000876
Tim Peters2344fae2001-01-15 00:50:52 +0000877 def help_d(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000878 print("""d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000879Move the current frame one level down in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000880(to a newer frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881
Tim Peters2344fae2001-01-15 00:50:52 +0000882 def help_up(self):
883 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000884
Tim Peters2344fae2001-01-15 00:50:52 +0000885 def help_u(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000886 print("""u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000887Move the current frame one level up in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000888(to an older frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000889
Tim Peters2344fae2001-01-15 00:50:52 +0000890 def help_break(self):
891 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892
Tim Peters2344fae2001-01-15 00:50:52 +0000893 def help_b(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000894 print("""b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000895With a line number argument, set a break there in the current
896file. With a function name, set a break at first executable line
897of that function. Without argument, list all breaks. If a second
898argument is present, it is a string specifying an expression
899which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000900
Tim Peters2344fae2001-01-15 00:50:52 +0000901The line number may be prefixed with a filename and a colon,
902to specify a breakpoint in another file (probably one that
903hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000904the .py suffix may be omitted.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000905
Tim Peters2344fae2001-01-15 00:50:52 +0000906 def help_clear(self):
907 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000908
Tim Peters2344fae2001-01-15 00:50:52 +0000909 def help_cl(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000910 print("cl(ear) filename:lineno", file=self.stdout)
911 print("""cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000912With a space separated list of breakpoint numbers, clear
913those breakpoints. Without argument, clear all breaks (but
914first ask confirmation). With a filename:lineno argument,
915clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000916
Tim Peters2344fae2001-01-15 00:50:52 +0000917Note that the argument is different from previous versions of
918the debugger (in python distributions 1.5.1 and before) where
919a linenumber was used instead of either filename:lineno or
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000920breakpoint numbers.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000921
Tim Peters2344fae2001-01-15 00:50:52 +0000922 def help_tbreak(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000923 print("""tbreak same arguments as break, but breakpoint is
924removed when first hit.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000925
Tim Peters2344fae2001-01-15 00:50:52 +0000926 def help_enable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000927 print("""enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000928Enables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000929bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000930
Tim Peters2344fae2001-01-15 00:50:52 +0000931 def help_disable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932 print("""disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000933Disables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000934bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000935
Tim Peters2344fae2001-01-15 00:50:52 +0000936 def help_ignore(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000937 print("""ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000938Sets the ignore count for the given breakpoint number. A breakpoint
939becomes active when the ignore count is zero. When non-zero, the
940count is decremented each time the breakpoint is reached and the
941breakpoint is not disabled and any associated condition evaluates
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000942to true.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000943
Tim Peters2344fae2001-01-15 00:50:52 +0000944 def help_condition(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000945 print("""condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000946str_condition is a string specifying an expression which
947must evaluate to true before the breakpoint is honored.
948If str_condition is absent, any existing condition is removed;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000949i.e., the breakpoint is made unconditional.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000950
Tim Peters2344fae2001-01-15 00:50:52 +0000951 def help_step(self):
952 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000953
Tim Peters2344fae2001-01-15 00:50:52 +0000954 def help_s(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000955 print("""s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000956Execute the current line, stop at the first possible occasion
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000957(either in a function that is called or in the current function).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000958
Tim Peters2344fae2001-01-15 00:50:52 +0000959 def help_next(self):
960 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000961
Tim Peters2344fae2001-01-15 00:50:52 +0000962 def help_n(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000963 print("""n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000964Continue execution until the next line in the current function
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000965is reached or it returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000966
Tim Peters2344fae2001-01-15 00:50:52 +0000967 def help_return(self):
968 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000969
Tim Peters2344fae2001-01-15 00:50:52 +0000970 def help_r(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000971 print("""r(eturn)
972Continue execution until the current function returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000973
Tim Peters2344fae2001-01-15 00:50:52 +0000974 def help_continue(self):
975 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000976
Tim Peters2344fae2001-01-15 00:50:52 +0000977 def help_cont(self):
978 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000979
Tim Peters2344fae2001-01-15 00:50:52 +0000980 def help_c(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000981 print("""c(ont(inue))
982Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000983
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000984 def help_jump(self):
985 self.help_j()
986
987 def help_j(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000988 print("""j(ump) lineno
989Set the next line that will be executed.""", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000990
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000991 def help_debug(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000992 print("""debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000993Enter a recursive debugger that steps through the code argument
994(which is an arbitrary expression or statement to be executed
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000995in the current environment).""", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000996
Tim Peters2344fae2001-01-15 00:50:52 +0000997 def help_list(self):
998 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999
Tim Peters2344fae2001-01-15 00:50:52 +00001000 def help_l(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001001 print("""l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001002List source code for the current file.
1003Without arguments, list 11 lines around the current line
1004or continue the previous listing.
1005With one argument, list 11 lines starting at that line.
1006With two arguments, list the given range;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001007if the second argument is less than the first, it is a count.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008
Tim Peters2344fae2001-01-15 00:50:52 +00001009 def help_args(self):
1010 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001011
Tim Peters2344fae2001-01-15 00:50:52 +00001012 def help_a(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001013 print("""a(rgs)
1014Print the arguments of the current function.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015
Tim Peters2344fae2001-01-15 00:50:52 +00001016 def help_p(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001017 print("""p expression
1018Print the value of the expression.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019
Barry Warsaw210bd202002-11-05 22:40:20 +00001020 def help_pp(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001021 print("""pp expression
1022Pretty-print the value of the expression.""", file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +00001023
Tim Peters2344fae2001-01-15 00:50:52 +00001024 def help_exec(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001025 print("""(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001026Execute the (one-line) statement in the context of
1027the current stack frame.
1028The exclamation point can be omitted unless the first word
1029of the statement resembles a debugger command.
1030To assign to a global variable you must always prefix the
1031command with a 'global' command, e.g.:
1032(Pdb) global list_options; list_options = ['-l']
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001033(Pdb)""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001034
Guido van Rossumd8faa362007-04-27 19:54:29 +00001035 def help_run(self):
1036 print("""run [args...]
1037Restart the debugged python program. If a string is supplied, it is
1038splitted with "shlex" and the result is used as the new sys.argv.
1039History, breakpoints, actions and debugger options are preserved.
1040"restart" is an alias for "run".""")
1041
1042 help_restart = help_run
1043
Tim Peters2344fae2001-01-15 00:50:52 +00001044 def help_quit(self):
1045 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001046
Tim Peters2344fae2001-01-15 00:50:52 +00001047 def help_q(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001048 print("""q(uit) or exit - Quit from the debugger.
1049The program being executed is aborted.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001050
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001051 help_exit = help_q
1052
Tim Peters2344fae2001-01-15 00:50:52 +00001053 def help_whatis(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001054 print("""whatis arg
1055Prints the type of the argument.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001056
Tim Peters2344fae2001-01-15 00:50:52 +00001057 def help_EOF(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001058 print("""EOF
1059Handles the receipt of EOF as a command.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001060
Tim Peters2344fae2001-01-15 00:50:52 +00001061 def help_alias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001062 print("""alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001063Creates an alias called 'name' the executes 'command'. The command
1064must *not* be enclosed in quotes. Replaceable parameters are
1065indicated by %1, %2, and so on, while %* is replaced by all the
1066parameters. If no command is given, the current alias for name
1067is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001068
Tim Peters2344fae2001-01-15 00:50:52 +00001069Aliases may be nested and can contain anything that can be
1070legally typed at the pdb prompt. Note! You *can* override
1071internal pdb commands with aliases! Those internal commands
1072are then hidden until the alias is removed. Aliasing is recursively
1073applied to the first word of the command line; all other words
1074in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001077
Tim Peters2344fae2001-01-15 00:50:52 +00001078#Print instance variables (usage "pi classInst")
1079alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001080
Tim Peters2344fae2001-01-15 00:50:52 +00001081#Print instance variables in self
1082alias ps pi self
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001083""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001084
Tim Peters2344fae2001-01-15 00:50:52 +00001085 def help_unalias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001086 print("""unalias name
1087Deletes the specified alias.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001088
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089 def help_commands(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001090 print("""commands [bpnumber]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001091(com) ...
1092(com) end
1093(Pdb)
1094
1095Specify a list of commands for breakpoint number bpnumber. The
1096commands themselves appear on the following lines. Type a line
1097containing just 'end' to terminate the commands.
1098
1099To remove all commands from a breakpoint, type commands and
1100follow it immediately with end; that is, give no commands.
1101
1102With no bpnumber argument, commands refers to the last
1103breakpoint set.
1104
1105You can use breakpoint commands to start your program up again.
1106Simply use the continue command, or step, or any other
1107command that resumes execution.
1108
1109Specifying any command resuming execution (currently continue,
1110step, next, return, jump, quit and their abbreviations) terminates
1111the command list (as if that command was immediately followed by end).
1112This is because any time you resume execution
1113(even with a simple next or step), you may encounter
1114another breakpoint--which could have its own command list, leading to
1115ambiguities about which list to execute.
1116
1117 If you use the 'silent' command in the command list, the
1118usual message about stopping at a breakpoint is not printed. This may
1119be desirable for breakpoints that are to print a specific message and
1120then continue. If none of the other commands print anything, you
1121see no sign that the breakpoint was reached.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001122""", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123
Tim Peters2344fae2001-01-15 00:50:52 +00001124 def help_pdb(self):
1125 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001126
Tim Peters2344fae2001-01-15 00:50:52 +00001127 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001128 """Helper function for break/clear parsing -- may be overridden.
1129
1130 lookupmodule() translates (possibly incomplete) file or module name
1131 into an absolute file name.
1132 """
1133 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001134 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001135 f = os.path.join(sys.path[0], filename)
1136 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1137 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001138 root, ext = os.path.splitext(filename)
1139 if ext == '':
1140 filename = filename + '.py'
1141 if os.path.isabs(filename):
1142 return filename
1143 for dirname in sys.path:
1144 while os.path.islink(dirname):
1145 dirname = os.readlink(dirname)
1146 fullname = os.path.join(dirname, filename)
1147 if os.path.exists(fullname):
1148 return fullname
1149 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001150
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001151 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001152 # The script has to run in __main__ namespace (or imports from
1153 # __main__ will break).
1154 #
1155 # So we clear up the __main__ and set several special variables
1156 # (this gets rid of pdb's globals and cleans old variables on restarts).
1157 import __main__
1158 __main__.__dict__.clear()
1159 __main__.__dict__.update({"__name__" : "__main__",
1160 "__file__" : filename,
1161 "__builtins__": __builtins__,
1162 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001163
1164 # When bdb sets tracing, a number of call and line events happens
1165 # BEFORE debugger even reaches user's code (and the exact sequence of
1166 # events depends on python version). So we take special measures to
1167 # avoid stopping before we reach the main script (see user_line and
1168 # user_call for details).
1169 self._wait_for_mainpyfile = 1
1170 self.mainpyfile = self.canonic(filename)
1171 self._user_requested_quit = 0
1172 statement = 'execfile( "%s")' % filename
Guido van Rossumd8faa362007-04-27 19:54:29 +00001173 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001174
Guido van Rossum35771131992-09-08 11:59:04 +00001175# Simplified interface
1176
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001177def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001178 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001179
1180def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001181 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001182
1183def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001184 # B/W compatibility
1185 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001186
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001187def runcall(*args, **kwds):
1188 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001189
Guido van Rossumb6775db1994-08-01 11:34:53 +00001190def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001191 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001192
1193# Post-Mortem interface
1194
1195def post_mortem(t):
Tim Peters2344fae2001-01-15 00:50:52 +00001196 p = Pdb()
1197 p.reset()
1198 while t.tb_next is not None:
1199 t = t.tb_next
1200 p.interaction(t.tb_frame, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001201
1202def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001203 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001204
1205
1206# Main program for testing
1207
Guido van Rossum23efba41992-01-27 16:58:47 +00001208TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001209
Guido van Rossum921c8241992-01-10 14:54:42 +00001210def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001211 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001212
1213# print help
1214def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001215 for dirname in sys.path:
1216 fullname = os.path.join(dirname, 'pdb.doc')
1217 if os.path.exists(fullname):
1218 sts = os.system('${PAGER-more} '+fullname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001219 if sts: print('*** Pager exit status:', sts)
Tim Peters2344fae2001-01-15 00:50:52 +00001220 break
1221 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001222 print('Sorry, can\'t find the help file "pdb.doc"', end=' ')
1223 print('along the Python search path')
Guido van Rossumf17361d1996-07-30 16:28:13 +00001224
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001225def main():
Tim Peters2344fae2001-01-15 00:50:52 +00001226 if not sys.argv[1:]:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001227 print("usage: pdb.py scriptfile [arg] ...")
Tim Peters2344fae2001-01-15 00:50:52 +00001228 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001229
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001230 mainpyfile = sys.argv[1] # Get script filename
1231 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001232 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001233 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001234
Tim Peters2344fae2001-01-15 00:50:52 +00001235 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001236
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001237 # Replace pdb's dir with script's dir in front of module search path.
1238 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001239
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001240 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1241 # modified by the script being debugged. It's a bad idea when it was
Guido van Rossumd8faa362007-04-27 19:54:29 +00001242 # changed by the user from the command line. There is a "restart" command which
1243 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001244 pdb = Pdb()
1245 while 1:
1246 try:
1247 pdb._runscript(mainpyfile)
1248 if pdb._user_requested_quit:
1249 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001250 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001251 except Restart:
1252 print("Restarting", mainpyfile, "with arguments:")
1253 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001254 except SystemExit:
1255 # In most cases SystemExit does not warrant a post-mortem session.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001256 print("The program exited via sys.exit(). Exit status: ", end=' ')
1257 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001258 except:
1259 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001260 print("Uncaught exception. Entering post mortem debugging")
1261 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001262 t = sys.exc_info()[2]
1263 while t.tb_next is not None:
1264 t = t.tb_next
1265 pdb.interaction(t.tb_frame,t)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001266 print("Post mortem debugger finished. The "+mainpyfile+" will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001267
1268
1269# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001270if __name__ == '__main__':
1271 import pdb
1272 pdb.main()