blob: 43520d6b01d6d702fc7dbafa7ce9691511c3abb0 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
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
Georg Brandl243ad662009-05-05 09:00:19 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
62 bdb.Bdb.__init__(self, skip=skip)
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):
Georg Brandl3078df02009-05-05 09:11:31 +0000161 """Call every command that was set for the current active breakpoint
162 (if there is one).
163
164 Returns True if the normal interaction function must be called,
165 False otherwise."""
166 # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
167 if getattr(self, "currentbp", False) and \
168 self.currentbp in self.commands:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000169 currentbp = self.currentbp
170 self.currentbp = 0
171 lastcmd_back = self.lastcmd
172 self.setup(frame, None)
173 for line in self.commands[currentbp]:
174 self.onecmd(line)
175 self.lastcmd = lastcmd_back
176 if not self.commands_silent[currentbp]:
177 self.print_stack_entry(self.stack[self.curindex])
178 if self.commands_doprompt[currentbp]:
179 self.cmdloop()
180 self.forget()
181 return
182 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000183
Tim Peters2344fae2001-01-15 00:50:52 +0000184 def user_return(self, frame, return_value):
185 """This function is called when a return trap is set here."""
186 frame.f_locals['__return__'] = return_value
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000187 print('--Return--', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000188 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000189
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000190 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000191 """This function is called if an exception occurs,
192 but only if we are to stop at or just below this level."""
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000193 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000194 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum1bc535d2007-05-15 18:46:22 +0000195 exc_type_name = exc_type.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000196 print(exc_type_name + ':', _saferepr(exc_value), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000197 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000198
Tim Peters2344fae2001-01-15 00:50:52 +0000199 # General interaction function
200
201 def interaction(self, frame, traceback):
202 self.setup(frame, traceback)
203 self.print_stack_entry(self.stack[self.curindex])
204 self.cmdloop()
205 self.forget()
206
Benjamin Petersond23f8222009-04-05 19:13:16 +0000207 def displayhook(self, obj):
208 """Custom displayhook for the exec in default(), which prevents
209 assignment of the _ variable in the builtins.
210 """
Georg Brandl9fa2e022009-09-16 16:40:45 +0000211 # reproduce the behavior of the standard displayhook, not printing None
212 if obj is not None:
213 print(repr(obj))
Benjamin Petersond23f8222009-04-05 19:13:16 +0000214
Tim Peters2344fae2001-01-15 00:50:52 +0000215 def default(self, line):
216 if line[:1] == '!': line = line[1:]
Benjamin Petersond23f8222009-04-05 19:13:16 +0000217 locals = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000218 globals = self.curframe.f_globals
219 try:
220 code = compile(line + '\n', '<stdin>', 'single')
Christian Heimes679db4a2008-01-18 09:56:22 +0000221 save_stdout = sys.stdout
222 save_stdin = sys.stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000223 save_displayhook = sys.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000224 try:
225 sys.stdin = self.stdin
226 sys.stdout = self.stdout
Benjamin Petersond23f8222009-04-05 19:13:16 +0000227 sys.displayhook = self.displayhook
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000228 exec(code, globals, locals)
229 finally:
230 sys.stdout = save_stdout
231 sys.stdin = save_stdin
Benjamin Petersond23f8222009-04-05 19:13:16 +0000232 sys.displayhook = save_displayhook
Tim Peters2344fae2001-01-15 00:50:52 +0000233 except:
234 t, v = sys.exc_info()[:2]
235 if type(t) == type(''):
236 exc_type_name = t
237 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000238 print('***', exc_type_name + ':', v, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000239
240 def precmd(self, line):
241 """Handle alias expansion and ';;' separator."""
Guido van Rossum08454592002-07-12 13:10:53 +0000242 if not line.strip():
Tim Peters2344fae2001-01-15 00:50:52 +0000243 return line
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000244 args = line.split()
Raymond Hettinger54f02222002-06-01 14:18:47 +0000245 while args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000246 line = self.aliases[args[0]]
247 ii = 1
248 for tmpArg in args[1:]:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000249 line = line.replace("%" + str(ii),
Tim Peters2344fae2001-01-15 00:50:52 +0000250 tmpArg)
251 ii = ii + 1
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000252 line = line.replace("%*", ' '.join(args[1:]))
253 args = line.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000254 # split into ';;' separated commands
255 # unless it's an alias command
256 if args[0] != 'alias':
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000257 marker = line.find(';;')
Tim Peters2344fae2001-01-15 00:50:52 +0000258 if marker >= 0:
259 # queue up everything after marker
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000260 next = line[marker+2:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000261 self.cmdqueue.append(next)
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000262 line = line[:marker].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000263 return line
264
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000265 def onecmd(self, line):
266 """Interpret the argument as though it had been typed in response
267 to the prompt.
268
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000269 Checks whether this line is typed at the normal prompt or in
270 a breakpoint command list definition.
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000271 """
272 if not self.commands_defining:
273 return cmd.Cmd.onecmd(self, line)
274 else:
275 return self.handle_command_def(line)
276
277 def handle_command_def(self,line):
278 """ Handles one command line during command list definition. """
279 cmd, arg, line = self.parseline(line)
280 if cmd == 'silent':
281 self.commands_silent[self.commands_bnum] = True
282 return # continue to handle other cmd def in the cmd list
283 elif cmd == 'end':
284 self.cmdqueue = []
285 return 1 # end of cmd list
286 cmdlist = self.commands[self.commands_bnum]
287 if (arg):
288 cmdlist.append(cmd+' '+arg)
289 else:
290 cmdlist.append(cmd)
291 # Determine if we must stop
292 try:
293 func = getattr(self, 'do_' + cmd)
294 except AttributeError:
295 func = self.default
Georg Brandl3078df02009-05-05 09:11:31 +0000296 # one of the resuming commands
297 if func.__name__ in self.commands_resuming:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000298 self.commands_doprompt[self.commands_bnum] = False
299 self.cmdqueue = []
300 return 1
301 return
302
Tim Peters2344fae2001-01-15 00:50:52 +0000303 # Command definitions, called by cmdloop()
304 # The argument is the remaining string on the command line
305 # Return true to exit from the command loop
306
307 do_h = cmd.Cmd.do_help
308
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000309 def do_commands(self, arg):
Georg Brandl3078df02009-05-05 09:11:31 +0000310 """Defines a list of commands associated to a breakpoint.
311
312 Those commands will be executed whenever the breakpoint causes
313 the program to stop execution."""
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000314 if not arg:
315 bnum = len(bdb.Breakpoint.bpbynumber)-1
316 else:
317 try:
318 bnum = int(arg)
319 except:
Georg Brandl3078df02009-05-05 09:11:31 +0000320 print("Usage : commands [bnum]\n ...\n end",
321 file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000322 return
323 self.commands_bnum = bnum
324 self.commands[bnum] = []
325 self.commands_doprompt[bnum] = True
326 self.commands_silent[bnum] = False
327 prompt_back = self.prompt
328 self.prompt = '(com) '
329 self.commands_defining = True
330 self.cmdloop()
331 self.commands_defining = False
332 self.prompt = prompt_back
333
Tim Peters2344fae2001-01-15 00:50:52 +0000334 def do_break(self, arg, temporary = 0):
335 # break [ ([filename:]lineno | function) [, "condition"] ]
336 if not arg:
337 if self.breaks: # There's at least one
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000338 print("Num Type Disp Enb Where", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000339 for bp in bdb.Breakpoint.bpbynumber:
340 if bp:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000341 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000342 return
343 # parse arguments; comma has lowest precedence
344 # and cannot occur in filename
345 filename = None
346 lineno = None
347 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000348 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000349 if comma > 0:
350 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000351 cond = arg[comma+1:].lstrip()
352 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000353 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000354 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000355 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000356 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000357 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000358 f = self.lookupmodule(filename)
359 if not f:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000360 print('*** ', repr(filename), end=' ', file=self.stdout)
361 print('not found from sys.path', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000362 return
363 else:
364 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000365 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000366 try:
367 lineno = int(arg)
Guido van Rossumb940e112007-01-10 16:19:56 +0000368 except ValueError as msg:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000369 print('*** Bad lineno:', arg, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000370 return
371 else:
372 # no colon; can be lineno or function
373 try:
374 lineno = int(arg)
375 except ValueError:
376 try:
377 func = eval(arg,
378 self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000379 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000380 except:
381 func = arg
382 try:
Christian Heimesff737952007-11-27 10:40:20 +0000383 if hasattr(func, '__func__'):
384 func = func.__func__
Neal Norwitz221085d2007-02-25 20:55:47 +0000385 code = func.__code__
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000386 #use co_name to identify the bkpt (function names
387 #could be aliased, but co_name is invariant)
388 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000389 lineno = code.co_firstlineno
390 filename = code.co_filename
391 except:
392 # last thing to try
393 (ok, filename, ln) = self.lineinfo(arg)
394 if not ok:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000395 print('*** The specified object', end=' ', file=self.stdout)
396 print(repr(arg), end=' ', file=self.stdout)
397 print('is not a function', file=self.stdout)
398 print('or was not found along sys.path.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000399 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000400 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000401 lineno = int(ln)
402 if not filename:
403 filename = self.defaultFile()
404 # Check for reasonable breakpoint
405 line = self.checkline(filename, lineno)
406 if line:
407 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000408 err = self.set_break(filename, line, temporary, cond, funcname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000409 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000410 else:
411 bp = self.get_breaks(filename, line)[-1]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000412 print("Breakpoint %d at %s:%d" % (bp.number,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000413 bp.file,
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000414 bp.line), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000415
416 # To be overridden in derived debuggers
417 def defaultFile(self):
418 """Produce a reasonable default."""
419 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000420 if filename == '<string>' and self.mainpyfile:
421 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000422 return filename
423
424 do_b = do_break
425
426 def do_tbreak(self, arg):
427 self.do_break(arg, 1)
428
429 def lineinfo(self, identifier):
430 failed = (None, None, None)
431 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000432 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000433 if len(idstring) == 1:
434 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000435 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000436 elif len(idstring) == 3:
437 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000438 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000439 else:
440 return failed
441 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000442 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000443 # Protection for derived debuggers
444 if parts[0] == 'self':
445 del parts[0]
446 if len(parts) == 0:
447 return failed
448 # Best first guess at file to look at
449 fname = self.defaultFile()
450 if len(parts) == 1:
451 item = parts[0]
452 else:
453 # More than one part.
454 # First is module, second is method/class
455 f = self.lookupmodule(parts[0])
456 if f:
457 fname = f
458 item = parts[1]
459 answer = find_function(item, fname)
460 return answer or failed
461
462 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000463 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000464
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000465 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
466 line or EOF). Warning: testing is not comprehensive.
467 """
Nick Coghlanf088e5e2008-12-14 11:50:48 +0000468 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000469 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000470 print('End of file', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000471 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000472 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000473 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000474 if (not line or (line[0] == '#') or
475 (line[:3] == '"""') or line[:3] == "'''"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000476 print('*** Blank or comment', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000477 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000478 return lineno
479
480 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000481 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000482 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000483 try:
484 i = int(i)
485 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000486 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000487 continue
488
489 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000490 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000491 continue
492
493 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000494 if bp:
495 bp.enable()
496
497 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000498 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000499 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000500 try:
501 i = int(i)
502 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000503 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000504 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000505
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000506 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000507 print('No breakpoint numbered', i, file=self.stdout)
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000508 continue
509
510 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000511 if bp:
512 bp.disable()
513
514 def do_condition(self, arg):
515 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000516 args = arg.split(' ', 1)
Thomas Woutersb2137042007-02-01 18:02:27 +0000517 try:
518 bpnum = int(args[0].strip())
519 except ValueError:
520 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000521 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000522 return
Tim Peters2344fae2001-01-15 00:50:52 +0000523 try:
524 cond = args[1]
525 except:
526 cond = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000527 try:
528 bp = bdb.Breakpoint.bpbynumber[bpnum]
529 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000530 print('Breakpoint index %r is not valid' % args[0],
531 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000532 return
Tim Peters2344fae2001-01-15 00:50:52 +0000533 if bp:
534 bp.cond = cond
535 if not cond:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000536 print('Breakpoint', bpnum, end=' ', file=self.stdout)
537 print('is now unconditional.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000538
539 def do_ignore(self,arg):
540 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000541 args = arg.split()
Thomas Woutersb2137042007-02-01 18:02:27 +0000542 try:
543 bpnum = int(args[0].strip())
544 except ValueError:
545 # something went wrong
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000546 print('Breakpoint index %r is not a number' % args[0], file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000547 return
Tim Peters2344fae2001-01-15 00:50:52 +0000548 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000549 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000550 except:
551 count = 0
Guido van Rossumd8faa362007-04-27 19:54:29 +0000552 try:
553 bp = bdb.Breakpoint.bpbynumber[bpnum]
554 except IndexError:
Neal Norwitz752abd02008-05-13 04:55:24 +0000555 print('Breakpoint index %r is not valid' % args[0],
556 file=self.stdout)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000557 return
Tim Peters2344fae2001-01-15 00:50:52 +0000558 if bp:
559 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000560 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000561 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000562 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000563 reply = reply + '%d crossings' % count
564 else:
565 reply = reply + '1 crossing'
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000566 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000567 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000568 print('Will stop next time breakpoint', end=' ', file=self.stdout)
569 print(bpnum, 'is reached.', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000570
571 def do_clear(self, arg):
572 """Three possibilities, tried in this order:
573 clear -> clear all breaks, ask for confirmation
574 clear file:lineno -> clear all breaks at file:lineno
575 clear bpno bpno ... -> clear breakpoints by number"""
576 if not arg:
577 try:
Guido van Rossumc5b6ab02007-05-27 09:19:52 +0000578 reply = input('Clear all breaks? ')
Tim Peters2344fae2001-01-15 00:50:52 +0000579 except EOFError:
580 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000581 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000582 if reply in ('y', 'yes'):
583 self.clear_all_breaks()
584 return
585 if ':' in arg:
586 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000587 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000588 filename = arg[:i]
589 arg = arg[i+1:]
590 try:
591 lineno = int(arg)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000592 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000593 err = "Invalid line number (%s)" % arg
594 else:
595 err = self.clear_break(filename, lineno)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000596 if err: print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000597 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000598 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000599 for i in numberlist:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000600 try:
601 i = int(i)
602 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000603 print('Breakpoint index %r is not a number' % i, file=self.stdout)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000604 continue
605
Georg Brandl6d2b3462005-08-24 07:36:17 +0000606 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000607 print('No breakpoint numbered', i, file=self.stdout)
Georg Brandl6d2b3462005-08-24 07:36:17 +0000608 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000609 err = self.clear_bpbynumber(i)
610 if err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000611 print('***', err, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000612 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000613 print('Deleted breakpoint', i, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000614 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
615
616 def do_where(self, arg):
617 self.print_stack_trace()
618 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000619 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000620
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000621 def _select_frame(self, number):
622 assert 0 <= number < len(self.stack)
623 self.curindex = number
624 self.curframe = self.stack[self.curindex][0]
625 self.curframe_locals = self.curframe.f_locals
626 self.print_stack_entry(self.stack[self.curindex])
627 self.lineno = None
628
Tim Peters2344fae2001-01-15 00:50:52 +0000629 def do_up(self, arg):
630 if self.curindex == 0:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000631 print('*** Oldest frame', file=self.stdout)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000632 return
633 try:
634 count = int(arg or 1)
635 except ValueError:
636 print('*** Invalid frame count (%s)' % arg, file=self.stdout)
637 return
638 if count < 0:
639 newframe = 0
Tim Peters2344fae2001-01-15 00:50:52 +0000640 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000641 newframe = max(0, self.curindex - count)
642 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000643 do_u = do_up
644
645 def do_down(self, arg):
646 if self.curindex + 1 == len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000647 print('*** Newest frame', file=self.stdout)
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000648 return
649 try:
650 count = int(arg or 1)
651 except ValueError:
652 print('*** Invalid frame count (%s)' % arg, file=self.stdout)
653 return
654 if count < 0:
655 newframe = len(self.stack) - 1
Tim Peters2344fae2001-01-15 00:50:52 +0000656 else:
Georg Brandleb1f4aa2010-06-27 10:37:48 +0000657 newframe = min(len(self.stack) - 1, self.curindex + count)
658 self._select_frame(newframe)
Tim Peters2344fae2001-01-15 00:50:52 +0000659 do_d = do_down
660
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +0000661 def do_until(self, arg):
662 self.set_until(self.curframe)
663 return 1
664 do_unt = do_until
665
Tim Peters2344fae2001-01-15 00:50:52 +0000666 def do_step(self, arg):
667 self.set_step()
668 return 1
669 do_s = do_step
670
671 def do_next(self, arg):
672 self.set_next(self.curframe)
673 return 1
674 do_n = do_next
675
Guido van Rossumd8faa362007-04-27 19:54:29 +0000676 def do_run(self, arg):
Georg Brandl3078df02009-05-05 09:11:31 +0000677 """Restart program by raising an exception to be caught in the main
678 debugger loop. If arguments were given, set them in sys.argv."""
Guido van Rossumd8faa362007-04-27 19:54:29 +0000679 if arg:
680 import shlex
681 argv0 = sys.argv[0:1]
682 sys.argv = shlex.split(arg)
683 sys.argv[:0] = argv0
684 raise Restart
685
686 do_restart = do_run
687
Tim Peters2344fae2001-01-15 00:50:52 +0000688 def do_return(self, arg):
689 self.set_return(self.curframe)
690 return 1
691 do_r = do_return
692
693 def do_continue(self, arg):
694 self.set_continue()
695 return 1
696 do_c = do_cont = do_continue
697
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000698 def do_jump(self, arg):
699 if self.curindex + 1 != len(self.stack):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000700 print("*** You can only jump within the bottom frame", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000701 return
702 try:
703 arg = int(arg)
704 except ValueError:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000705 print("*** The 'jump' command requires a line number.", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000706 else:
707 try:
708 # Do the jump, fix up our copy of the stack, and display the
709 # new position
710 self.curframe.f_lineno = arg
711 self.stack[self.curindex] = self.stack[self.curindex][0], arg
712 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb940e112007-01-10 16:19:56 +0000713 except ValueError as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000714 print('*** Jump failed:', e, file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000715 do_j = do_jump
716
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000717 def do_debug(self, arg):
718 sys.settrace(None)
719 globals = self.curframe.f_globals
Benjamin Petersond23f8222009-04-05 19:13:16 +0000720 locals = self.curframe_locals
Guido van Rossum7736b5b2008-01-15 21:44:53 +0000721 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000722 p.prompt = "(%s) " % self.prompt.strip()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000723 print("ENTERING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000724 sys.call_tracing(p.run, (arg, globals, locals))
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000725 print("LEAVING RECURSIVE DEBUGGER", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000726 sys.settrace(self.trace_dispatch)
727 self.lastcmd = p.lastcmd
728
Tim Peters2344fae2001-01-15 00:50:52 +0000729 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000730 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000731 self.set_quit()
732 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000733
Tim Peters2344fae2001-01-15 00:50:52 +0000734 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000735 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000736
Guido van Rossumeef26072003-01-13 21:13:55 +0000737 def do_EOF(self, arg):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000738 print(file=self.stdout)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000739 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000740 self.set_quit()
741 return 1
742
Tim Peters2344fae2001-01-15 00:50:52 +0000743 def do_args(self, arg):
Benjamin Petersond23f8222009-04-05 19:13:16 +0000744 co = self.curframe.f_code
745 dict = self.curframe_locals
Tim Peters2344fae2001-01-15 00:50:52 +0000746 n = co.co_argcount
747 if co.co_flags & 4: n = n+1
748 if co.co_flags & 8: n = n+1
749 for i in range(n):
750 name = co.co_varnames[i]
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000751 print(name, '=', end=' ', file=self.stdout)
752 if name in dict: print(dict[name], file=self.stdout)
753 else: print("*** undefined ***", file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000754 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000755
Tim Peters2344fae2001-01-15 00:50:52 +0000756 def do_retval(self, arg):
Benjamin Petersond23f8222009-04-05 19:13:16 +0000757 if '__return__' in self.curframe_locals:
758 print(self.curframe_locals['__return__'], file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000759 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000760 print('*** Not yet returned!', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000761 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000762
Barry Warsaw210bd202002-11-05 22:40:20 +0000763 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000764 try:
Benjamin Petersond23f8222009-04-05 19:13:16 +0000765 return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000766 except:
767 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000768 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000769 exc_type_name = t
770 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000771 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000772 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000773
Barry Warsaw210bd202002-11-05 22:40:20 +0000774 def do_p(self, arg):
775 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000776 print(repr(self._getval(arg)), file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000777 except:
778 pass
Georg Brandlc9879242007-09-04 07:07:56 +0000779 # make "print" an alias of "p" since print isn't a Python statement anymore
780 do_print = do_p
Barry Warsaw210bd202002-11-05 22:40:20 +0000781
782 def do_pp(self, arg):
783 try:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000784 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000785 except:
786 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000787
Tim Peters2344fae2001-01-15 00:50:52 +0000788 def do_list(self, arg):
789 self.lastcmd = 'list'
790 last = None
791 if arg:
792 try:
793 x = eval(arg, {}, {})
794 if type(x) == type(()):
795 first, last = x
796 first = int(first)
797 last = int(last)
798 if last < first:
799 # Assume it's a count
800 last = first + last
801 else:
802 first = max(1, int(x) - 5)
803 except:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000804 print('*** Error in argument:', repr(arg), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000805 return
806 elif self.lineno is None:
807 first = max(1, self.curframe.f_lineno - 5)
808 else:
809 first = self.lineno + 1
810 if last is None:
811 last = first + 10
812 filename = self.curframe.f_code.co_filename
813 breaklist = self.get_file_breaks(filename)
814 try:
815 for lineno in range(first, last+1):
Georg Brandl3078df02009-05-05 09:11:31 +0000816 line = linecache.getline(filename, lineno,
817 self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000818 if not line:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000819 print('[EOF]', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000820 break
821 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000822 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000823 if len(s) < 4: s = s + ' '
824 if lineno in breaklist: s = s + 'B'
825 else: s = s + ' '
826 if lineno == self.curframe.f_lineno:
827 s = s + '->'
Guido van Rossumceae3752007-02-09 22:16:54 +0000828 print(s + '\t' + line, end='', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000829 self.lineno = lineno
830 except KeyboardInterrupt:
831 pass
832 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000833
Tim Peters2344fae2001-01-15 00:50:52 +0000834 def do_whatis(self, arg):
835 try:
836 value = eval(arg, self.curframe.f_globals,
Benjamin Petersond23f8222009-04-05 19:13:16 +0000837 self.curframe_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000838 except:
839 t, v = sys.exc_info()[:2]
840 if type(t) == type(''):
841 exc_type_name = t
842 else: exc_type_name = t.__name__
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000843 print('***', exc_type_name + ':', repr(v), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000844 return
845 code = None
846 # Is it a function?
Neal Norwitz221085d2007-02-25 20:55:47 +0000847 try: code = value.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000848 except: pass
849 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000850 print('Function', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000851 return
852 # Is it an instance method?
Christian Heimesff737952007-11-27 10:40:20 +0000853 try: code = value.__func__.__code__
Tim Peters2344fae2001-01-15 00:50:52 +0000854 except: pass
855 if code:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000856 print('Method', code.co_name, file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000857 return
858 # None of the above...
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000859 print(type(value), file=self.stdout)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000860
Tim Peters2344fae2001-01-15 00:50:52 +0000861 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000862 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000863 if len(args) == 0:
Benjamin Petersonbe74a372009-09-11 21:17:13 +0000864 keys = sorted(self.aliases.keys())
Tim Peters2344fae2001-01-15 00:50:52 +0000865 for alias in keys:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000866 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000867 return
Guido van Rossum08454592002-07-12 13:10:53 +0000868 if args[0] in self.aliases and len(args) == 1:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000869 print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000870 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000871 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000872
Tim Peters2344fae2001-01-15 00:50:52 +0000873 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000874 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000875 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000876 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000877 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000878
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000879 #list of all the commands making the program resume execution.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000880 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
881 'do_quit', 'do_jump']
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000882
Tim Peters2344fae2001-01-15 00:50:52 +0000883 # Print a traceback starting at the top stack frame.
884 # The most recently entered frame is printed last;
885 # this is different from dbx and gdb, but consistent with
886 # the Python interpreter's stack trace.
887 # It is also consistent with the up/down commands (which are
888 # compatible with dbx and gdb: up moves towards 'main()'
889 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000890
Tim Peters2344fae2001-01-15 00:50:52 +0000891 def print_stack_trace(self):
892 try:
893 for frame_lineno in self.stack:
894 self.print_stack_entry(frame_lineno)
895 except KeyboardInterrupt:
896 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000897
Tim Peters2344fae2001-01-15 00:50:52 +0000898 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
899 frame, lineno = frame_lineno
900 if frame is self.curframe:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000901 print('>', end=' ', file=self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000902 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000903 print(' ', end=' ', file=self.stdout)
904 print(self.format_stack_entry(frame_lineno,
905 prompt_prefix), file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000906
Guido van Rossum921c8241992-01-10 14:54:42 +0000907
Tim Peters2344fae2001-01-15 00:50:52 +0000908 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000909
Tim Peters2344fae2001-01-15 00:50:52 +0000910 def help_help(self):
911 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912
Tim Peters2344fae2001-01-15 00:50:52 +0000913 def help_h(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000914 print("""h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000915Without argument, print the list of available commands.
916With a command name as argument, print help about that command
917"help pdb" pipes the full documentation file to the $PAGER
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000918"help exec" gives help on the ! command""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000919
Tim Peters2344fae2001-01-15 00:50:52 +0000920 def help_where(self):
921 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000922
Tim Peters2344fae2001-01-15 00:50:52 +0000923 def help_w(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000924 print("""w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000925Print a stack trace, with the most recent frame at the bottom.
926An arrow indicates the "current frame", which determines the
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000927context of most commands. 'bt' is an alias for this command.""", file=self.stdout)
Guido van Rossum6bd68352001-01-20 17:57:37 +0000928
929 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930
Tim Peters2344fae2001-01-15 00:50:52 +0000931 def help_down(self):
932 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000933
Tim Peters2344fae2001-01-15 00:50:52 +0000934 def help_d(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000935 print("""d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000936Move the current frame one level down in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000937(to a newer frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000938
Tim Peters2344fae2001-01-15 00:50:52 +0000939 def help_up(self):
940 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000941
Tim Peters2344fae2001-01-15 00:50:52 +0000942 def help_u(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000943 print("""u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000944Move the current frame one level up in the stack trace
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000945(to an older frame).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946
Tim Peters2344fae2001-01-15 00:50:52 +0000947 def help_break(self):
948 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000949
Tim Peters2344fae2001-01-15 00:50:52 +0000950 def help_b(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000951 print("""b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000952With a line number argument, set a break there in the current
953file. With a function name, set a break at first executable line
954of that function. Without argument, list all breaks. If a second
955argument is present, it is a string specifying an expression
956which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000957
Tim Peters2344fae2001-01-15 00:50:52 +0000958The line number may be prefixed with a filename and a colon,
959to specify a breakpoint in another file (probably one that
960hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000961the .py suffix may be omitted.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000962
Tim Peters2344fae2001-01-15 00:50:52 +0000963 def help_clear(self):
964 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000965
Tim Peters2344fae2001-01-15 00:50:52 +0000966 def help_cl(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000967 print("cl(ear) filename:lineno", file=self.stdout)
968 print("""cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000969With a space separated list of breakpoint numbers, clear
970those breakpoints. Without argument, clear all breaks (but
971first ask confirmation). With a filename:lineno argument,
Georg Brandld348b252008-01-05 20:00:55 +0000972clear all breaks at that line in that file.""", file=self.stdout)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000973
Tim Peters2344fae2001-01-15 00:50:52 +0000974 def help_tbreak(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000975 print("""tbreak same arguments as break, but breakpoint is
976removed when first hit.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_enable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000979 print("""enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000980Enables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000981bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000982
Tim Peters2344fae2001-01-15 00:50:52 +0000983 def help_disable(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000984 print("""disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000985Disables the breakpoints given as a space separated list of
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000986bp numbers.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000987
Tim Peters2344fae2001-01-15 00:50:52 +0000988 def help_ignore(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000989 print("""ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000990Sets the ignore count for the given breakpoint number. A breakpoint
991becomes active when the ignore count is zero. When non-zero, the
992count is decremented each time the breakpoint is reached and the
993breakpoint is not disabled and any associated condition evaluates
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000994to true.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +0000995
Tim Peters2344fae2001-01-15 00:50:52 +0000996 def help_condition(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000997 print("""condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000998str_condition is a string specifying an expression which
999must evaluate to true before the breakpoint is honored.
1000If str_condition is absent, any existing condition is removed;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001001i.e., the breakpoint is made unconditional.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001002
Tim Peters2344fae2001-01-15 00:50:52 +00001003 def help_step(self):
1004 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005
Tim Peters2344fae2001-01-15 00:50:52 +00001006 def help_s(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001007 print("""s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +00001008Execute the current line, stop at the first possible occasion
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001009(either in a function that is called or in the current function).""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010
Alexandre Vassalotti5f8ced22008-05-16 00:03:33 +00001011 def help_until(self):
1012 self.help_unt()
1013
1014 def help_unt(self):
1015 print("""unt(il)
1016Continue execution until the line with a number greater than the current
1017one is reached or until the current frame returns""")
1018
Tim Peters2344fae2001-01-15 00:50:52 +00001019 def help_next(self):
1020 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021
Tim Peters2344fae2001-01-15 00:50:52 +00001022 def help_n(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001023 print("""n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +00001024Continue execution until the next line in the current function
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001025is reached or it returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026
Tim Peters2344fae2001-01-15 00:50:52 +00001027 def help_return(self):
1028 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001029
Tim Peters2344fae2001-01-15 00:50:52 +00001030 def help_r(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001031 print("""r(eturn)
1032Continue execution until the current function returns.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001033
Tim Peters2344fae2001-01-15 00:50:52 +00001034 def help_continue(self):
1035 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001036
Tim Peters2344fae2001-01-15 00:50:52 +00001037 def help_cont(self):
1038 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001039
Tim Peters2344fae2001-01-15 00:50:52 +00001040 def help_c(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001041 print("""c(ont(inue))
1042Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001043
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001044 def help_jump(self):
1045 self.help_j()
1046
1047 def help_j(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001048 print("""j(ump) lineno
1049Set the next line that will be executed.""", file=self.stdout)
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001050
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001051 def help_debug(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001052 print("""debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001053Enter a recursive debugger that steps through the code argument
1054(which is an arbitrary expression or statement to be executed
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001055in the current environment).""", file=self.stdout)
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001056
Tim Peters2344fae2001-01-15 00:50:52 +00001057 def help_list(self):
1058 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001059
Tim Peters2344fae2001-01-15 00:50:52 +00001060 def help_l(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001061 print("""l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001062List source code for the current file.
1063Without arguments, list 11 lines around the current line
1064or continue the previous listing.
1065With one argument, list 11 lines starting at that line.
1066With two arguments, list the given range;
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001067if the second argument is less than the first, it is a count.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001068
Tim Peters2344fae2001-01-15 00:50:52 +00001069 def help_args(self):
1070 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001071
Tim Peters2344fae2001-01-15 00:50:52 +00001072 def help_a(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001073 print("""a(rgs)
1074Print the arguments of the current function.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001075
Tim Peters2344fae2001-01-15 00:50:52 +00001076 def help_p(self):
Georg Brandlc9879242007-09-04 07:07:56 +00001077 print("""p(rint) expression
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001078Print the value of the expression.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001079
Barry Warsaw210bd202002-11-05 22:40:20 +00001080 def help_pp(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001081 print("""pp expression
1082Pretty-print the value of the expression.""", file=self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +00001083
Tim Peters2344fae2001-01-15 00:50:52 +00001084 def help_exec(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001085 print("""(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001086Execute the (one-line) statement in the context of
1087the current stack frame.
1088The exclamation point can be omitted unless the first word
1089of the statement resembles a debugger command.
1090To assign to a global variable you must always prefix the
1091command with a 'global' command, e.g.:
1092(Pdb) global list_options; list_options = ['-l']
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001093(Pdb)""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001094
Guido van Rossumd8faa362007-04-27 19:54:29 +00001095 def help_run(self):
1096 print("""run [args...]
1097Restart the debugged python program. If a string is supplied, it is
1098splitted with "shlex" and the result is used as the new sys.argv.
1099History, breakpoints, actions and debugger options are preserved.
1100"restart" is an alias for "run".""")
1101
1102 help_restart = help_run
1103
Tim Peters2344fae2001-01-15 00:50:52 +00001104 def help_quit(self):
1105 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001106
Tim Peters2344fae2001-01-15 00:50:52 +00001107 def help_q(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001108 print("""q(uit) or exit - Quit from the debugger.
1109The program being executed is aborted.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001110
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001111 help_exit = help_q
1112
Tim Peters2344fae2001-01-15 00:50:52 +00001113 def help_whatis(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001114 print("""whatis arg
1115Prints the type of the argument.""", file=self.stdout)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001116
Tim Peters2344fae2001-01-15 00:50:52 +00001117 def help_EOF(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001118 print("""EOF
1119Handles the receipt of EOF as a command.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001120
Tim Peters2344fae2001-01-15 00:50:52 +00001121 def help_alias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001122 print("""alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001123Creates an alias called 'name' the executes 'command'. The command
1124must *not* be enclosed in quotes. Replaceable parameters are
1125indicated by %1, %2, and so on, while %* is replaced by all the
1126parameters. If no command is given, the current alias for name
1127is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001128
Tim Peters2344fae2001-01-15 00:50:52 +00001129Aliases may be nested and can contain anything that can be
1130legally typed at the pdb prompt. Note! You *can* override
1131internal pdb commands with aliases! Those internal commands
1132are then hidden until the alias is removed. Aliasing is recursively
1133applied to the first word of the command line; all other words
1134in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001135
Tim Peters2344fae2001-01-15 00:50:52 +00001136Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001137
Tim Peters2344fae2001-01-15 00:50:52 +00001138#Print instance variables (usage "pi classInst")
1139alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001140
Tim Peters2344fae2001-01-15 00:50:52 +00001141#Print instance variables in self
1142alias ps pi self
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001143""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001144
Tim Peters2344fae2001-01-15 00:50:52 +00001145 def help_unalias(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001146 print("""unalias name
1147Deletes the specified alias.""", file=self.stdout)
Guido van Rossum2424f851998-09-11 22:50:09 +00001148
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001149 def help_commands(self):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001150 print("""commands [bpnumber]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001151(com) ...
1152(com) end
1153(Pdb)
1154
1155Specify a list of commands for breakpoint number bpnumber. The
1156commands themselves appear on the following lines. Type a line
1157containing just 'end' to terminate the commands.
1158
1159To remove all commands from a breakpoint, type commands and
1160follow it immediately with end; that is, give no commands.
1161
1162With no bpnumber argument, commands refers to the last
1163breakpoint set.
1164
1165You can use breakpoint commands to start your program up again.
1166Simply use the continue command, or step, or any other
1167command that resumes execution.
1168
1169Specifying any command resuming execution (currently continue,
1170step, next, return, jump, quit and their abbreviations) terminates
1171the command list (as if that command was immediately followed by end).
1172This is because any time you resume execution
1173(even with a simple next or step), you may encounter
1174another breakpoint--which could have its own command list, leading to
1175ambiguities about which list to execute.
1176
1177 If you use the 'silent' command in the command list, the
1178usual message about stopping at a breakpoint is not printed. This may
1179be desirable for breakpoints that are to print a specific message and
1180then continue. If none of the other commands print anything, you
1181see no sign that the breakpoint was reached.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001182""", file=self.stdout)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183
Tim Peters2344fae2001-01-15 00:50:52 +00001184 def help_pdb(self):
1185 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001186
Tim Peters2344fae2001-01-15 00:50:52 +00001187 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001188 """Helper function for break/clear parsing -- may be overridden.
1189
1190 lookupmodule() translates (possibly incomplete) file or module name
1191 into an absolute file name.
1192 """
1193 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001194 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001195 f = os.path.join(sys.path[0], filename)
1196 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1197 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001198 root, ext = os.path.splitext(filename)
1199 if ext == '':
1200 filename = filename + '.py'
1201 if os.path.isabs(filename):
1202 return filename
1203 for dirname in sys.path:
1204 while os.path.islink(dirname):
1205 dirname = os.readlink(dirname)
1206 fullname = os.path.join(dirname, filename)
1207 if os.path.exists(fullname):
1208 return fullname
1209 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001210
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001211 def _runscript(self, filename):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001212 # The script has to run in __main__ namespace (or imports from
1213 # __main__ will break).
1214 #
1215 # So we clear up the __main__ and set several special variables
1216 # (this gets rid of pdb's globals and cleans old variables on restarts).
1217 import __main__
1218 __main__.__dict__.clear()
1219 __main__.__dict__.update({"__name__" : "__main__",
1220 "__file__" : filename,
1221 "__builtins__": __builtins__,
1222 })
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001223
1224 # When bdb sets tracing, a number of call and line events happens
1225 # BEFORE debugger even reaches user's code (and the exact sequence of
1226 # events depends on python version). So we take special measures to
1227 # avoid stopping before we reach the main script (see user_line and
1228 # user_call for details).
1229 self._wait_for_mainpyfile = 1
1230 self.mainpyfile = self.canonic(filename)
1231 self._user_requested_quit = 0
Georg Brandld07ac642009-08-13 07:50:57 +00001232 with open(filename, "rb") as fp:
1233 statement = "exec(compile(%r, %r, 'exec'))" % \
1234 (fp.read(), self.mainpyfile)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001235 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001236
Guido van Rossum35771131992-09-08 11:59:04 +00001237# Simplified interface
1238
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001239def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001240 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001241
1242def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001243 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001244
1245def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001246 # B/W compatibility
1247 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001248
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001249def runcall(*args, **kwds):
1250 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001251
Guido van Rossumb6775db1994-08-01 11:34:53 +00001252def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001253 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001254
1255# Post-Mortem interface
1256
Christian Heimesdd15f6c2008-03-16 00:07:10 +00001257def post_mortem(t=None):
1258 # handling the default
1259 if t is None:
1260 # sys.exc_info() returns (type, value, traceback) if an exception is
1261 # being handled, otherwise it returns None
1262 t = sys.exc_info()[2]
1263 if t is None:
1264 raise ValueError("A valid traceback must be passed if no "
1265 "exception is being handled")
1266
Tim Peters2344fae2001-01-15 00:50:52 +00001267 p = Pdb()
1268 p.reset()
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001269 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001270
1271def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001272 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001273
1274
1275# Main program for testing
1276
Guido van Rossum23efba41992-01-27 16:58:47 +00001277TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001278
Guido van Rossum921c8241992-01-10 14:54:42 +00001279def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001280 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001281
1282# print help
1283def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001284 for dirname in sys.path:
1285 fullname = os.path.join(dirname, 'pdb.doc')
1286 if os.path.exists(fullname):
1287 sts = os.system('${PAGER-more} '+fullname)
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001288 if sts: print('*** Pager exit status:', sts)
Tim Peters2344fae2001-01-15 00:50:52 +00001289 break
1290 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001291 print('Sorry, can\'t find the help file "pdb.doc"', end=' ')
1292 print('along the Python search path')
Guido van Rossumf17361d1996-07-30 16:28:13 +00001293
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001294def main():
Christian Heimesf6cd9672008-03-26 13:45:42 +00001295 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001296 print("usage: pdb.py scriptfile [arg] ...")
Tim Peters2344fae2001-01-15 00:50:52 +00001297 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001298
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001299 mainpyfile = sys.argv[1] # Get script filename
1300 if not os.path.exists(mainpyfile):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001301 print('Error:', mainpyfile, 'does not exist')
Tim Peters2344fae2001-01-15 00:50:52 +00001302 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001303
Tim Peters2344fae2001-01-15 00:50:52 +00001304 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001305
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001306 # Replace pdb's dir with script's dir in front of module search path.
1307 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001308
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001309 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1310 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl3078df02009-05-05 09:11:31 +00001311 # changed by the user from the command line. There is a "restart" command
1312 # which allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001313 pdb = Pdb()
1314 while 1:
1315 try:
1316 pdb._runscript(mainpyfile)
1317 if pdb._user_requested_quit:
1318 break
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001319 print("The program finished and will be restarted")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001320 except Restart:
1321 print("Restarting", mainpyfile, "with arguments:")
1322 print("\t" + " ".join(sys.argv[1:]))
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001323 except SystemExit:
1324 # In most cases SystemExit does not warrant a post-mortem session.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001325 print("The program exited via sys.exit(). Exit status: ", end=' ')
1326 print(sys.exc_info()[1])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001327 except:
1328 traceback.print_exc()
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001329 print("Uncaught exception. Entering post mortem debugging")
1330 print("Running 'cont' or 'step' will restart the program")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001331 t = sys.exc_info()[2]
Benjamin Peterson1a6e0d02008-10-25 15:49:17 +00001332 pdb.interaction(None, t)
Georg Brandl3078df02009-05-05 09:11:31 +00001333 print("Post mortem debugger finished. The " + mainpyfile +
1334 " will be restarted")
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001335
1336
1337# When invoked as main program, invoke the debugger on a script
Guido van Rossumd8faa362007-04-27 19:54:29 +00001338if __name__ == '__main__':
1339 import pdb
1340 pdb.main()