blob: dfd745d718f1cc91b6f9fbfe5ed0b8af3b69faaf [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')
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000201 try:
202 sys.stdin = self.stdin
203 sys.stdout = self.stdout
204 exec(code, globals, locals)
205 finally:
206 sys.stdout = save_stdout
207 sys.stdin = save_stdin
Tim Peters2344fae2001-01-15 00:50:52 +0000208 except:
209 t, v = sys.exc_info()[:2]
210 if type(t) == type(''):
211 exc_type_name = t
212 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000213 print('***', exc_type_name + ':', v, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000214
215 def precmd(self, line):
216 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000217 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000218 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000219 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000220 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000221 line = self.aliases[args[0]]
222 ii = 1
223 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000224 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000225 tmpArg)
226 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000227 line = line.replace("%*", ' '.join(args[1:]))
228 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000229 # split into ';;' separated commands
230 # unless it's an alias command
231 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000232 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000233 if marker >= 0:
234 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000235 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000236 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000237 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000238 return line
239
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000240 def onecmd(self, line):
241 """Interpret the argument as though it had been typed in response
242 to the prompt.
243
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000244 Checks whether this line is typed at the normal prompt or in
245 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000246 """
247 if not self.commands_defining:
248 return cmd.Cmd.onecmd(self, line)
249 else:
250 return self.handle_command_def(line)
251
252 def handle_command_def(self,line):
253 """ Handles one command line during command list definition. """
254 cmd, arg, line = self.parseline(line)
255 if cmd == 'silent':
256 self.commands_silent[self.commands_bnum] = True
257 return # continue to handle other cmd def in the cmd list
258 elif cmd == 'end':
259 self.cmdqueue = []
260 return 1 # end of cmd list
261 cmdlist = self.commands[self.commands_bnum]
262 if (arg):
263 cmdlist.append(cmd+' '+arg)
264 else:
265 cmdlist.append(cmd)
266 # Determine if we must stop
267 try:
268 func = getattr(self, 'do_' + cmd)
269 except AttributeError:
270 func = self.default
Neal Norwitz221085d2007-02-25 20:55:47 +0000271 if func.__name__ in self.commands_resuming : # one of the resuming commands.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000272 self.commands_doprompt[self.commands_bnum] = False
273 self.cmdqueue = []
274 return 1
275 return
276
Tim Peters2344fae2001-01-15 00:50:52 +0000277 # Command definitions, called by cmdloop()
278 # The argument is the remaining string on the command line
279 # Return true to exit from the command loop
280
281 do_h = cmd.Cmd.do_help
282
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000283 def do_commands(self, arg):
284 """Defines a list of commands associated to a breakpoint
285 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
286 if not arg:
287 bnum = len(bdb.Breakpoint.bpbynumber)-1
288 else:
289 try:
290 bnum = int(arg)
291 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000292 print("Usage : commands [bnum]\n ...\n end", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000293 return
294 self.commands_bnum = bnum
295 self.commands[bnum] = []
296 self.commands_doprompt[bnum] = True
297 self.commands_silent[bnum] = False
298 prompt_back = self.prompt
299 self.prompt = '(com) '
300 self.commands_defining = True
301 self.cmdloop()
302 self.commands_defining = False
303 self.prompt = prompt_back
304
Tim Peters2344fae2001-01-15 00:50:52 +0000305 def do_break(self, arg, temporary = 0):
306 # break [ ([filename:]lineno | function) [, "condition"] ]
307 if not arg:
308 if self.breaks: # There's at least one
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000309 print("Num Type Disp Enb Where", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000310 for bp in bdb.Breakpoint.bpbynumber:
311 if bp:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000312 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000313 return
314 # parse arguments; comma has lowest precedence
315 # and cannot occur in filename
316 filename = None
317 lineno = None
318 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000319 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000320 if comma > 0:
321 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000322 cond = arg[comma+1:].lstrip()
323 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000324 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000325 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000326 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000327 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000328 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000329 f = self.lookupmodule(filename)
330 if not f:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000331 print('*** ', repr(filename), end=' ', file=self.stdout)
332 print('not found from sys.path', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000333 return
334 else:
335 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000336 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000337 try:
338 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000339 except ValueError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000340 print('*** Bad lineno:', arg, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000341 return
342 else:
343 # no colon; can be lineno or function
344 try:
345 lineno = int(arg)
346 except ValueError:
347 try:
348 func = eval(arg,
349 self.curframe.f_globals,
350 self.curframe.f_locals)
351 except:
352 func = arg
353 try:
Christian Heimesff737952007-11-27 10:40:20 +0000354 if hasattr(func, '__func__'):
355 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000356 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000357 #use co_name to identify the bkpt (function names
358 #could be aliased, but co_name is invariant)
359 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000360 lineno = code.co_firstlineno
361 filename = code.co_filename
362 except:
363 # last thing to try
364 (ok, filename, ln) = self.lineinfo(arg)
365 if not ok:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000366 print('*** The specified object', end=' ', file=self.stdout)
367 print(repr(arg), end=' ', file=self.stdout)
368 print('is not a function', file=self.stdout)
369 print('or was not found along sys.path.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000370 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000371 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000372 lineno = int(ln)
373 if not filename:
374 filename = self.defaultFile()
375 # Check for reasonable breakpoint
376 line = self.checkline(filename, lineno)
377 if line:
378 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000379 err = self.set_break(filename, line, temporary, cond, funcname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000380 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000381 else:
382 bp = self.get_breaks(filename, line)[-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000383 print("Breakpoint %d at %s:%d" % (bp.number,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000384 bp.file,
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000385 bp.line), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000386
387 # To be overridden in derived debuggers
388 def defaultFile(self):
389 """Produce a reasonable default."""
390 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000391 if filename == '<string>' and self.mainpyfile:
392 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000393 return filename
394
395 do_b = do_break
396
397 def do_tbreak(self, arg):
398 self.do_break(arg, 1)
399
400 def lineinfo(self, identifier):
401 failed = (None, None, None)
402 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000403 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000404 if len(idstring) == 1:
405 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000406 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000407 elif len(idstring) == 3:
408 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000409 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000410 else:
411 return failed
412 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000413 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000414 # Protection for derived debuggers
415 if parts[0] == 'self':
416 del parts[0]
417 if len(parts) == 0:
418 return failed
419 # Best first guess at file to look at
420 fname = self.defaultFile()
421 if len(parts) == 1:
422 item = parts[0]
423 else:
424 # More than one part.
425 # First is module, second is method/class
426 f = self.lookupmodule(parts[0])
427 if f:
428 fname = f
429 item = parts[1]
430 answer = find_function(item, fname)
431 return answer or failed
432
433 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000434 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000435
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000436 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
437 line or EOF). Warning: testing is not comprehensive.
438 """
Tim Peters2344fae2001-01-15 00:50:52 +0000439 line = linecache.getline(filename, lineno)
440 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000441 print('End of file', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000442 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000443 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000444 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000445 if (not line or (line[0] == '#') or
446 (line[:3] == '"""') or line[:3] == "'''"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000447 print('*** Blank or comment', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000448 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000449 return lineno
450
451 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000452 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000453 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000454 try:
455 i = int(i)
456 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000457 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000458 continue
459
460 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000461 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000462 continue
463
464 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000465 if bp:
466 bp.enable()
467
468 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000469 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000470 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000471 try:
472 i = int(i)
473 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000474 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000475 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000476
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000477 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000478 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000479 continue
480
481 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000482 if bp:
483 bp.disable()
484
485 def do_condition(self, arg):
486 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000487 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000488 try:
489 bpnum = int(args[0].strip())
490 except ValueError:
491 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000492 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000493 return
Tim Peters2344fae2001-01-15 00:50:52 +0000494 try:
495 cond = args[1]
496 except:
497 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000498 try:
499 bp = bdb.Breakpoint.bpbynumber[bpnum]
500 except IndexError:
501 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
502 return
Tim Peters2344fae2001-01-15 00:50:52 +0000503 if bp:
504 bp.cond = cond
505 if not cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000506 print('Breakpoint', bpnum, end=' ', file=self.stdout)
507 print('is now unconditional.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000508
509 def do_ignore(self,arg):
510 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000511 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000512 try:
513 bpnum = int(args[0].strip())
514 except ValueError:
515 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000516 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 return
Tim Peters2344fae2001-01-15 00:50:52 +0000518 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000519 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000520 except:
521 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 try:
523 bp = bdb.Breakpoint.bpbynumber[bpnum]
524 except IndexError:
525 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
526 return
Tim Peters2344fae2001-01-15 00:50:52 +0000527 if bp:
528 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000529 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000530 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000531 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000532 reply = reply + '%d crossings' % count
533 else:
534 reply = reply + '1 crossing'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000535 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000536 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000537 print('Will stop next time breakpoint', end=' ', file=self.stdout)
538 print(bpnum, 'is reached.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000539
540 def do_clear(self, arg):
541 """Three possibilities, tried in this order:
542 clear -> clear all breaks, ask for confirmation
543 clear file:lineno -> clear all breaks at file:lineno
544 clear bpno bpno ... -> clear breakpoints by number"""
545 if not arg:
546 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000547 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000548 except EOFError:
549 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000550 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000551 if reply in ('y', 'yes'):
552 self.clear_all_breaks()
553 return
554 if ':' in arg:
555 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000556 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000557 filename = arg[:i]
558 arg = arg[i+1:]
559 try:
560 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000562 err = "Invalid line number (%s)" % arg
563 else:
564 err = self.clear_break(filename, lineno)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000565 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000566 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000567 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000568 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000569 try:
570 i = int(i)
571 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000572 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000573 continue
574
Georg Brandl6d2b3462005-08-24 07:36:17 +0000575 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000576 print('No breakpoint numbered', i, file=self.stdout)
Georg Brandl6d2b3462005-08-24 07:36:17 +0000577 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000578 err = self.clear_bpbynumber(i)
579 if err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000580 print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000581 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000582 print('Deleted breakpoint', i, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000583 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
584
585 def do_where(self, arg):
586 self.print_stack_trace()
587 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000588 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000589
590 def do_up(self, arg):
591 if self.curindex == 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000592 print('*** Oldest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000593 else:
594 self.curindex = self.curindex - 1
595 self.curframe = self.stack[self.curindex][0]
596 self.print_stack_entry(self.stack[self.curindex])
597 self.lineno = None
598 do_u = do_up
599
600 def do_down(self, arg):
601 if self.curindex + 1 == len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000602 print('*** Newest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000603 else:
604 self.curindex = self.curindex + 1
605 self.curframe = self.stack[self.curindex][0]
606 self.print_stack_entry(self.stack[self.curindex])
607 self.lineno = None
608 do_d = do_down
609
610 def do_step(self, arg):
611 self.set_step()
612 return 1
613 do_s = do_step
614
615 def do_next(self, arg):
616 self.set_next(self.curframe)
617 return 1
618 do_n = do_next
619
Guido van Rossumd8faa362007-04-27 19:54:29 +0000620 def do_run(self, arg):
621 """Restart program by raising an exception to be caught in the main debugger
622 loop. If arguments were given, set them in sys.argv."""
623 if arg:
624 import shlex
625 argv0 = sys.argv[0:1]
626 sys.argv = shlex.split(arg)
627 sys.argv[:0] = argv0
628 raise Restart
629
630 do_restart = do_run
631
Tim Peters2344fae2001-01-15 00:50:52 +0000632 def do_return(self, arg):
633 self.set_return(self.curframe)
634 return 1
635 do_r = do_return
636
637 def do_continue(self, arg):
638 self.set_continue()
639 return 1
640 do_c = do_cont = do_continue
641
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000642 def do_jump(self, arg):
643 if self.curindex + 1 != len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000644 print("*** You can only jump within the bottom frame", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000645 return
646 try:
647 arg = int(arg)
648 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000649 print("*** The 'jump' command requires a line number.", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000650 else:
651 try:
652 # Do the jump, fix up our copy of the stack, and display the
653 # new position
654 self.curframe.f_lineno = arg
655 self.stack[self.curindex] = self.stack[self.curindex][0], arg
656 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000657 except ValueError as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000658 print('*** Jump failed:', e, file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000659 do_j = do_jump
660
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000661 def do_debug(self, arg):
662 sys.settrace(None)
663 globals = self.curframe.f_globals
664 locals = self.curframe.f_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000665 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000666 p.prompt = "(%s) " % self.prompt.strip()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000667 print("ENTERING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000668 sys.call_tracing(p.run, (arg, globals, locals))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000669 print("LEAVING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000670 sys.settrace(self.trace_dispatch)
671 self.lastcmd = p.lastcmd
672
Tim Peters2344fae2001-01-15 00:50:52 +0000673 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000674 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000675 self.set_quit()
676 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000677
Tim Peters2344fae2001-01-15 00:50:52 +0000678 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000679 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000680
Guido van Rossumeef26072003-01-13 21:13:55 +0000681 def do_EOF(self, arg):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000682 print(file=self.stdout)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000683 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000684 self.set_quit()
685 return 1
686
Tim Peters2344fae2001-01-15 00:50:52 +0000687 def do_args(self, arg):
688 f = self.curframe
689 co = f.f_code
690 dict = f.f_locals
691 n = co.co_argcount
692 if co.co_flags & 4: n = n+1
693 if co.co_flags & 8: n = n+1
694 for i in range(n):
695 name = co.co_varnames[i]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000696 print(name, '=', end=' ', file=self.stdout)
697 if name in dict: print(dict[name], file=self.stdout)
698 else: print("*** undefined ***", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000699 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000700
Tim Peters2344fae2001-01-15 00:50:52 +0000701 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000702 if '__return__' in self.curframe.f_locals:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000703 print(self.curframe.f_locals['__return__'], file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000704 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000705 print('*** Not yet returned!', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000706 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000707
Barry Warsaw210bd202002-11-05 22:40:20 +0000708 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000709 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000710 return eval(arg, self.curframe.f_globals,
711 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000712 except:
713 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000714 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000715 exc_type_name = t
716 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000717 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000718 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000719
Barry Warsaw210bd202002-11-05 22:40:20 +0000720 def do_p(self, arg):
721 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000722 print(repr(self._getval(arg)), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000723 except:
724 pass
Georg Brandlc9879242007-09-04 07:07:56 +0000725 # make "print" an alias of "p" since print isn't a Python statement anymore
726 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +0000727
728 def do_pp(self, arg):
729 try:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000730 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000731 except:
732 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000733
Tim Peters2344fae2001-01-15 00:50:52 +0000734 def do_list(self, arg):
735 self.lastcmd = 'list'
736 last = None
737 if arg:
738 try:
739 x = eval(arg, {}, {})
740 if type(x) == type(()):
741 first, last = x
742 first = int(first)
743 last = int(last)
744 if last < first:
745 # Assume it's a count
746 last = first + last
747 else:
748 first = max(1, int(x) - 5)
749 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000750 print('*** Error in argument:', repr(arg), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000751 return
752 elif self.lineno is None:
753 first = max(1, self.curframe.f_lineno - 5)
754 else:
755 first = self.lineno + 1
756 if last is None:
757 last = first + 10
758 filename = self.curframe.f_code.co_filename
759 breaklist = self.get_file_breaks(filename)
760 try:
761 for lineno in range(first, last+1):
762 line = linecache.getline(filename, lineno)
763 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000764 print('[EOF]', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000765 break
766 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000767 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000768 if len(s) < 4: s = s + ' '
769 if lineno in breaklist: s = s + 'B'
770 else: s = s + ' '
771 if lineno == self.curframe.f_lineno:
772 s = s + '->'
Guido van Rossumceae3752007-02-09 22:16:54 +0000773 print(s + '\t' + line, end='', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000774 self.lineno = lineno
775 except KeyboardInterrupt:
776 pass
777 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000778
Tim Peters2344fae2001-01-15 00:50:52 +0000779 def do_whatis(self, arg):
780 try:
781 value = eval(arg, self.curframe.f_globals,
782 self.curframe.f_locals)
783 except:
784 t, v = sys.exc_info()[:2]
785 if type(t) == type(''):
786 exc_type_name = t
787 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000788 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000789 return
790 code = None
791 # Is it a function?
Neal Norwitz221085d2007-02-25 20:55:47 +0000792 try: code = value.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000793 except: pass
794 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000795 print('Function', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000796 return
797 # Is it an instance method?
Christian Heimesff737952007-11-27 10:40:20 +0000798 try: code = value.__func__.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000799 except: pass
800 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000801 print('Method', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000802 return
803 # None of the above...
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000804 print(type(value), file=self.stdout)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000805
Tim Peters2344fae2001-01-15 00:50:52 +0000806 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000807 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000808 if len(args) == 0:
809 keys = self.aliases.keys()
810 keys.sort()
811 for alias in keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000812 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000813 return
Guido van Rossum08454592002-07-12 13:10:53 +0000814 if args[0] in self.aliases and len(args) == 1:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000815 print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000816 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000817 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000818
Tim Peters2344fae2001-01-15 00:50:52 +0000819 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000820 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000821 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000822 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000823 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000824
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000825 #list of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000826 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
827 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000828
Tim Peters2344fae2001-01-15 00:50:52 +0000829 # Print a traceback starting at the top stack frame.
830 # The most recently entered frame is printed last;
831 # this is different from dbx and gdb, but consistent with
832 # the Python interpreter's stack trace.
833 # It is also consistent with the up/down commands (which are
834 # compatible with dbx and gdb: up moves towards 'main()'
835 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000836
Tim Peters2344fae2001-01-15 00:50:52 +0000837 def print_stack_trace(self):
838 try:
839 for frame_lineno in self.stack:
840 self.print_stack_entry(frame_lineno)
841 except KeyboardInterrupt:
842 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000843
Tim Peters2344fae2001-01-15 00:50:52 +0000844 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
845 frame, lineno = frame_lineno
846 if frame is self.curframe:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000847 print('>', end=' ', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000848 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000849 print(' ', end=' ', file=self.stdout)
850 print(self.format_stack_entry(frame_lineno,
851 prompt_prefix), file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000852
Guido van Rossum921c8241992-01-10 14:54:42 +0000853
Tim Peters2344fae2001-01-15 00:50:52 +0000854 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000855
Tim Peters2344fae2001-01-15 00:50:52 +0000856 def help_help(self):
857 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000858
Tim Peters2344fae2001-01-15 00:50:52 +0000859 def help_h(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000860 print("""h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000861Without argument, print the list of available commands.
862With a command name as argument, print help about that command
863"help pdb" pipes the full documentation file to the $PAGER
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000864"help exec" gives help on the ! command""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000865
Tim Peters2344fae2001-01-15 00:50:52 +0000866 def help_where(self):
867 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000868
Tim Peters2344fae2001-01-15 00:50:52 +0000869 def help_w(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000870 print("""w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000871Print a stack trace, with the most recent frame at the bottom.
872An arrow indicates the "current frame", which determines the
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000873context of most commands. 'bt' is an alias for this command.""", file=self.stdout)
Guido van Rossum6bd68352001-01-20 17:57:37 +0000874
875 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000876
Tim Peters2344fae2001-01-15 00:50:52 +0000877 def help_down(self):
878 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000879
Tim Peters2344fae2001-01-15 00:50:52 +0000880 def help_d(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000881 print("""d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000882Move the current frame one level down in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000883(to a newer frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000884
Tim Peters2344fae2001-01-15 00:50:52 +0000885 def help_up(self):
886 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000887
Tim Peters2344fae2001-01-15 00:50:52 +0000888 def help_u(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000889 print("""u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000890Move the current frame one level up in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000891(to an older frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000892
Tim Peters2344fae2001-01-15 00:50:52 +0000893 def help_break(self):
894 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000895
Tim Peters2344fae2001-01-15 00:50:52 +0000896 def help_b(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000897 print("""b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000898With a line number argument, set a break there in the current
899file. With a function name, set a break at first executable line
900of that function. Without argument, list all breaks. If a second
901argument is present, it is a string specifying an expression
902which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903
Tim Peters2344fae2001-01-15 00:50:52 +0000904The line number may be prefixed with a filename and a colon,
905to specify a breakpoint in another file (probably one that
906hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000907the .py suffix may be omitted.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000908
Tim Peters2344fae2001-01-15 00:50:52 +0000909 def help_clear(self):
910 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000911
Tim Peters2344fae2001-01-15 00:50:52 +0000912 def help_cl(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000913 print("cl(ear) filename:lineno", file=self.stdout)
914 print("""cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000915With a space separated list of breakpoint numbers, clear
916those breakpoints. Without argument, clear all breaks (but
917first ask confirmation). With a filename:lineno argument,
Georg Brandld348b252008-01-05 20:00:55 +0000918clear all breaks at that line in that file.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000919
Tim Peters2344fae2001-01-15 00:50:52 +0000920 def help_tbreak(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000921 print("""tbreak same arguments as break, but breakpoint is
922removed when first hit.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000923
Tim Peters2344fae2001-01-15 00:50:52 +0000924 def help_enable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000925 print("""enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000926Enables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000927bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000928
Tim Peters2344fae2001-01-15 00:50:52 +0000929 def help_disable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000930 print("""disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000931Disables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000933
Tim Peters2344fae2001-01-15 00:50:52 +0000934 def help_ignore(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000935 print("""ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000936Sets the ignore count for the given breakpoint number. A breakpoint
937becomes active when the ignore count is zero. When non-zero, the
938count is decremented each time the breakpoint is reached and the
939breakpoint is not disabled and any associated condition evaluates
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000940to true.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000941
Tim Peters2344fae2001-01-15 00:50:52 +0000942 def help_condition(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000943 print("""condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000944str_condition is a string specifying an expression which
945must evaluate to true before the breakpoint is honored.
946If str_condition is absent, any existing condition is removed;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000947i.e., the breakpoint is made unconditional.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000948
Tim Peters2344fae2001-01-15 00:50:52 +0000949 def help_step(self):
950 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000951
Tim Peters2344fae2001-01-15 00:50:52 +0000952 def help_s(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000953 print("""s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000954Execute the current line, stop at the first possible occasion
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000955(either in a function that is called or in the current function).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000956
Tim Peters2344fae2001-01-15 00:50:52 +0000957 def help_next(self):
958 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000959
Tim Peters2344fae2001-01-15 00:50:52 +0000960 def help_n(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000961 print("""n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000962Continue execution until the next line in the current function
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000963is reached or it returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000964
Tim Peters2344fae2001-01-15 00:50:52 +0000965 def help_return(self):
966 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000967
Tim Peters2344fae2001-01-15 00:50:52 +0000968 def help_r(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000969 print("""r(eturn)
970Continue execution until the current function returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000971
Tim Peters2344fae2001-01-15 00:50:52 +0000972 def help_continue(self):
973 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000974
Tim Peters2344fae2001-01-15 00:50:52 +0000975 def help_cont(self):
976 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_c(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000979 print("""c(ont(inue))
980Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000981
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000982 def help_jump(self):
983 self.help_j()
984
985 def help_j(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000986 print("""j(ump) lineno
987Set the next line that will be executed.""", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000988
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000989 def help_debug(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000990 print("""debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000991Enter a recursive debugger that steps through the code argument
992(which is an arbitrary expression or statement to be executed
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000993in the current environment).""", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000994
Tim Peters2344fae2001-01-15 00:50:52 +0000995 def help_list(self):
996 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000997
Tim Peters2344fae2001-01-15 00:50:52 +0000998 def help_l(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000999 print("""l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001000List source code for the current file.
1001Without arguments, list 11 lines around the current line
1002or continue the previous listing.
1003With one argument, list 11 lines starting at that line.
1004With two arguments, list the given range;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001005if the second argument is less than the first, it is a count.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001006
Tim Peters2344fae2001-01-15 00:50:52 +00001007 def help_args(self):
1008 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001009
Tim Peters2344fae2001-01-15 00:50:52 +00001010 def help_a(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001011 print("""a(rgs)
1012Print the arguments of the current function.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001013
Tim Peters2344fae2001-01-15 00:50:52 +00001014 def help_p(self):
Georg Brandlc9879242007-09-04 07:07:56 +00001015 print("""p(rint) expression
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001016Print the value of the expression.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001017
Barry Warsaw210bd202002-11-05 22:40:20 +00001018 def help_pp(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001019 print("""pp expression
1020Pretty-print the value of the expression.""", file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +00001021
Tim Peters2344fae2001-01-15 00:50:52 +00001022 def help_exec(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001023 print("""(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001024Execute the (one-line) statement in the context of
1025the current stack frame.
1026The exclamation point can be omitted unless the first word
1027of the statement resembles a debugger command.
1028To assign to a global variable you must always prefix the
1029command with a 'global' command, e.g.:
1030(Pdb) global list_options; list_options = ['-l']
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001031(Pdb)""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001032
Guido van Rossumd8faa362007-04-27 19:54:29 +00001033 def help_run(self):
1034 print("""run [args...]
1035Restart the debugged python program. If a string is supplied, it is
1036splitted with "shlex" and the result is used as the new sys.argv.
1037History, breakpoints, actions and debugger options are preserved.
1038"restart" is an alias for "run".""")
1039
1040 help_restart = help_run
1041
Tim Peters2344fae2001-01-15 00:50:52 +00001042 def help_quit(self):
1043 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001044
Tim Peters2344fae2001-01-15 00:50:52 +00001045 def help_q(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001046 print("""q(uit) or exit - Quit from the debugger.
1047The program being executed is aborted.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001048
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001049 help_exit = help_q
1050
Tim Peters2344fae2001-01-15 00:50:52 +00001051 def help_whatis(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001052 print("""whatis arg
1053Prints the type of the argument.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054
Tim Peters2344fae2001-01-15 00:50:52 +00001055 def help_EOF(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001056 print("""EOF
1057Handles the receipt of EOF as a command.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001058
Tim Peters2344fae2001-01-15 00:50:52 +00001059 def help_alias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001060 print("""alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001061Creates an alias called 'name' the executes 'command'. The command
1062must *not* be enclosed in quotes. Replaceable parameters are
1063indicated by %1, %2, and so on, while %* is replaced by all the
1064parameters. If no command is given, the current alias for name
1065is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001066
Tim Peters2344fae2001-01-15 00:50:52 +00001067Aliases may be nested and can contain anything that can be
1068legally typed at the pdb prompt. Note! You *can* override
1069internal pdb commands with aliases! Those internal commands
1070are then hidden until the alias is removed. Aliasing is recursively
1071applied to the first word of the command line; all other words
1072in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001073
Tim Peters2344fae2001-01-15 00:50:52 +00001074Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076#Print instance variables (usage "pi classInst")
1077alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001078
Tim Peters2344fae2001-01-15 00:50:52 +00001079#Print instance variables in self
1080alias ps pi self
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001081""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001082
Tim Peters2344fae2001-01-15 00:50:52 +00001083 def help_unalias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001084 print("""unalias name
1085Deletes the specified alias.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001086
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001087 def help_commands(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001088 print("""commands [bpnumber]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001089(com) ...
1090(com) end
1091(Pdb)
1092
1093Specify a list of commands for breakpoint number bpnumber. The
1094commands themselves appear on the following lines. Type a line
1095containing just 'end' to terminate the commands.
1096
1097To remove all commands from a breakpoint, type commands and
1098follow it immediately with end; that is, give no commands.
1099
1100With no bpnumber argument, commands refers to the last
1101breakpoint set.
1102
1103You can use breakpoint commands to start your program up again.
1104Simply use the continue command, or step, or any other
1105command that resumes execution.
1106
1107Specifying any command resuming execution (currently continue,
1108step, next, return, jump, quit and their abbreviations) terminates
1109the command list (as if that command was immediately followed by end).
1110This is because any time you resume execution
1111(even with a simple next or step), you may encounter
1112another breakpoint--which could have its own command list, leading to
1113ambiguities about which list to execute.
1114
1115 If you use the 'silent' command in the command list, the
1116usual message about stopping at a breakpoint is not printed. This may
1117be desirable for breakpoints that are to print a specific message and
1118then continue. If none of the other commands print anything, you
1119see no sign that the breakpoint was reached.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001120""", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001121
Tim Peters2344fae2001-01-15 00:50:52 +00001122 def help_pdb(self):
1123 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001124
Tim Peters2344fae2001-01-15 00:50:52 +00001125 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001126 """Helper function for break/clear parsing -- may be overridden.
1127
1128 lookupmodule() translates (possibly incomplete) file or module name
1129 into an absolute file name.
1130 """
1131 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001132 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001133 f = os.path.join(sys.path[0], filename)
1134 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1135 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001136 root, ext = os.path.splitext(filename)
1137 if ext == '':
1138 filename = filename + '.py'
1139 if os.path.isabs(filename):
1140 return filename
1141 for dirname in sys.path:
1142 while os.path.islink(dirname):
1143 dirname = os.readlink(dirname)
1144 fullname = os.path.join(dirname, filename)
1145 if os.path.exists(fullname):
1146 return fullname
1147 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001148
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001149 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 # The script has to run in __main__ namespace (or imports from
1151 # __main__ will break).
1152 #
1153 # So we clear up the __main__ and set several special variables
1154 # (this gets rid of pdb's globals and cleans old variables on restarts).
1155 import __main__
1156 __main__.__dict__.clear()
1157 __main__.__dict__.update({"__name__" : "__main__",
1158 "__file__" : filename,
1159 "__builtins__": __builtins__,
1160 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001161
1162 # When bdb sets tracing, a number of call and line events happens
1163 # BEFORE debugger even reaches user's code (and the exact sequence of
1164 # events depends on python version). So we take special measures to
1165 # avoid stopping before we reach the main script (see user_line and
1166 # user_call for details).
1167 self._wait_for_mainpyfile = 1
1168 self.mainpyfile = self.canonic(filename)
1169 self._user_requested_quit = 0
Georg Brandl7dd803a2007-09-12 19:44:18 +00001170 with open(filename) as fp:
1171 statement = fp.read()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001172 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001173
Guido van Rossum35771131992-09-08 11:59:04 +00001174# Simplified interface
1175
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001176def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001177 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001178
1179def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001180 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001181
1182def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001183 # B/W compatibility
1184 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001185
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001186def runcall(*args, **kwds):
1187 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001188
Guido van Rossumb6775db1994-08-01 11:34:53 +00001189def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001190 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001191
1192# Post-Mortem interface
1193
1194def post_mortem(t):
Tim Peters2344fae2001-01-15 00:50:52 +00001195 p = Pdb()
1196 p.reset()
1197 while t.tb_next is not None:
1198 t = t.tb_next
1199 p.interaction(t.tb_frame, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001200
1201def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001202 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001203
1204
1205# Main program for testing
1206
Guido van Rossum23efba41992-01-27 16:58:47 +00001207TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001208
Guido van Rossum921c8241992-01-10 14:54:42 +00001209def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001210 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001211
1212# print help
1213def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001214 for dirname in sys.path:
1215 fullname = os.path.join(dirname, 'pdb.doc')
1216 if os.path.exists(fullname):
1217 sts = os.system('${PAGER-more} '+fullname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001218 if sts: print('*** Pager exit status:', sts)
Tim Peters2344fae2001-01-15 00:50:52 +00001219 break
1220 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001221 print('Sorry, can\'t find the help file "pdb.doc"', end=' ')
1222 print('along the Python search path')
Guido van Rossumf17361d1996-07-30 16:28:13 +00001223
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001224def main():
Tim Peters2344fae2001-01-15 00:50:52 +00001225 if not sys.argv[1:]:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001226 print("usage: pdb.py scriptfile [arg] ...")
Tim Peters2344fae2001-01-15 00:50:52 +00001227 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001228
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001229 mainpyfile = sys.argv[1] # Get script filename
1230 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001231 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001232 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001233
Tim Peters2344fae2001-01-15 00:50:52 +00001234 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001235
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001236 # Replace pdb's dir with script's dir in front of module search path.
1237 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001238
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001239 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1240 # modified by the script being debugged. It's a bad idea when it was
Guido van Rossumd8faa362007-04-27 19:54:29 +00001241 # changed by the user from the command line. There is a "restart" command which
1242 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001243 pdb = Pdb()
1244 while 1:
1245 try:
1246 pdb._runscript(mainpyfile)
1247 if pdb._user_requested_quit:
1248 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001249 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001250 except Restart:
1251 print("Restarting", mainpyfile, "with arguments:")
1252 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001253 except SystemExit:
1254 # In most cases SystemExit does not warrant a post-mortem session.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001255 print("The program exited via sys.exit(). Exit status: ", end=' ')
1256 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001257 except:
1258 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001259 print("Uncaught exception. Entering post mortem debugging")
1260 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001261 t = sys.exc_info()[2]
1262 while t.tb_next is not None:
1263 t = t.tb_next
1264 pdb.interaction(t.tb_frame,t)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001265 print("Post mortem debugger finished. The "+mainpyfile+" will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001266
1267
1268# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001269if __name__ == '__main__':
1270 import pdb
1271 pdb.main()