blob: 22fc4c53797d8c5e1963c9c1a0941aa05db725e8 [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
Alexandre Vassalotti1f2ba4b2008-05-16 07:12:44 +000011from reprlib 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
Benjamin Petersond23f8222009-04-05 19:13:16 +000098 self.commands_doprompt = {} # for each bp num, tells if the prompt
99 # must be disp. after execing the cmd list
100 self.commands_silent = {} # for each bp num, tells if the stack trace
101 # must be disp. after execing the cmd list
102 self.commands_defining = False # True while in the process of defining
103 # a command list
104 self.commands_bnum = None # The breakpoint number for which we are
105 # defining a list
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000106
Tim Peters2344fae2001-01-15 00:50:52 +0000107 def reset(self):
108 bdb.Bdb.reset(self)
109 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000110
Tim Peters2344fae2001-01-15 00:50:52 +0000111 def forget(self):
112 self.lineno = None
113 self.stack = []
114 self.curindex = 0
115 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000116
Tim Peters2344fae2001-01-15 00:50:52 +0000117 def setup(self, f, t):
118 self.forget()
119 self.stack, self.curindex = self.get_stack(f, t)
120 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000121 # The f_locals dictionary is updated from the actual frame
122 # locals whenever the .f_locals accessor is called, so we
123 # cache it here to ensure that modifications are not overwritten.
124 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000125 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126
Tim Peters2344fae2001-01-15 00:50:52 +0000127 # Can be executed earlier than 'setup' if desired
128 def execRcLines(self):
129 if self.rcLines:
130 # Make local copy because of recursion
131 rcLines = self.rcLines
132 # executed only once
133 self.rcLines = []
134 for line in rcLines:
135 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000136 if len(line) > 0 and line[0] != '#':
137 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000138
Tim Peters280488b2002-08-23 18:19:30 +0000139 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000140
141 def user_call(self, frame, argument_list):
142 """This method is called when there is the remote possibility
143 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 if self._wait_for_mainpyfile:
145 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000146 if self.stop_here(frame):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000147 print('--Call--', file=self.stdout)
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000148 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000149
Tim Peters2344fae2001-01-15 00:50:52 +0000150 def user_line(self, frame):
151 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000152 if self._wait_for_mainpyfile:
153 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
154 or frame.f_lineno<= 0):
155 return
156 self._wait_for_mainpyfile = 0
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000157 if self.bp_commands(frame):
158 self.interaction(frame, None)
159
160 def bp_commands(self,frame):
161 """ Call every command that was set for the current active breakpoint (if there is one)
162 Returns True if the normal interaction function must be called, False otherwise """
163 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
164 if getattr(self,"currentbp",False) and self.currentbp in self.commands:
165 currentbp = self.currentbp
166 self.currentbp = 0
167 lastcmd_back = self.lastcmd
168 self.setup(frame, None)
169 for line in self.commands[currentbp]:
170 self.onecmd(line)
171 self.lastcmd = lastcmd_back
172 if not self.commands_silent[currentbp]:
173 self.print_stack_entry(self.stack[self.curindex])
174 if self.commands_doprompt[currentbp]:
175 self.cmdloop()
176 self.forget()
177 return
178 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000179
Tim Peters2344fae2001-01-15 00:50:52 +0000180 def user_return(self, frame, return_value):
181 """This function is called when a return trap is set here."""
182 frame.f_locals['__return__'] = return_value
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000183 print('--Return--', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000184 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000185
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000186 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000187 """This function is called if an exception occurs,
188 but only if we are to stop at or just below this level."""
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000189 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000190 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000191 exc_type_name = exc_type.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000192 print(exc_type_name + ':', _saferepr(exc_value), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000193 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000194
Tim Peters2344fae2001-01-15 00:50:52 +0000195 # General interaction function
196
197 def interaction(self, frame, traceback):
198 self.setup(frame, traceback)
199 self.print_stack_entry(self.stack[self.curindex])
200 self.cmdloop()
201 self.forget()
202
Benjamin Petersond23f8222009-04-05 19:13:16 +0000203 def displayhook(self, obj):
204 """Custom displayhook for the exec in default(), which prevents
205 assignment of the _ variable in the builtins.
206 """
207 print(repr(obj))
208
Tim Peters2344fae2001-01-15 00:50:52 +0000209 def default(self, line):
210 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000211 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000212 globals = self.curframe.f_globals
213 try:
214 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000215 save_stdout = sys.stdout
216 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000217 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000218 try:
219 sys.stdin = self.stdin
220 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000221 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000222 exec(code, globals, locals)
223 finally:
224 sys.stdout = save_stdout
225 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000226 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000227 except:
228 t, v = sys.exc_info()[:2]
229 if type(t) == type(''):
230 exc_type_name = t
231 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000232 print('***', exc_type_name + ':', v, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000233
234 def precmd(self, line):
235 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000236 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000237 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000238 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000239 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000240 line = self.aliases[args[0]]
241 ii = 1
242 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000243 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000244 tmpArg)
245 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000246 line = line.replace("%*", ' '.join(args[1:]))
247 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000248 # split into ';;' separated commands
249 # unless it's an alias command
250 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000251 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000252 if marker >= 0:
253 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000254 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000255 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000256 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000257 return line
258
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000259 def onecmd(self, line):
260 """Interpret the argument as though it had been typed in response
261 to the prompt.
262
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000263 Checks whether this line is typed at the normal prompt or in
264 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000265 """
266 if not self.commands_defining:
267 return cmd.Cmd.onecmd(self, line)
268 else:
269 return self.handle_command_def(line)
270
271 def handle_command_def(self,line):
272 """ Handles one command line during command list definition. """
273 cmd, arg, line = self.parseline(line)
274 if cmd == 'silent':
275 self.commands_silent[self.commands_bnum] = True
276 return # continue to handle other cmd def in the cmd list
277 elif cmd == 'end':
278 self.cmdqueue = []
279 return 1 # end of cmd list
280 cmdlist = self.commands[self.commands_bnum]
281 if (arg):
282 cmdlist.append(cmd+' '+arg)
283 else:
284 cmdlist.append(cmd)
285 # Determine if we must stop
286 try:
287 func = getattr(self, 'do_' + cmd)
288 except AttributeError:
289 func = self.default
Neal Norwitz221085d2007-02-25 20:55:47 +0000290 if func.__name__ in self.commands_resuming : # one of the resuming commands.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000291 self.commands_doprompt[self.commands_bnum] = False
292 self.cmdqueue = []
293 return 1
294 return
295
Tim Peters2344fae2001-01-15 00:50:52 +0000296 # Command definitions, called by cmdloop()
297 # The argument is the remaining string on the command line
298 # Return true to exit from the command loop
299
300 do_h = cmd.Cmd.do_help
301
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000302 def do_commands(self, arg):
303 """Defines a list of commands associated to a breakpoint
304 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
305 if not arg:
306 bnum = len(bdb.Breakpoint.bpbynumber)-1
307 else:
308 try:
309 bnum = int(arg)
310 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000311 print("Usage : commands [bnum]\n ...\n end", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000312 return
313 self.commands_bnum = bnum
314 self.commands[bnum] = []
315 self.commands_doprompt[bnum] = True
316 self.commands_silent[bnum] = False
317 prompt_back = self.prompt
318 self.prompt = '(com) '
319 self.commands_defining = True
320 self.cmdloop()
321 self.commands_defining = False
322 self.prompt = prompt_back
323
Tim Peters2344fae2001-01-15 00:50:52 +0000324 def do_break(self, arg, temporary = 0):
325 # break [ ([filename:]lineno | function) [, "condition"] ]
326 if not arg:
327 if self.breaks: # There's at least one
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000328 print("Num Type Disp Enb Where", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000329 for bp in bdb.Breakpoint.bpbynumber:
330 if bp:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000332 return
333 # parse arguments; comma has lowest precedence
334 # and cannot occur in filename
335 filename = None
336 lineno = None
337 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000338 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000339 if comma > 0:
340 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000341 cond = arg[comma+1:].lstrip()
342 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000343 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000344 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000345 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000346 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000347 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000348 f = self.lookupmodule(filename)
349 if not f:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000350 print('*** ', repr(filename), end=' ', file=self.stdout)
351 print('not found from sys.path', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000352 return
353 else:
354 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000355 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000356 try:
357 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000358 except ValueError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000359 print('*** Bad lineno:', arg, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000360 return
361 else:
362 # no colon; can be lineno or function
363 try:
364 lineno = int(arg)
365 except ValueError:
366 try:
367 func = eval(arg,
368 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000369 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000370 except:
371 func = arg
372 try:
Christian Heimesff737952007-11-27 10:40:20 +0000373 if hasattr(func, '__func__'):
374 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000375 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000376 #use co_name to identify the bkpt (function names
377 #could be aliased, but co_name is invariant)
378 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000379 lineno = code.co_firstlineno
380 filename = code.co_filename
381 except:
382 # last thing to try
383 (ok, filename, ln) = self.lineinfo(arg)
384 if not ok:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000385 print('*** The specified object', end=' ', file=self.stdout)
386 print(repr(arg), end=' ', file=self.stdout)
387 print('is not a function', file=self.stdout)
388 print('or was not found along sys.path.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000389 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000390 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000391 lineno = int(ln)
392 if not filename:
393 filename = self.defaultFile()
394 # Check for reasonable breakpoint
395 line = self.checkline(filename, lineno)
396 if line:
397 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000398 err = self.set_break(filename, line, temporary, cond, funcname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000399 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000400 else:
401 bp = self.get_breaks(filename, line)[-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000402 print("Breakpoint %d at %s:%d" % (bp.number,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000403 bp.file,
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000404 bp.line), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000405
406 # To be overridden in derived debuggers
407 def defaultFile(self):
408 """Produce a reasonable default."""
409 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000410 if filename == '<string>' and self.mainpyfile:
411 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000412 return filename
413
414 do_b = do_break
415
416 def do_tbreak(self, arg):
417 self.do_break(arg, 1)
418
419 def lineinfo(self, identifier):
420 failed = (None, None, None)
421 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000422 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000423 if len(idstring) == 1:
424 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000425 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000426 elif len(idstring) == 3:
427 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000428 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000429 else:
430 return failed
431 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000432 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000433 # Protection for derived debuggers
434 if parts[0] == 'self':
435 del parts[0]
436 if len(parts) == 0:
437 return failed
438 # Best first guess at file to look at
439 fname = self.defaultFile()
440 if len(parts) == 1:
441 item = parts[0]
442 else:
443 # More than one part.
444 # First is module, second is method/class
445 f = self.lookupmodule(parts[0])
446 if f:
447 fname = f
448 item = parts[1]
449 answer = find_function(item, fname)
450 return answer or failed
451
452 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000453 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000454
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000455 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
456 line or EOF). Warning: testing is not comprehensive.
457 """
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000458 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000459 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000460 print('End of file', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000461 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000462 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000463 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000464 if (not line or (line[0] == '#') or
465 (line[:3] == '"""') or line[:3] == "'''"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000466 print('*** Blank or comment', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000467 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000468 return lineno
469
470 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000471 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000472 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000473 try:
474 i = int(i)
475 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000476 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000477 continue
478
479 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000480 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000481 continue
482
483 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000484 if bp:
485 bp.enable()
486
487 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000488 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000489 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000490 try:
491 i = int(i)
492 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000493 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000494 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000495
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000496 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000497 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000498 continue
499
500 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000501 if bp:
502 bp.disable()
503
504 def do_condition(self, arg):
505 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000506 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000507 try:
508 bpnum = int(args[0].strip())
509 except ValueError:
510 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000511 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000512 return
Tim Peters2344fae2001-01-15 00:50:52 +0000513 try:
514 cond = args[1]
515 except:
516 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 try:
518 bp = bdb.Breakpoint.bpbynumber[bpnum]
519 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000520 print('Breakpoint index %r is not valid' % args[0],
521 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 return
Tim Peters2344fae2001-01-15 00:50:52 +0000523 if bp:
524 bp.cond = cond
525 if not cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000526 print('Breakpoint', bpnum, end=' ', file=self.stdout)
527 print('is now unconditional.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000528
529 def do_ignore(self,arg):
530 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000531 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000532 try:
533 bpnum = int(args[0].strip())
534 except ValueError:
535 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000536 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000537 return
Tim Peters2344fae2001-01-15 00:50:52 +0000538 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000539 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000540 except:
541 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000542 try:
543 bp = bdb.Breakpoint.bpbynumber[bpnum]
544 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000545 print('Breakpoint index %r is not valid' % args[0],
546 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000547 return
Tim Peters2344fae2001-01-15 00:50:52 +0000548 if bp:
549 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000550 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000551 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000552 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000553 reply = reply + '%d crossings' % count
554 else:
555 reply = reply + '1 crossing'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000556 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000557 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000558 print('Will stop next time breakpoint', end=' ', file=self.stdout)
559 print(bpnum, 'is reached.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000560
561 def do_clear(self, arg):
562 """Three possibilities, tried in this order:
563 clear -> clear all breaks, ask for confirmation
564 clear file:lineno -> clear all breaks at file:lineno
565 clear bpno bpno ... -> clear breakpoints by number"""
566 if not arg:
567 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000568 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000569 except EOFError:
570 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000571 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000572 if reply in ('y', 'yes'):
573 self.clear_all_breaks()
574 return
575 if ':' in arg:
576 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000577 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000578 filename = arg[:i]
579 arg = arg[i+1:]
580 try:
581 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000582 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000583 err = "Invalid line number (%s)" % arg
584 else:
585 err = self.clear_break(filename, lineno)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000586 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000587 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000588 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000589 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000590 try:
591 i = int(i)
592 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000593 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000594 continue
595
Georg Brandl6d2b3462005-08-24 07:36:17 +0000596 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000597 print('No breakpoint numbered', i, file=self.stdout)
Georg Brandl6d2b3462005-08-24 07:36:17 +0000598 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000599 err = self.clear_bpbynumber(i)
600 if err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000601 print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000602 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000603 print('Deleted breakpoint', i, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000604 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
605
606 def do_where(self, arg):
607 self.print_stack_trace()
608 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000609 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000610
611 def do_up(self, arg):
612 if self.curindex == 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000613 print('*** Oldest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000614 else:
615 self.curindex = self.curindex - 1
616 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000617 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000618 self.print_stack_entry(self.stack[self.curindex])
619 self.lineno = None
620 do_u = do_up
621
622 def do_down(self, arg):
623 if self.curindex + 1 == len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000624 print('*** Newest frame', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000625 else:
626 self.curindex = self.curindex + 1
627 self.curframe = self.stack[self.curindex][0]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000628 self.curframe_locals = self.curframe.f_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000629 self.print_stack_entry(self.stack[self.curindex])
630 self.lineno = None
631 do_d = do_down
632
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000633 def do_until(self, arg):
634 self.set_until(self.curframe)
635 return 1
636 do_unt = do_until
637
Tim Peters2344fae2001-01-15 00:50:52 +0000638 def do_step(self, arg):
639 self.set_step()
640 return 1
641 do_s = do_step
642
643 def do_next(self, arg):
644 self.set_next(self.curframe)
645 return 1
646 do_n = do_next
647
Guido van Rossumd8faa362007-04-27 19:54:29 +0000648 def do_run(self, arg):
649 """Restart program by raising an exception to be caught in the main debugger
650 loop. If arguments were given, set them in sys.argv."""
651 if arg:
652 import shlex
653 argv0 = sys.argv[0:1]
654 sys.argv = shlex.split(arg)
655 sys.argv[:0] = argv0
656 raise Restart
657
658 do_restart = do_run
659
Tim Peters2344fae2001-01-15 00:50:52 +0000660 def do_return(self, arg):
661 self.set_return(self.curframe)
662 return 1
663 do_r = do_return
664
665 def do_continue(self, arg):
666 self.set_continue()
667 return 1
668 do_c = do_cont = do_continue
669
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000670 def do_jump(self, arg):
671 if self.curindex + 1 != len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000672 print("*** You can only jump within the bottom frame", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000673 return
674 try:
675 arg = int(arg)
676 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000677 print("*** The 'jump' command requires a line number.", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000678 else:
679 try:
680 # Do the jump, fix up our copy of the stack, and display the
681 # new position
682 self.curframe.f_lineno = arg
683 self.stack[self.curindex] = self.stack[self.curindex][0], arg
684 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000685 except ValueError as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000686 print('*** Jump failed:', e, file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000687 do_j = do_jump
688
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000689 def do_debug(self, arg):
690 sys.settrace(None)
691 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +0000692 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000693 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000694 p.prompt = "(%s) " % self.prompt.strip()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000695 print("ENTERING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000696 sys.call_tracing(p.run, (arg, globals, locals))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000697 print("LEAVING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000698 sys.settrace(self.trace_dispatch)
699 self.lastcmd = p.lastcmd
700
Tim Peters2344fae2001-01-15 00:50:52 +0000701 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000702 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000703 self.set_quit()
704 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000705
Tim Peters2344fae2001-01-15 00:50:52 +0000706 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000707 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000708
Guido van Rossumeef26072003-01-13 21:13:55 +0000709 def do_EOF(self, arg):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000710 print(file=self.stdout)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000711 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000712 self.set_quit()
713 return 1
714
Tim Peters2344fae2001-01-15 00:50:52 +0000715 def do_args(self, arg):
Benjamin Petersond23f8222009-04-05 19:13:16 +0000716 co = self.curframe.f_code
717 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000718 n = co.co_argcount
719 if co.co_flags & 4: n = n+1
720 if co.co_flags & 8: n = n+1
721 for i in range(n):
722 name = co.co_varnames[i]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000723 print(name, '=', end=' ', file=self.stdout)
724 if name in dict: print(dict[name], file=self.stdout)
725 else: print("*** undefined ***", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000726 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000727
Tim Peters2344fae2001-01-15 00:50:52 +0000728 def do_retval(self, arg):
Benjamin Petersond23f8222009-04-05 19:13:16 +0000729 if '__return__' in self.curframe_locals:
730 print(self.curframe_locals['__return__'], file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000731 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000732 print('*** Not yet returned!', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000733 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000734
Barry Warsaw210bd202002-11-05 22:40:20 +0000735 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000736 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000737 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000738 except:
739 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000740 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000741 exc_type_name = t
742 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000743 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000744 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000745
Barry Warsaw210bd202002-11-05 22:40:20 +0000746 def do_p(self, arg):
747 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000748 print(repr(self._getval(arg)), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000749 except:
750 pass
Georg Brandlc9879242007-09-04 07:07:56 +0000751 # make "print" an alias of "p" since print isn't a Python statement anymore
752 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +0000753
754 def do_pp(self, arg):
755 try:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000756 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000757 except:
758 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000759
Tim Peters2344fae2001-01-15 00:50:52 +0000760 def do_list(self, arg):
761 self.lastcmd = 'list'
762 last = None
763 if arg:
764 try:
765 x = eval(arg, {}, {})
766 if type(x) == type(()):
767 first, last = x
768 first = int(first)
769 last = int(last)
770 if last < first:
771 # Assume it's a count
772 last = first + last
773 else:
774 first = max(1, int(x) - 5)
775 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000776 print('*** Error in argument:', repr(arg), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000777 return
778 elif self.lineno is None:
779 first = max(1, self.curframe.f_lineno - 5)
780 else:
781 first = self.lineno + 1
782 if last is None:
783 last = first + 10
784 filename = self.curframe.f_code.co_filename
785 breaklist = self.get_file_breaks(filename)
786 try:
787 for lineno in range(first, last+1):
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000788 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000789 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000790 print('[EOF]', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000791 break
792 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000793 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000794 if len(s) < 4: s = s + ' '
795 if lineno in breaklist: s = s + 'B'
796 else: s = s + ' '
797 if lineno == self.curframe.f_lineno:
798 s = s + '->'
Guido van Rossumceae3752007-02-09 22:16:54 +0000799 print(s + '\t' + line, end='', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000800 self.lineno = lineno
801 except KeyboardInterrupt:
802 pass
803 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000804
Tim Peters2344fae2001-01-15 00:50:52 +0000805 def do_whatis(self, arg):
806 try:
807 value = eval(arg, self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000808 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000809 except:
810 t, v = sys.exc_info()[:2]
811 if type(t) == type(''):
812 exc_type_name = t
813 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000814 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000815 return
816 code = None
817 # Is it a function?
Neal Norwitz221085d2007-02-25 20:55:47 +0000818 try: code = value.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000819 except: pass
820 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000821 print('Function', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000822 return
823 # Is it an instance method?
Christian Heimesff737952007-11-27 10:40:20 +0000824 try: code = value.__func__.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000825 except: pass
826 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000827 print('Method', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000828 return
829 # None of the above...
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000830 print(type(value), file=self.stdout)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000831
Tim Peters2344fae2001-01-15 00:50:52 +0000832 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000833 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000834 if len(args) == 0:
835 keys = self.aliases.keys()
836 keys.sort()
837 for alias in keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000838 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000839 return
Guido van Rossum08454592002-07-12 13:10:53 +0000840 if args[0] in self.aliases and len(args) == 1:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000841 print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000842 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000843 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000844
Tim Peters2344fae2001-01-15 00:50:52 +0000845 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000846 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000847 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000848 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000849 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000850
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000851 #list of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000852 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
853 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000854
Tim Peters2344fae2001-01-15 00:50:52 +0000855 # Print a traceback starting at the top stack frame.
856 # The most recently entered frame is printed last;
857 # this is different from dbx and gdb, but consistent with
858 # the Python interpreter's stack trace.
859 # It is also consistent with the up/down commands (which are
860 # compatible with dbx and gdb: up moves towards 'main()'
861 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000862
Tim Peters2344fae2001-01-15 00:50:52 +0000863 def print_stack_trace(self):
864 try:
865 for frame_lineno in self.stack:
866 self.print_stack_entry(frame_lineno)
867 except KeyboardInterrupt:
868 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000869
Tim Peters2344fae2001-01-15 00:50:52 +0000870 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
871 frame, lineno = frame_lineno
872 if frame is self.curframe:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000873 print('>', end=' ', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000874 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000875 print(' ', end=' ', file=self.stdout)
876 print(self.format_stack_entry(frame_lineno,
877 prompt_prefix), file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000878
Guido van Rossum921c8241992-01-10 14:54:42 +0000879
Tim Peters2344fae2001-01-15 00:50:52 +0000880 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000881
Tim Peters2344fae2001-01-15 00:50:52 +0000882 def help_help(self):
883 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000884
Tim Peters2344fae2001-01-15 00:50:52 +0000885 def help_h(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000886 print("""h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000887Without argument, print the list of available commands.
888With a command name as argument, print help about that command
889"help pdb" pipes the full documentation file to the $PAGER
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000890"help exec" gives help on the ! command""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000891
Tim Peters2344fae2001-01-15 00:50:52 +0000892 def help_where(self):
893 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894
Tim Peters2344fae2001-01-15 00:50:52 +0000895 def help_w(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000896 print("""w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000897Print a stack trace, with the most recent frame at the bottom.
898An arrow indicates the "current frame", which determines the
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000899context of most commands. 'bt' is an alias for this command.""", file=self.stdout)
Guido van Rossum6bd68352001-01-20 17:57:37 +0000900
901 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902
Tim Peters2344fae2001-01-15 00:50:52 +0000903 def help_down(self):
904 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000905
Tim Peters2344fae2001-01-15 00:50:52 +0000906 def help_d(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000907 print("""d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000908Move the current frame one level down in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000909(to a newer frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910
Tim Peters2344fae2001-01-15 00:50:52 +0000911 def help_up(self):
912 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000913
Tim Peters2344fae2001-01-15 00:50:52 +0000914 def help_u(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000915 print("""u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000916Move the current frame one level up in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000917(to an older frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918
Tim Peters2344fae2001-01-15 00:50:52 +0000919 def help_break(self):
920 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000921
Tim Peters2344fae2001-01-15 00:50:52 +0000922 def help_b(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000923 print("""b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000924With a line number argument, set a break there in the current
925file. With a function name, set a break at first executable line
926of that function. Without argument, list all breaks. If a second
927argument is present, it is a string specifying an expression
928which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929
Tim Peters2344fae2001-01-15 00:50:52 +0000930The line number may be prefixed with a filename and a colon,
931to specify a breakpoint in another file (probably one that
932hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000933the .py suffix may be omitted.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000934
Tim Peters2344fae2001-01-15 00:50:52 +0000935 def help_clear(self):
936 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000937
Tim Peters2344fae2001-01-15 00:50:52 +0000938 def help_cl(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000939 print("cl(ear) filename:lineno", file=self.stdout)
940 print("""cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000941With a space separated list of breakpoint numbers, clear
942those breakpoints. Without argument, clear all breaks (but
943first ask confirmation). With a filename:lineno argument,
Georg Brandld348b252008-01-05 20:00:55 +0000944clear all breaks at that line in that file.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000945
Tim Peters2344fae2001-01-15 00:50:52 +0000946 def help_tbreak(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000947 print("""tbreak same arguments as break, but breakpoint is
948removed when first hit.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000949
Tim Peters2344fae2001-01-15 00:50:52 +0000950 def help_enable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000951 print("""enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000952Enables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000953bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000954
Tim Peters2344fae2001-01-15 00:50:52 +0000955 def help_disable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000956 print("""disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000957Disables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000958bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000959
Tim Peters2344fae2001-01-15 00:50:52 +0000960 def help_ignore(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000961 print("""ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000962Sets the ignore count for the given breakpoint number. A breakpoint
963becomes active when the ignore count is zero. When non-zero, the
964count is decremented each time the breakpoint is reached and the
965breakpoint is not disabled and any associated condition evaluates
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000966to true.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000967
Tim Peters2344fae2001-01-15 00:50:52 +0000968 def help_condition(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000969 print("""condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000970str_condition is a string specifying an expression which
971must evaluate to true before the breakpoint is honored.
972If str_condition is absent, any existing condition is removed;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000973i.e., the breakpoint is made unconditional.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000974
Tim Peters2344fae2001-01-15 00:50:52 +0000975 def help_step(self):
976 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_s(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000979 print("""s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000980Execute the current line, stop at the first possible occasion
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000981(either in a function that is called or in the current function).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000982
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000983 def help_until(self):
984 self.help_unt()
985
986 def help_unt(self):
987 print("""unt(il)
988Continue execution until the line with a number greater than the current
989one is reached or until the current frame returns""")
990
Tim Peters2344fae2001-01-15 00:50:52 +0000991 def help_next(self):
992 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000993
Tim Peters2344fae2001-01-15 00:50:52 +0000994 def help_n(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000995 print("""n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +0000996Continue execution until the next line in the current function
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000997is reached or it returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998
Tim Peters2344fae2001-01-15 00:50:52 +0000999 def help_return(self):
1000 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001
Tim Peters2344fae2001-01-15 00:50:52 +00001002 def help_r(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001003 print("""r(eturn)
1004Continue execution until the current function returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005
Tim Peters2344fae2001-01-15 00:50:52 +00001006 def help_continue(self):
1007 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008
Tim Peters2344fae2001-01-15 00:50:52 +00001009 def help_cont(self):
1010 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001011
Tim Peters2344fae2001-01-15 00:50:52 +00001012 def help_c(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001013 print("""c(ont(inue))
1014Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001016 def help_jump(self):
1017 self.help_j()
1018
1019 def help_j(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001020 print("""j(ump) lineno
1021Set the next line that will be executed.""", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001022
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001023 def help_debug(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001024 print("""debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001025Enter a recursive debugger that steps through the code argument
1026(which is an arbitrary expression or statement to be executed
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001027in the current environment).""", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001028
Tim Peters2344fae2001-01-15 00:50:52 +00001029 def help_list(self):
1030 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001031
Tim Peters2344fae2001-01-15 00:50:52 +00001032 def help_l(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001033 print("""l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001034List source code for the current file.
1035Without arguments, list 11 lines around the current line
1036or continue the previous listing.
1037With one argument, list 11 lines starting at that line.
1038With two arguments, list the given range;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001039if the second argument is less than the first, it is a count.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001040
Tim Peters2344fae2001-01-15 00:50:52 +00001041 def help_args(self):
1042 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001043
Tim Peters2344fae2001-01-15 00:50:52 +00001044 def help_a(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001045 print("""a(rgs)
1046Print the arguments of the current function.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001047
Tim Peters2344fae2001-01-15 00:50:52 +00001048 def help_p(self):
Georg Brandlc9879242007-09-04 07:07:56 +00001049 print("""p(rint) expression
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001050Print the value of the expression.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001051
Barry Warsaw210bd202002-11-05 22:40:20 +00001052 def help_pp(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001053 print("""pp expression
1054Pretty-print the value of the expression.""", file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +00001055
Tim Peters2344fae2001-01-15 00:50:52 +00001056 def help_exec(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001057 print("""(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001058Execute the (one-line) statement in the context of
1059the current stack frame.
1060The exclamation point can be omitted unless the first word
1061of the statement resembles a debugger command.
1062To assign to a global variable you must always prefix the
1063command with a 'global' command, e.g.:
1064(Pdb) global list_options; list_options = ['-l']
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001065(Pdb)""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066
Guido van Rossumd8faa362007-04-27 19:54:29 +00001067 def help_run(self):
1068 print("""run [args...]
1069Restart the debugged python program. If a string is supplied, it is
1070splitted with "shlex" and the result is used as the new sys.argv.
1071History, breakpoints, actions and debugger options are preserved.
1072"restart" is an alias for "run".""")
1073
1074 help_restart = help_run
1075
Tim Peters2344fae2001-01-15 00:50:52 +00001076 def help_quit(self):
1077 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001078
Tim Peters2344fae2001-01-15 00:50:52 +00001079 def help_q(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001080 print("""q(uit) or exit - Quit from the debugger.
1081The program being executed is aborted.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001082
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001083 help_exit = help_q
1084
Tim Peters2344fae2001-01-15 00:50:52 +00001085 def help_whatis(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001086 print("""whatis arg
1087Prints the type of the argument.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088
Tim Peters2344fae2001-01-15 00:50:52 +00001089 def help_EOF(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001090 print("""EOF
1091Handles the receipt of EOF as a command.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001092
Tim Peters2344fae2001-01-15 00:50:52 +00001093 def help_alias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001094 print("""alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001095Creates an alias called 'name' the executes 'command'. The command
1096must *not* be enclosed in quotes. Replaceable parameters are
1097indicated by %1, %2, and so on, while %* is replaced by all the
1098parameters. If no command is given, the current alias for name
1099is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001100
Tim Peters2344fae2001-01-15 00:50:52 +00001101Aliases may be nested and can contain anything that can be
1102legally typed at the pdb prompt. Note! You *can* override
1103internal pdb commands with aliases! Those internal commands
1104are then hidden until the alias is removed. Aliasing is recursively
1105applied to the first word of the command line; all other words
1106in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001107
Tim Peters2344fae2001-01-15 00:50:52 +00001108Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001109
Tim Peters2344fae2001-01-15 00:50:52 +00001110#Print instance variables (usage "pi classInst")
1111alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001112
Tim Peters2344fae2001-01-15 00:50:52 +00001113#Print instance variables in self
1114alias ps pi self
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001115""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001116
Tim Peters2344fae2001-01-15 00:50:52 +00001117 def help_unalias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001118 print("""unalias name
1119Deletes the specified alias.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001120
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001121 def help_commands(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001122 print("""commands [bpnumber]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123(com) ...
1124(com) end
1125(Pdb)
1126
1127Specify a list of commands for breakpoint number bpnumber. The
1128commands themselves appear on the following lines. Type a line
1129containing just 'end' to terminate the commands.
1130
1131To remove all commands from a breakpoint, type commands and
1132follow it immediately with end; that is, give no commands.
1133
1134With no bpnumber argument, commands refers to the last
1135breakpoint set.
1136
1137You can use breakpoint commands to start your program up again.
1138Simply use the continue command, or step, or any other
1139command that resumes execution.
1140
1141Specifying any command resuming execution (currently continue,
1142step, next, return, jump, quit and their abbreviations) terminates
1143the command list (as if that command was immediately followed by end).
1144This is because any time you resume execution
1145(even with a simple next or step), you may encounter
1146another breakpoint--which could have its own command list, leading to
1147ambiguities about which list to execute.
1148
1149 If you use the 'silent' command in the command list, the
1150usual message about stopping at a breakpoint is not printed. This may
1151be desirable for breakpoints that are to print a specific message and
1152then continue. If none of the other commands print anything, you
1153see no sign that the breakpoint was reached.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001154""", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001155
Tim Peters2344fae2001-01-15 00:50:52 +00001156 def help_pdb(self):
1157 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001158
Tim Peters2344fae2001-01-15 00:50:52 +00001159 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001160 """Helper function for break/clear parsing -- may be overridden.
1161
1162 lookupmodule() translates (possibly incomplete) file or module name
1163 into an absolute file name.
1164 """
1165 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001166 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001167 f = os.path.join(sys.path[0], filename)
1168 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1169 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001170 root, ext = os.path.splitext(filename)
1171 if ext == '':
1172 filename = filename + '.py'
1173 if os.path.isabs(filename):
1174 return filename
1175 for dirname in sys.path:
1176 while os.path.islink(dirname):
1177 dirname = os.readlink(dirname)
1178 fullname = os.path.join(dirname, filename)
1179 if os.path.exists(fullname):
1180 return fullname
1181 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001182
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001183 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001184 # The script has to run in __main__ namespace (or imports from
1185 # __main__ will break).
1186 #
1187 # So we clear up the __main__ and set several special variables
1188 # (this gets rid of pdb's globals and cleans old variables on restarts).
1189 import __main__
1190 __main__.__dict__.clear()
1191 __main__.__dict__.update({"__name__" : "__main__",
1192 "__file__" : filename,
1193 "__builtins__": __builtins__,
1194 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001195
1196 # When bdb sets tracing, a number of call and line events happens
1197 # BEFORE debugger even reaches user's code (and the exact sequence of
1198 # events depends on python version). So we take special measures to
1199 # avoid stopping before we reach the main script (see user_line and
1200 # user_call for details).
1201 self._wait_for_mainpyfile = 1
1202 self.mainpyfile = self.canonic(filename)
1203 self._user_requested_quit = 0
Georg Brandl7dd803a2007-09-12 19:44:18 +00001204 with open(filename) as fp:
1205 statement = fp.read()
Guido van Rossumd8faa362007-04-27 19:54:29 +00001206 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001207
Guido van Rossum35771131992-09-08 11:59:04 +00001208# Simplified interface
1209
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001210def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001211 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001212
1213def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001214 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001215
1216def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001217 # B/W compatibility
1218 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001219
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001220def runcall(*args, **kwds):
1221 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001222
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001224 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001225
1226# Post-Mortem interface
1227
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001228def post_mortem(t=None):
1229 # handling the default
1230 if t is None:
1231 # sys.exc_info() returns (type, value, traceback) if an exception is
1232 # being handled, otherwise it returns None
1233 t = sys.exc_info()[2]
1234 if t is None:
1235 raise ValueError("A valid traceback must be passed if no "
1236 "exception is being handled")
1237
Tim Peters2344fae2001-01-15 00:50:52 +00001238 p = Pdb()
1239 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001240 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001241
1242def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001243 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001244
1245
1246# Main program for testing
1247
Guido van Rossum23efba41992-01-27 16:58:47 +00001248TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001249
Guido van Rossum921c8241992-01-10 14:54:42 +00001250def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001251 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001252
1253# print help
1254def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001255 for dirname in sys.path:
1256 fullname = os.path.join(dirname, 'pdb.doc')
1257 if os.path.exists(fullname):
1258 sts = os.system('${PAGER-more} '+fullname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001259 if sts: print('*** Pager exit status:', sts)
Tim Peters2344fae2001-01-15 00:50:52 +00001260 break
1261 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001262 print('Sorry, can\'t find the help file "pdb.doc"', end=' ')
1263 print('along the Python search path')
Guido van Rossumf17361d1996-07-30 16:28:13 +00001264
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001265def main():
Christian Heimesf6cd9672008-03-26 13:45:42 +00001266 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001267 print("usage: pdb.py scriptfile [arg] ...")
Tim Peters2344fae2001-01-15 00:50:52 +00001268 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001269
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001270 mainpyfile = sys.argv[1] # Get script filename
1271 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001272 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001273 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001274
Tim Peters2344fae2001-01-15 00:50:52 +00001275 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001276
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001277 # Replace pdb's dir with script's dir in front of module search path.
1278 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001279
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001280 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1281 # modified by the script being debugged. It's a bad idea when it was
Guido van Rossumd8faa362007-04-27 19:54:29 +00001282 # changed by the user from the command line. There is a "restart" command which
1283 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001284 pdb = Pdb()
1285 while 1:
1286 try:
1287 pdb._runscript(mainpyfile)
1288 if pdb._user_requested_quit:
1289 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001290 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001291 except Restart:
1292 print("Restarting", mainpyfile, "with arguments:")
1293 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001294 except SystemExit:
1295 # In most cases SystemExit does not warrant a post-mortem session.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001296 print("The program exited via sys.exit(). Exit status: ", end=' ')
1297 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001298 except:
1299 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001300 print("Uncaught exception. Entering post mortem debugging")
1301 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001302 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001303 pdb.interaction(None, t)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001304 print("Post mortem debugger finished. The "+mainpyfile+" will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001305
1306
1307# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001308if __name__ == '__main__':
1309 import pdb
1310 pdb.main()