blob: 683abb9cb6dc3edab9d1c746773f0c305d0a7bd3 [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
Brett Cannon2ee0e8e2008-05-23 05:03:59 +000011from repr import Repr
Guido van Rossumb5699c71998-07-20 23:13:54 +000012import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000013import re
Barry Warsaw210bd202002-11-05 22:40:20 +000014import pprint
Johannes Gijsbers25b38c82004-10-12 18:12:09 +000015import traceback
Georg Brandl8e84c652007-03-13 21:08:15 +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):
Andrew M. Kuchlinge6728252006-09-05 13:19:18 +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 Brandl19564802006-05-10 17:13:20 +000061 def __init__(self, completekey='tab', stdin=None, stdout=None):
Tim Peters2344fae2001-01-15 00:50:52 +000062 bdb.Bdb.__init__(self)
Georg Brandl19564802006-05-10 17:13:20 +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
Martin v. Löwisbd30f522006-04-17 17:08:37 +000097 self.commands = {} # associates a command list to breakpoint numbers
98 self.commands_doprompt = {} # for each bp num, tells if the prompt must be disp. after execing the cmd list
99 self.commands_silent = {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list
100 self.commands_defining = False # True while in the process of defining a command list
101 self.commands_bnum = None # The breakpoint number for which we are defining a list
102
Tim Peters2344fae2001-01-15 00:50:52 +0000103 def reset(self):
104 bdb.Bdb.reset(self)
105 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000106
Tim Peters2344fae2001-01-15 00:50:52 +0000107 def forget(self):
108 self.lineno = None
109 self.stack = []
110 self.curindex = 0
111 self.curframe = None
Guido van Rossum2424f851998-09-11 22:50:09 +0000112
Tim Peters2344fae2001-01-15 00:50:52 +0000113 def setup(self, f, t):
114 self.forget()
115 self.stack, self.curindex = self.get_stack(f, t)
116 self.curframe = self.stack[self.curindex][0]
117 self.execRcLines()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118
Tim Peters2344fae2001-01-15 00:50:52 +0000119 # Can be executed earlier than 'setup' if desired
120 def execRcLines(self):
121 if self.rcLines:
122 # Make local copy because of recursion
123 rcLines = self.rcLines
124 # executed only once
125 self.rcLines = []
126 for line in rcLines:
127 line = line[:-1]
Guido van Rossum08454592002-07-12 13:10:53 +0000128 if len(line) > 0 and line[0] != '#':
129 self.onecmd(line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000130
Tim Peters280488b2002-08-23 18:19:30 +0000131 # Override Bdb methods
Michael W. Hudsondd32a912002-08-15 14:59:02 +0000132
133 def user_call(self, frame, argument_list):
134 """This method is called when there is the remote possibility
135 that we ever need to stop in this function."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000136 if self._wait_for_mainpyfile:
137 return
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000138 if self.stop_here(frame):
Georg Brandl19564802006-05-10 17:13:20 +0000139 print >>self.stdout, '--Call--'
Michael W. Hudson01eb85c2003-01-31 17:48:29 +0000140 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000141
Tim Peters2344fae2001-01-15 00:50:52 +0000142 def user_line(self, frame):
143 """This function is called when we stop or break at this line."""
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000144 if self._wait_for_mainpyfile:
145 if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
146 or frame.f_lineno<= 0):
147 return
148 self._wait_for_mainpyfile = 0
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000149 if self.bp_commands(frame):
150 self.interaction(frame, None)
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000151
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000152 def bp_commands(self,frame):
153 """ Call every command that was set for the current active breakpoint (if there is one)
154 Returns True if the normal interaction function must be called, False otherwise """
155 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
156 if getattr(self,"currentbp",False) and self.currentbp in self.commands:
157 currentbp = self.currentbp
158 self.currentbp = 0
159 lastcmd_back = self.lastcmd
160 self.setup(frame, None)
161 for line in self.commands[currentbp]:
162 self.onecmd(line)
163 self.lastcmd = lastcmd_back
164 if not self.commands_silent[currentbp]:
165 self.print_stack_entry(self.stack[self.curindex])
166 if self.commands_doprompt[currentbp]:
167 self.cmdloop()
168 self.forget()
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000169 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000170 return 1
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000171
Tim Peters2344fae2001-01-15 00:50:52 +0000172 def user_return(self, frame, return_value):
173 """This function is called when a return trap is set here."""
Georg Brandle64de922010-08-01 22:10:15 +0000174 if self._wait_for_mainpyfile:
175 return
Tim Peters2344fae2001-01-15 00:50:52 +0000176 frame.f_locals['__return__'] = return_value
Georg Brandl19564802006-05-10 17:13:20 +0000177 print >>self.stdout, '--Return--'
Tim Peters2344fae2001-01-15 00:50:52 +0000178 self.interaction(frame, None)
Guido van Rossum2424f851998-09-11 22:50:09 +0000179
Brett Cannonc6a30ec2008-08-01 01:36:47 +0000180 def user_exception(self, frame, exc_info):
Tim Peters2344fae2001-01-15 00:50:52 +0000181 """This function is called if an exception occurs,
182 but only if we are to stop at or just below this level."""
Georg Brandle64de922010-08-01 22:10:15 +0000183 if self._wait_for_mainpyfile:
184 return
185 exc_type, exc_value, exc_traceback = exc_info
Tim Peters2344fae2001-01-15 00:50:52 +0000186 frame.f_locals['__exception__'] = exc_type, exc_value
187 if type(exc_type) == type(''):
188 exc_type_name = exc_type
189 else: exc_type_name = exc_type.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000190 print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters2344fae2001-01-15 00:50:52 +0000191 self.interaction(frame, exc_traceback)
Guido van Rossum2424f851998-09-11 22:50:09 +0000192
Tim Peters2344fae2001-01-15 00:50:52 +0000193 # General interaction function
194
195 def interaction(self, frame, traceback):
196 self.setup(frame, traceback)
197 self.print_stack_entry(self.stack[self.curindex])
198 self.cmdloop()
199 self.forget()
200
Georg Brandl9b08e052009-04-05 21:21:05 +0000201 def displayhook(self, obj):
202 """Custom displayhook for the exec in default(), which prevents
203 assignment of the _ variable in the builtins.
204 """
Georg Brandlf004d9d2009-10-27 15:39:53 +0000205 # reproduce the behavior of the standard displayhook, not printing None
206 if obj is not None:
207 print repr(obj)
Georg Brandl9b08e052009-04-05 21:21:05 +0000208
Tim Peters2344fae2001-01-15 00:50:52 +0000209 def default(self, line):
210 if line[:1] == '!': line = line[1:]
211 locals = self.curframe.f_locals
212 globals = self.curframe.f_globals
213 try:
214 code = compile(line + '\n', '<stdin>', 'single')
Amaury Forgeot d'Arcff0f2672008-01-15 21:25:11 +0000215 save_stdout = sys.stdout
216 save_stdin = sys.stdin
Georg Brandl9b08e052009-04-05 21:21:05 +0000217 save_displayhook = sys.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000218 try:
219 sys.stdin = self.stdin
220 sys.stdout = self.stdout
Georg Brandl9b08e052009-04-05 21:21:05 +0000221 sys.displayhook = self.displayhook
Guido van Rossumcad37242008-01-15 17:59:29 +0000222 exec code in globals, locals
223 finally:
224 sys.stdout = save_stdout
225 sys.stdin = save_stdin
Georg Brandl9b08e052009-04-05 21:21:05 +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__
Georg Brandl19564802006-05-10 17:13:20 +0000232 print >>self.stdout, '***', exc_type_name + ':', v
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
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000259 def onecmd(self, line):
260 """Interpret the argument as though it had been typed in response
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000261 to the prompt.
262
Andrew M. Kuchling9aed98f2006-07-27 12:18:20 +0000263 Checks whether this line is typed at the normal prompt or in
Tim Petersdaea0352006-07-27 15:11:00 +0000264 a breakpoint command list definition.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000265 """
266 if not self.commands_defining:
267 return cmd.Cmd.onecmd(self, line)
268 else:
269 return self.handle_command_def(line)
270
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000271 def handle_command_def(self,line):
Georg Brandle64de922010-08-01 22:10:15 +0000272 """Handles one command line during command list definition."""
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000273 cmd, arg, line = self.parseline(line)
Georg Brandle64de922010-08-01 22:10:15 +0000274 if not cmd:
275 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000276 if cmd == 'silent':
277 self.commands_silent[self.commands_bnum] = True
278 return # continue to handle other cmd def in the cmd list
279 elif cmd == 'end':
280 self.cmdqueue = []
281 return 1 # end of cmd list
282 cmdlist = self.commands[self.commands_bnum]
Georg Brandle64de922010-08-01 22:10:15 +0000283 if arg:
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000284 cmdlist.append(cmd+' '+arg)
285 else:
286 cmdlist.append(cmd)
287 # Determine if we must stop
288 try:
289 func = getattr(self, 'do_' + cmd)
290 except AttributeError:
291 func = self.default
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000292 if func.func_name in self.commands_resuming : # one of the resuming commands.
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000293 self.commands_doprompt[self.commands_bnum] = False
294 self.cmdqueue = []
295 return 1
Martin v. Löwis1a00e182006-04-17 19:18:18 +0000296 return
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000297
Tim Peters2344fae2001-01-15 00:50:52 +0000298 # Command definitions, called by cmdloop()
299 # The argument is the remaining string on the command line
300 # Return true to exit from the command loop
301
302 do_h = cmd.Cmd.do_help
303
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000304 def do_commands(self, arg):
305 """Defines a list of commands associated to a breakpoint
306 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
307 if not arg:
308 bnum = len(bdb.Breakpoint.bpbynumber)-1
309 else:
310 try:
311 bnum = int(arg)
312 except:
Georg Brandl19564802006-05-10 17:13:20 +0000313 print >>self.stdout, "Usage : commands [bnum]\n ...\n end"
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000314 return
315 self.commands_bnum = bnum
316 self.commands[bnum] = []
317 self.commands_doprompt[bnum] = True
318 self.commands_silent[bnum] = False
319 prompt_back = self.prompt
320 self.prompt = '(com) '
321 self.commands_defining = True
Georg Brandle64de922010-08-01 22:10:15 +0000322 try:
323 self.cmdloop()
324 finally:
325 self.commands_defining = False
326 self.prompt = prompt_back
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000327
Tim Peters2344fae2001-01-15 00:50:52 +0000328 def do_break(self, arg, temporary = 0):
329 # break [ ([filename:]lineno | function) [, "condition"] ]
330 if not arg:
331 if self.breaks: # There's at least one
Georg Brandl19564802006-05-10 17:13:20 +0000332 print >>self.stdout, "Num Type Disp Enb Where"
Tim Peters2344fae2001-01-15 00:50:52 +0000333 for bp in bdb.Breakpoint.bpbynumber:
334 if bp:
Georg Brandl19564802006-05-10 17:13:20 +0000335 bp.bpprint(self.stdout)
Tim Peters2344fae2001-01-15 00:50:52 +0000336 return
337 # parse arguments; comma has lowest precedence
338 # and cannot occur in filename
339 filename = None
340 lineno = None
341 cond = None
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000342 comma = arg.find(',')
Tim Peters2344fae2001-01-15 00:50:52 +0000343 if comma > 0:
344 # parse stuff after comma: "condition"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000345 cond = arg[comma+1:].lstrip()
346 arg = arg[:comma].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000347 # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000348 colon = arg.rfind(':')
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000349 funcname = None
Tim Peters2344fae2001-01-15 00:50:52 +0000350 if colon >= 0:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000351 filename = arg[:colon].rstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000352 f = self.lookupmodule(filename)
353 if not f:
Georg Brandl19564802006-05-10 17:13:20 +0000354 print >>self.stdout, '*** ', repr(filename),
355 print >>self.stdout, 'not found from sys.path'
Tim Peters2344fae2001-01-15 00:50:52 +0000356 return
357 else:
358 filename = f
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000359 arg = arg[colon+1:].lstrip()
Tim Peters2344fae2001-01-15 00:50:52 +0000360 try:
361 lineno = int(arg)
362 except ValueError, msg:
Georg Brandl19564802006-05-10 17:13:20 +0000363 print >>self.stdout, '*** Bad lineno:', arg
Tim Peters2344fae2001-01-15 00:50:52 +0000364 return
365 else:
366 # no colon; can be lineno or function
367 try:
368 lineno = int(arg)
369 except ValueError:
370 try:
371 func = eval(arg,
372 self.curframe.f_globals,
373 self.curframe.f_locals)
374 except:
375 func = arg
376 try:
377 if hasattr(func, 'im_func'):
378 func = func.im_func
379 code = func.func_code
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000380 #use co_name to identify the bkpt (function names
381 #could be aliased, but co_name is invariant)
382 funcname = code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000383 lineno = code.co_firstlineno
384 filename = code.co_filename
385 except:
386 # last thing to try
387 (ok, filename, ln) = self.lineinfo(arg)
388 if not ok:
Georg Brandl19564802006-05-10 17:13:20 +0000389 print >>self.stdout, '*** The specified object',
390 print >>self.stdout, repr(arg),
391 print >>self.stdout, 'is not a function'
392 print >>self.stdout, 'or was not found along sys.path.'
Tim Peters2344fae2001-01-15 00:50:52 +0000393 return
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000394 funcname = ok # ok contains a function name
Tim Peters2344fae2001-01-15 00:50:52 +0000395 lineno = int(ln)
396 if not filename:
397 filename = self.defaultFile()
398 # Check for reasonable breakpoint
399 line = self.checkline(filename, lineno)
400 if line:
401 # now set the break point
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000402 err = self.set_break(filename, line, temporary, cond, funcname)
Georg Brandl19564802006-05-10 17:13:20 +0000403 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000404 else:
405 bp = self.get_breaks(filename, line)[-1]
Georg Brandl19564802006-05-10 17:13:20 +0000406 print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
407 bp.file,
408 bp.line)
Tim Peters2344fae2001-01-15 00:50:52 +0000409
410 # To be overridden in derived debuggers
411 def defaultFile(self):
412 """Produce a reasonable default."""
413 filename = self.curframe.f_code.co_filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000414 if filename == '<string>' and self.mainpyfile:
415 filename = self.mainpyfile
Tim Peters2344fae2001-01-15 00:50:52 +0000416 return filename
417
418 do_b = do_break
419
420 def do_tbreak(self, arg):
421 self.do_break(arg, 1)
422
423 def lineinfo(self, identifier):
424 failed = (None, None, None)
425 # Input is identifier, may be in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000426 idstring = identifier.split("'")
Tim Peters2344fae2001-01-15 00:50:52 +0000427 if len(idstring) == 1:
428 # not in single quotes
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000429 id = idstring[0].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000430 elif len(idstring) == 3:
431 # quoted
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000432 id = idstring[1].strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000433 else:
434 return failed
435 if id == '': return failed
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000436 parts = id.split('.')
Tim Peters2344fae2001-01-15 00:50:52 +0000437 # Protection for derived debuggers
438 if parts[0] == 'self':
439 del parts[0]
440 if len(parts) == 0:
441 return failed
442 # Best first guess at file to look at
443 fname = self.defaultFile()
444 if len(parts) == 1:
445 item = parts[0]
446 else:
447 # More than one part.
448 # First is module, second is method/class
449 f = self.lookupmodule(parts[0])
450 if f:
451 fname = f
452 item = parts[1]
453 answer = find_function(item, fname)
454 return answer or failed
455
456 def checkline(self, filename, lineno):
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000457 """Check whether specified line seems to be executable.
Tim Peters2344fae2001-01-15 00:50:52 +0000458
Johannes Gijsbers4a9faa12004-08-30 13:29:44 +0000459 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
460 line or EOF). Warning: testing is not comprehensive.
461 """
Georg Brandle64de922010-08-01 22:10:15 +0000462 # this method should be callable before starting debugging, so default
463 # to "no globals" if there is no current frame
464 globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
465 line = linecache.getline(filename, lineno, globs)
Tim Peters2344fae2001-01-15 00:50:52 +0000466 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000467 print >>self.stdout, 'End of file'
Tim Peters2344fae2001-01-15 00:50:52 +0000468 return 0
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000469 line = line.strip()
Tim Peters2344fae2001-01-15 00:50:52 +0000470 # Don't allow setting breakpoint at a blank line
Guido van Rossum08454592002-07-12 13:10:53 +0000471 if (not line or (line[0] == '#') or
472 (line[:3] == '"""') or line[:3] == "'''"):
Georg Brandl19564802006-05-10 17:13:20 +0000473 print >>self.stdout, '*** Blank or comment'
Tim Peters2344fae2001-01-15 00:50:52 +0000474 return 0
Tim Peters2344fae2001-01-15 00:50:52 +0000475 return lineno
476
477 def do_enable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000478 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000479 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000480 try:
481 i = int(i)
482 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000483 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000484 continue
485
486 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000487 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000488 continue
489
490 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000491 if bp:
492 bp.enable()
493
494 def do_disable(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000495 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000496 for i in args:
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000497 try:
498 i = int(i)
499 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000500 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000501 continue
Tim Petersf545baa2003-06-15 23:26:30 +0000502
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000503 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000504 print >>self.stdout, 'No breakpoint numbered', i
Andrew M. Kuchlingb1f8bab2003-05-22 14:46:12 +0000505 continue
506
507 bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters2344fae2001-01-15 00:50:52 +0000508 if bp:
509 bp.disable()
510
511 def do_condition(self, arg):
512 # arg is breakpoint number and condition
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000513 args = arg.split(' ', 1)
Georg Brandle4980832007-01-22 21:23:41 +0000514 try:
515 bpnum = int(args[0].strip())
516 except ValueError:
517 # something went wrong
518 print >>self.stdout, \
519 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000520 return
Tim Peters2344fae2001-01-15 00:50:52 +0000521 try:
522 cond = args[1]
523 except:
524 cond = None
Collin Winter2faa9e12007-03-11 16:00:20 +0000525 try:
526 bp = bdb.Breakpoint.bpbynumber[bpnum]
527 except IndexError:
528 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
529 return
Tim Peters2344fae2001-01-15 00:50:52 +0000530 if bp:
531 bp.cond = cond
532 if not cond:
Georg Brandl19564802006-05-10 17:13:20 +0000533 print >>self.stdout, 'Breakpoint', bpnum,
534 print >>self.stdout, 'is now unconditional.'
Tim Peters2344fae2001-01-15 00:50:52 +0000535
536 def do_ignore(self,arg):
537 """arg is bp number followed by ignore count."""
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000538 args = arg.split()
Georg Brandle4980832007-01-22 21:23:41 +0000539 try:
540 bpnum = int(args[0].strip())
541 except ValueError:
542 # something went wrong
543 print >>self.stdout, \
544 'Breakpoint index %r is not a number' % args[0]
Georg Brandlb2783182007-03-11 08:28:46 +0000545 return
Tim Peters2344fae2001-01-15 00:50:52 +0000546 try:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000547 count = int(args[1].strip())
Tim Peters2344fae2001-01-15 00:50:52 +0000548 except:
549 count = 0
Collin Winter2faa9e12007-03-11 16:00:20 +0000550 try:
551 bp = bdb.Breakpoint.bpbynumber[bpnum]
552 except IndexError:
553 print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
554 return
Tim Peters2344fae2001-01-15 00:50:52 +0000555 if bp:
556 bp.ignore = count
Guido van Rossum08454592002-07-12 13:10:53 +0000557 if count > 0:
Tim Peters2344fae2001-01-15 00:50:52 +0000558 reply = 'Will ignore next '
Guido van Rossum08454592002-07-12 13:10:53 +0000559 if count > 1:
Tim Peters2344fae2001-01-15 00:50:52 +0000560 reply = reply + '%d crossings' % count
561 else:
562 reply = reply + '1 crossing'
Georg Brandl19564802006-05-10 17:13:20 +0000563 print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters2344fae2001-01-15 00:50:52 +0000564 else:
Georg Brandl19564802006-05-10 17:13:20 +0000565 print >>self.stdout, 'Will stop next time breakpoint',
566 print >>self.stdout, bpnum, 'is reached.'
Tim Peters2344fae2001-01-15 00:50:52 +0000567
568 def do_clear(self, arg):
569 """Three possibilities, tried in this order:
570 clear -> clear all breaks, ask for confirmation
571 clear file:lineno -> clear all breaks at file:lineno
572 clear bpno bpno ... -> clear breakpoints by number"""
573 if not arg:
574 try:
575 reply = raw_input('Clear all breaks? ')
576 except EOFError:
577 reply = 'no'
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000578 reply = reply.strip().lower()
Tim Peters2344fae2001-01-15 00:50:52 +0000579 if reply in ('y', 'yes'):
580 self.clear_all_breaks()
581 return
582 if ':' in arg:
583 # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000584 i = arg.rfind(':')
Tim Peters2344fae2001-01-15 00:50:52 +0000585 filename = arg[:i]
586 arg = arg[i+1:]
587 try:
588 lineno = int(arg)
Georg Brandl23d9d452006-05-03 18:12:33 +0000589 except ValueError:
Tim Peters2344fae2001-01-15 00:50:52 +0000590 err = "Invalid line number (%s)" % arg
591 else:
592 err = self.clear_break(filename, lineno)
Georg Brandl19564802006-05-10 17:13:20 +0000593 if err: print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000594 return
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000595 numberlist = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000596 for i in numberlist:
Georg Brandl23d9d452006-05-03 18:12:33 +0000597 try:
598 i = int(i)
599 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000600 print >>self.stdout, 'Breakpoint index %r is not a number' % i
Georg Brandl23d9d452006-05-03 18:12:33 +0000601 continue
602
Georg Brandl6d2b3462005-08-24 07:36:17 +0000603 if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
Georg Brandl19564802006-05-10 17:13:20 +0000604 print >>self.stdout, 'No breakpoint numbered', i
Georg Brandl6d2b3462005-08-24 07:36:17 +0000605 continue
Tim Peters2344fae2001-01-15 00:50:52 +0000606 err = self.clear_bpbynumber(i)
607 if err:
Georg Brandl19564802006-05-10 17:13:20 +0000608 print >>self.stdout, '***', err
Tim Peters2344fae2001-01-15 00:50:52 +0000609 else:
Georg Brandl19564802006-05-10 17:13:20 +0000610 print >>self.stdout, 'Deleted breakpoint', i
Tim Peters2344fae2001-01-15 00:50:52 +0000611 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
612
613 def do_where(self, arg):
614 self.print_stack_trace()
615 do_w = do_where
Guido van Rossum6bd68352001-01-20 17:57:37 +0000616 do_bt = do_where
Tim Peters2344fae2001-01-15 00:50:52 +0000617
618 def do_up(self, arg):
619 if self.curindex == 0:
Georg Brandl19564802006-05-10 17:13:20 +0000620 print >>self.stdout, '*** Oldest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000621 else:
622 self.curindex = self.curindex - 1
623 self.curframe = self.stack[self.curindex][0]
624 self.print_stack_entry(self.stack[self.curindex])
625 self.lineno = None
626 do_u = do_up
627
628 def do_down(self, arg):
629 if self.curindex + 1 == len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000630 print >>self.stdout, '*** Newest frame'
Tim Peters2344fae2001-01-15 00:50:52 +0000631 else:
632 self.curindex = self.curindex + 1
633 self.curframe = self.stack[self.curindex][0]
634 self.print_stack_entry(self.stack[self.curindex])
635 self.lineno = None
636 do_d = do_down
637
Benjamin Peterson98353942008-05-11 14:13:25 +0000638 def do_until(self, arg):
639 self.set_until(self.curframe)
640 return 1
641 do_unt = do_until
642
Tim Peters2344fae2001-01-15 00:50:52 +0000643 def do_step(self, arg):
644 self.set_step()
645 return 1
646 do_s = do_step
647
648 def do_next(self, arg):
649 self.set_next(self.curframe)
650 return 1
651 do_n = do_next
652
Georg Brandl8e84c652007-03-13 21:08:15 +0000653 def do_run(self, arg):
654 """Restart program by raising an exception to be caught in the main debugger
655 loop. If arguments were given, set them in sys.argv."""
656 if arg:
657 import shlex
658 argv0 = sys.argv[0:1]
659 sys.argv = shlex.split(arg)
660 sys.argv[:0] = argv0
661 raise Restart
662
663 do_restart = do_run
664
Tim Peters2344fae2001-01-15 00:50:52 +0000665 def do_return(self, arg):
666 self.set_return(self.curframe)
667 return 1
668 do_r = do_return
669
670 def do_continue(self, arg):
671 self.set_continue()
672 return 1
673 do_c = do_cont = do_continue
674
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000675 def do_jump(self, arg):
676 if self.curindex + 1 != len(self.stack):
Georg Brandl19564802006-05-10 17:13:20 +0000677 print >>self.stdout, "*** You can only jump within the bottom frame"
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000678 return
679 try:
680 arg = int(arg)
681 except ValueError:
Georg Brandl19564802006-05-10 17:13:20 +0000682 print >>self.stdout, "*** The 'jump' command requires a line number."
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000683 else:
684 try:
685 # Do the jump, fix up our copy of the stack, and display the
686 # new position
687 self.curframe.f_lineno = arg
688 self.stack[self.curindex] = self.stack[self.curindex][0], arg
689 self.print_stack_entry(self.stack[self.curindex])
690 except ValueError, e:
Georg Brandl19564802006-05-10 17:13:20 +0000691 print >>self.stdout, '*** Jump failed:', e
Michael W. Hudsoncfd38842002-12-17 16:15:34 +0000692 do_j = do_jump
693
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000694 def do_debug(self, arg):
695 sys.settrace(None)
696 globals = self.curframe.f_globals
697 locals = self.curframe.f_locals
Guido van Rossumcad37242008-01-15 17:59:29 +0000698 p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossumed538d82003-04-09 19:36:34 +0000699 p.prompt = "(%s) " % self.prompt.strip()
Georg Brandl19564802006-05-10 17:13:20 +0000700 print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossumed538d82003-04-09 19:36:34 +0000701 sys.call_tracing(p.run, (arg, globals, locals))
Georg Brandl19564802006-05-10 17:13:20 +0000702 print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
Guido van Rossuma12fe4e2003-04-09 19:06:21 +0000703 sys.settrace(self.trace_dispatch)
704 self.lastcmd = p.lastcmd
705
Tim Peters2344fae2001-01-15 00:50:52 +0000706 def do_quit(self, arg):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000707 self._user_requested_quit = 1
Tim Peters2344fae2001-01-15 00:50:52 +0000708 self.set_quit()
709 return 1
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000710
Tim Peters2344fae2001-01-15 00:50:52 +0000711 do_q = do_quit
Guido van Rossumd1c08f32002-04-15 00:48:24 +0000712 do_exit = do_quit
Tim Peters2344fae2001-01-15 00:50:52 +0000713
Guido van Rossumeef26072003-01-13 21:13:55 +0000714 def do_EOF(self, arg):
Georg Brandl19564802006-05-10 17:13:20 +0000715 print >>self.stdout
Johannes Gijsbers25b38c82004-10-12 18:12:09 +0000716 self._user_requested_quit = 1
Guido van Rossumeef26072003-01-13 21:13:55 +0000717 self.set_quit()
718 return 1
719
Tim Peters2344fae2001-01-15 00:50:52 +0000720 def do_args(self, arg):
721 f = self.curframe
722 co = f.f_code
723 dict = f.f_locals
724 n = co.co_argcount
725 if co.co_flags & 4: n = n+1
726 if co.co_flags & 8: n = n+1
727 for i in range(n):
728 name = co.co_varnames[i]
Georg Brandl19564802006-05-10 17:13:20 +0000729 print >>self.stdout, name, '=',
730 if name in dict: print >>self.stdout, dict[name]
731 else: print >>self.stdout, "*** undefined ***"
Tim Peters2344fae2001-01-15 00:50:52 +0000732 do_a = do_args
Guido van Rossum2424f851998-09-11 22:50:09 +0000733
Tim Peters2344fae2001-01-15 00:50:52 +0000734 def do_retval(self, arg):
Raymond Hettinger54f02222002-06-01 14:18:47 +0000735 if '__return__' in self.curframe.f_locals:
Georg Brandl19564802006-05-10 17:13:20 +0000736 print >>self.stdout, self.curframe.f_locals['__return__']
Tim Peters2344fae2001-01-15 00:50:52 +0000737 else:
Georg Brandl19564802006-05-10 17:13:20 +0000738 print >>self.stdout, '*** Not yet returned!'
Tim Peters2344fae2001-01-15 00:50:52 +0000739 do_rv = do_retval
Guido van Rossum2424f851998-09-11 22:50:09 +0000740
Barry Warsaw210bd202002-11-05 22:40:20 +0000741 def _getval(self, arg):
Tim Peters2344fae2001-01-15 00:50:52 +0000742 try:
Barry Warsaw210bd202002-11-05 22:40:20 +0000743 return eval(arg, self.curframe.f_globals,
744 self.curframe.f_locals)
Tim Peters2344fae2001-01-15 00:50:52 +0000745 except:
746 t, v = sys.exc_info()[:2]
Barry Warsaw210bd202002-11-05 22:40:20 +0000747 if isinstance(t, str):
Tim Peters2344fae2001-01-15 00:50:52 +0000748 exc_type_name = t
749 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000750 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Barry Warsaw210bd202002-11-05 22:40:20 +0000751 raise
Guido van Rossum2424f851998-09-11 22:50:09 +0000752
Barry Warsaw210bd202002-11-05 22:40:20 +0000753 def do_p(self, arg):
754 try:
Georg Brandl19564802006-05-10 17:13:20 +0000755 print >>self.stdout, repr(self._getval(arg))
Barry Warsaw210bd202002-11-05 22:40:20 +0000756 except:
757 pass
758
759 def do_pp(self, arg):
760 try:
Georg Brandl19564802006-05-10 17:13:20 +0000761 pprint.pprint(self._getval(arg), self.stdout)
Barry Warsaw210bd202002-11-05 22:40:20 +0000762 except:
763 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000764
Tim Peters2344fae2001-01-15 00:50:52 +0000765 def do_list(self, arg):
766 self.lastcmd = 'list'
767 last = None
768 if arg:
769 try:
770 x = eval(arg, {}, {})
771 if type(x) == type(()):
772 first, last = x
773 first = int(first)
774 last = int(last)
775 if last < first:
776 # Assume it's a count
777 last = first + last
778 else:
779 first = max(1, int(x) - 5)
780 except:
Georg Brandl19564802006-05-10 17:13:20 +0000781 print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters2344fae2001-01-15 00:50:52 +0000782 return
783 elif self.lineno is None:
784 first = max(1, self.curframe.f_lineno - 5)
785 else:
786 first = self.lineno + 1
787 if last is None:
788 last = first + 10
789 filename = self.curframe.f_code.co_filename
790 breaklist = self.get_file_breaks(filename)
791 try:
792 for lineno in range(first, last+1):
Nick Coghlan30327242008-12-14 11:30:16 +0000793 line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters2344fae2001-01-15 00:50:52 +0000794 if not line:
Georg Brandl19564802006-05-10 17:13:20 +0000795 print >>self.stdout, '[EOF]'
Tim Peters2344fae2001-01-15 00:50:52 +0000796 break
797 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000798 s = repr(lineno).rjust(3)
Tim Peters2344fae2001-01-15 00:50:52 +0000799 if len(s) < 4: s = s + ' '
800 if lineno in breaklist: s = s + 'B'
801 else: s = s + ' '
802 if lineno == self.curframe.f_lineno:
803 s = s + '->'
Georg Brandl19564802006-05-10 17:13:20 +0000804 print >>self.stdout, s + '\t' + line,
Tim Peters2344fae2001-01-15 00:50:52 +0000805 self.lineno = lineno
806 except KeyboardInterrupt:
807 pass
808 do_l = do_list
Guido van Rossum2424f851998-09-11 22:50:09 +0000809
Tim Peters2344fae2001-01-15 00:50:52 +0000810 def do_whatis(self, arg):
811 try:
812 value = eval(arg, self.curframe.f_globals,
813 self.curframe.f_locals)
814 except:
815 t, v = sys.exc_info()[:2]
816 if type(t) == type(''):
817 exc_type_name = t
818 else: exc_type_name = t.__name__
Georg Brandl19564802006-05-10 17:13:20 +0000819 print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters2344fae2001-01-15 00:50:52 +0000820 return
821 code = None
822 # Is it a function?
823 try: code = value.func_code
824 except: pass
825 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000826 print >>self.stdout, 'Function', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000827 return
828 # Is it an instance method?
829 try: code = value.im_func.func_code
830 except: pass
831 if code:
Georg Brandl19564802006-05-10 17:13:20 +0000832 print >>self.stdout, 'Method', code.co_name
Tim Peters2344fae2001-01-15 00:50:52 +0000833 return
834 # None of the above...
Georg Brandl19564802006-05-10 17:13:20 +0000835 print >>self.stdout, type(value)
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000836
Tim Peters2344fae2001-01-15 00:50:52 +0000837 def do_alias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000838 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000839 if len(args) == 0:
840 keys = self.aliases.keys()
841 keys.sort()
842 for alias in keys:
Georg Brandl19564802006-05-10 17:13:20 +0000843 print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters2344fae2001-01-15 00:50:52 +0000844 return
Guido van Rossum08454592002-07-12 13:10:53 +0000845 if args[0] in self.aliases and len(args) == 1:
Georg Brandl19564802006-05-10 17:13:20 +0000846 print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters2344fae2001-01-15 00:50:52 +0000847 else:
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000848 self.aliases[args[0]] = ' '.join(args[1:])
Guido van Rossum23efba41992-01-27 16:58:47 +0000849
Tim Peters2344fae2001-01-15 00:50:52 +0000850 def do_unalias(self, arg):
Eric S. Raymond9b93c5f2001-02-09 07:58:53 +0000851 args = arg.split()
Tim Peters2344fae2001-01-15 00:50:52 +0000852 if len(args) == 0: return
Raymond Hettinger54f02222002-06-01 14:18:47 +0000853 if args[0] in self.aliases:
Tim Peters2344fae2001-01-15 00:50:52 +0000854 del self.aliases[args[0]]
Guido van Rossum00230781993-03-29 11:39:45 +0000855
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000856 #list of all the commands making the program resume execution.
Georg Brandl19564802006-05-10 17:13:20 +0000857 commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
858 'do_quit', 'do_jump']
Martin v. Löwisbd30f522006-04-17 17:08:37 +0000859
Tim Peters2344fae2001-01-15 00:50:52 +0000860 # Print a traceback starting at the top stack frame.
861 # The most recently entered frame is printed last;
862 # this is different from dbx and gdb, but consistent with
863 # the Python interpreter's stack trace.
864 # It is also consistent with the up/down commands (which are
865 # compatible with dbx and gdb: up moves towards 'main()'
866 # and down moves towards the most recent stack frame).
Guido van Rossum2424f851998-09-11 22:50:09 +0000867
Tim Peters2344fae2001-01-15 00:50:52 +0000868 def print_stack_trace(self):
869 try:
870 for frame_lineno in self.stack:
871 self.print_stack_entry(frame_lineno)
872 except KeyboardInterrupt:
873 pass
Guido van Rossum2424f851998-09-11 22:50:09 +0000874
Tim Peters2344fae2001-01-15 00:50:52 +0000875 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
876 frame, lineno = frame_lineno
877 if frame is self.curframe:
Georg Brandl19564802006-05-10 17:13:20 +0000878 print >>self.stdout, '>',
Tim Peters2344fae2001-01-15 00:50:52 +0000879 else:
Georg Brandl19564802006-05-10 17:13:20 +0000880 print >>self.stdout, ' ',
881 print >>self.stdout, self.format_stack_entry(frame_lineno,
882 prompt_prefix)
Guido van Rossum2424f851998-09-11 22:50:09 +0000883
Guido van Rossum921c8241992-01-10 14:54:42 +0000884
Tim Peters2344fae2001-01-15 00:50:52 +0000885 # Help methods (derived from pdb.doc)
Guido van Rossum921c8241992-01-10 14:54:42 +0000886
Tim Peters2344fae2001-01-15 00:50:52 +0000887 def help_help(self):
888 self.help_h()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000889
Tim Peters2344fae2001-01-15 00:50:52 +0000890 def help_h(self):
Georg Brandl19564802006-05-10 17:13:20 +0000891 print >>self.stdout, """h(elp)
Tim Peters2344fae2001-01-15 00:50:52 +0000892Without argument, print the list of available commands.
893With a command name as argument, print help about that command
894"help pdb" pipes the full documentation file to the $PAGER
895"help exec" gives help on the ! command"""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000896
Tim Peters2344fae2001-01-15 00:50:52 +0000897 def help_where(self):
898 self.help_w()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000899
Tim Peters2344fae2001-01-15 00:50:52 +0000900 def help_w(self):
Georg Brandl19564802006-05-10 17:13:20 +0000901 print >>self.stdout, """w(here)
Tim Peters2344fae2001-01-15 00:50:52 +0000902Print a stack trace, with the most recent frame at the bottom.
903An arrow indicates the "current frame", which determines the
Guido van Rossum6bd68352001-01-20 17:57:37 +0000904context of most commands. 'bt' is an alias for this command."""
905
906 help_bt = help_w
Guido van Rossumb6775db1994-08-01 11:34:53 +0000907
Tim Peters2344fae2001-01-15 00:50:52 +0000908 def help_down(self):
909 self.help_d()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910
Tim Peters2344fae2001-01-15 00:50:52 +0000911 def help_d(self):
Georg Brandl19564802006-05-10 17:13:20 +0000912 print >>self.stdout, """d(own)
Tim Peters2344fae2001-01-15 00:50:52 +0000913Move the current frame one level down in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000914(to a newer frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000915
Tim Peters2344fae2001-01-15 00:50:52 +0000916 def help_up(self):
917 self.help_u()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918
Tim Peters2344fae2001-01-15 00:50:52 +0000919 def help_u(self):
Georg Brandl19564802006-05-10 17:13:20 +0000920 print >>self.stdout, """u(p)
Tim Peters2344fae2001-01-15 00:50:52 +0000921Move the current frame one level up in the stack trace
Johannes Gijsbers34c41202004-08-14 15:19:28 +0000922(to an older frame)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000923
Tim Peters2344fae2001-01-15 00:50:52 +0000924 def help_break(self):
925 self.help_b()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000926
Tim Peters2344fae2001-01-15 00:50:52 +0000927 def help_b(self):
Georg Brandl19564802006-05-10 17:13:20 +0000928 print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters2344fae2001-01-15 00:50:52 +0000929With a line number argument, set a break there in the current
930file. With a function name, set a break at first executable line
931of that function. Without argument, list all breaks. If a second
932argument is present, it is a string specifying an expression
933which must evaluate to true before the breakpoint is honored.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000934
Tim Peters2344fae2001-01-15 00:50:52 +0000935The line number may be prefixed with a filename and a colon,
936to specify a breakpoint in another file (probably one that
937hasn't been loaded yet). The file is searched for on sys.path;
938the .py suffix may be omitted."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000939
Tim Peters2344fae2001-01-15 00:50:52 +0000940 def help_clear(self):
941 self.help_cl()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000942
Tim Peters2344fae2001-01-15 00:50:52 +0000943 def help_cl(self):
Georg Brandl19564802006-05-10 17:13:20 +0000944 print >>self.stdout, "cl(ear) filename:lineno"
945 print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters2344fae2001-01-15 00:50:52 +0000946With a space separated list of breakpoint numbers, clear
947those breakpoints. Without argument, clear all breaks (but
948first ask confirmation). With a filename:lineno argument,
949clear all breaks at that line in that file.
Guido van Rossumb6775db1994-08-01 11:34:53 +0000950
Tim Peters2344fae2001-01-15 00:50:52 +0000951Note that the argument is different from previous versions of
952the debugger (in python distributions 1.5.1 and before) where
953a linenumber was used instead of either filename:lineno or
954breakpoint numbers."""
Guido van Rossumb5699c71998-07-20 23:13:54 +0000955
Tim Peters2344fae2001-01-15 00:50:52 +0000956 def help_tbreak(self):
Georg Brandl19564802006-05-10 17:13:20 +0000957 print >>self.stdout, """tbreak same arguments as break, but breakpoint is
Tim Peters2344fae2001-01-15 00:50:52 +0000958removed when first hit."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000959
Tim Peters2344fae2001-01-15 00:50:52 +0000960 def help_enable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000961 print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000962Enables the breakpoints given as a space separated list of
963bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000964
Tim Peters2344fae2001-01-15 00:50:52 +0000965 def help_disable(self):
Georg Brandl19564802006-05-10 17:13:20 +0000966 print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters2344fae2001-01-15 00:50:52 +0000967Disables the breakpoints given as a space separated list of
968bp numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000969
Tim Peters2344fae2001-01-15 00:50:52 +0000970 def help_ignore(self):
Georg Brandl19564802006-05-10 17:13:20 +0000971 print >>self.stdout, """ignore bpnumber count
Tim Peters2344fae2001-01-15 00:50:52 +0000972Sets the ignore count for the given breakpoint number. A breakpoint
973becomes active when the ignore count is zero. When non-zero, the
974count is decremented each time the breakpoint is reached and the
975breakpoint is not disabled and any associated condition evaluates
976to true."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000977
Tim Peters2344fae2001-01-15 00:50:52 +0000978 def help_condition(self):
Georg Brandl19564802006-05-10 17:13:20 +0000979 print >>self.stdout, """condition bpnumber str_condition
Tim Peters2344fae2001-01-15 00:50:52 +0000980str_condition is a string specifying an expression which
981must evaluate to true before the breakpoint is honored.
982If str_condition is absent, any existing condition is removed;
983i.e., the breakpoint is made unconditional."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000984
Tim Peters2344fae2001-01-15 00:50:52 +0000985 def help_step(self):
986 self.help_s()
Guido van Rossumb6775db1994-08-01 11:34:53 +0000987
Tim Peters2344fae2001-01-15 00:50:52 +0000988 def help_s(self):
Georg Brandl19564802006-05-10 17:13:20 +0000989 print >>self.stdout, """s(tep)
Tim Peters2344fae2001-01-15 00:50:52 +0000990Execute the current line, stop at the first possible occasion
991(either in a function that is called or in the current function)."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000992
Benjamin Peterson98353942008-05-11 14:13:25 +0000993 def help_until(self):
994 self.help_unt()
995
996 def help_unt(self):
997 print """unt(il)
998Continue execution until the line with a number greater than the current
999one is reached or until the current frame returns"""
1000
Tim Peters2344fae2001-01-15 00:50:52 +00001001 def help_next(self):
1002 self.help_n()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003
Tim Peters2344fae2001-01-15 00:50:52 +00001004 def help_n(self):
Georg Brandl19564802006-05-10 17:13:20 +00001005 print >>self.stdout, """n(ext)
Tim Peters2344fae2001-01-15 00:50:52 +00001006Continue execution until the next line in the current function
1007is reached or it returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008
Tim Peters2344fae2001-01-15 00:50:52 +00001009 def help_return(self):
1010 self.help_r()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001011
Tim Peters2344fae2001-01-15 00:50:52 +00001012 def help_r(self):
Georg Brandl19564802006-05-10 17:13:20 +00001013 print >>self.stdout, """r(eturn)
Tim Peters2344fae2001-01-15 00:50:52 +00001014Continue execution until the current function returns."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015
Tim Peters2344fae2001-01-15 00:50:52 +00001016 def help_continue(self):
1017 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001018
Tim Peters2344fae2001-01-15 00:50:52 +00001019 def help_cont(self):
1020 self.help_c()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021
Tim Peters2344fae2001-01-15 00:50:52 +00001022 def help_c(self):
Georg Brandl19564802006-05-10 17:13:20 +00001023 print >>self.stdout, """c(ont(inue))
Tim Peters2344fae2001-01-15 00:50:52 +00001024Continue execution, only stop when a breakpoint is encountered."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001025
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001026 def help_jump(self):
1027 self.help_j()
1028
1029 def help_j(self):
Georg Brandl19564802006-05-10 17:13:20 +00001030 print >>self.stdout, """j(ump) lineno
Michael W. Hudsoncfd38842002-12-17 16:15:34 +00001031Set the next line that will be executed."""
1032
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001033 def help_debug(self):
Georg Brandl19564802006-05-10 17:13:20 +00001034 print >>self.stdout, """debug code
Guido van Rossuma12fe4e2003-04-09 19:06:21 +00001035Enter a recursive debugger that steps through the code argument
1036(which is an arbitrary expression or statement to be executed
1037in the current environment)."""
1038
Tim Peters2344fae2001-01-15 00:50:52 +00001039 def help_list(self):
1040 self.help_l()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001041
Tim Peters2344fae2001-01-15 00:50:52 +00001042 def help_l(self):
Georg Brandl19564802006-05-10 17:13:20 +00001043 print >>self.stdout, """l(ist) [first [,last]]
Tim Peters2344fae2001-01-15 00:50:52 +00001044List source code for the current file.
1045Without arguments, list 11 lines around the current line
1046or continue the previous listing.
1047With one argument, list 11 lines starting at that line.
1048With two arguments, list the given range;
1049if the second argument is less than the first, it is a count."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001050
Tim Peters2344fae2001-01-15 00:50:52 +00001051 def help_args(self):
1052 self.help_a()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001053
Tim Peters2344fae2001-01-15 00:50:52 +00001054 def help_a(self):
Georg Brandl19564802006-05-10 17:13:20 +00001055 print >>self.stdout, """a(rgs)
Tim Peters2344fae2001-01-15 00:50:52 +00001056Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001057
Tim Peters2344fae2001-01-15 00:50:52 +00001058 def help_p(self):
Georg Brandl19564802006-05-10 17:13:20 +00001059 print >>self.stdout, """p expression
Tim Peters2344fae2001-01-15 00:50:52 +00001060Print the value of the expression."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061
Barry Warsaw210bd202002-11-05 22:40:20 +00001062 def help_pp(self):
Georg Brandl19564802006-05-10 17:13:20 +00001063 print >>self.stdout, """pp expression
Barry Warsaw210bd202002-11-05 22:40:20 +00001064Pretty-print the value of the expression."""
1065
Tim Peters2344fae2001-01-15 00:50:52 +00001066 def help_exec(self):
Georg Brandl19564802006-05-10 17:13:20 +00001067 print >>self.stdout, """(!) statement
Tim Peters2344fae2001-01-15 00:50:52 +00001068Execute the (one-line) statement in the context of
1069the current stack frame.
1070The exclamation point can be omitted unless the first word
1071of the statement resembles a debugger command.
1072To assign to a global variable you must always prefix the
1073command with a 'global' command, e.g.:
1074(Pdb) global list_options; list_options = ['-l']
1075(Pdb)"""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001076
Georg Brandl8e84c652007-03-13 21:08:15 +00001077 def help_run(self):
1078 print """run [args...]
1079Restart the debugged python program. If a string is supplied, it is
1080splitted with "shlex" and the result is used as the new sys.argv.
1081History, breakpoints, actions and debugger options are preserved.
1082"restart" is an alias for "run"."""
1083
1084 help_restart = help_run
1085
Tim Peters2344fae2001-01-15 00:50:52 +00001086 def help_quit(self):
1087 self.help_q()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088
Tim Peters2344fae2001-01-15 00:50:52 +00001089 def help_q(self):
Georg Brandl19564802006-05-10 17:13:20 +00001090 print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters2344fae2001-01-15 00:50:52 +00001091The program being executed is aborted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001092
Guido van Rossumd1c08f32002-04-15 00:48:24 +00001093 help_exit = help_q
1094
Tim Peters2344fae2001-01-15 00:50:52 +00001095 def help_whatis(self):
Georg Brandl19564802006-05-10 17:13:20 +00001096 print >>self.stdout, """whatis arg
Tim Peters2344fae2001-01-15 00:50:52 +00001097Prints the type of the argument."""
Guido van Rossumb6775db1994-08-01 11:34:53 +00001098
Tim Peters2344fae2001-01-15 00:50:52 +00001099 def help_EOF(self):
Georg Brandl19564802006-05-10 17:13:20 +00001100 print >>self.stdout, """EOF
Tim Peters2344fae2001-01-15 00:50:52 +00001101Handles the receipt of EOF as a command."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001102
Tim Peters2344fae2001-01-15 00:50:52 +00001103 def help_alias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001104 print >>self.stdout, """alias [name [command [parameter parameter ...] ]]
Tim Peters2344fae2001-01-15 00:50:52 +00001105Creates an alias called 'name' the executes 'command'. The command
1106must *not* be enclosed in quotes. Replaceable parameters are
1107indicated by %1, %2, and so on, while %* is replaced by all the
1108parameters. If no command is given, the current alias for name
1109is shown. If no name is given, all aliases are listed.
Guido van Rossum2424f851998-09-11 22:50:09 +00001110
Tim Peters2344fae2001-01-15 00:50:52 +00001111Aliases may be nested and can contain anything that can be
1112legally typed at the pdb prompt. Note! You *can* override
1113internal pdb commands with aliases! Those internal commands
1114are then hidden until the alias is removed. Aliasing is recursively
1115applied to the first word of the command line; all other words
1116in the line are left alone.
Guido van Rossum2424f851998-09-11 22:50:09 +00001117
Tim Peters2344fae2001-01-15 00:50:52 +00001118Some useful aliases (especially when placed in the .pdbrc file) are:
Guido van Rossum2424f851998-09-11 22:50:09 +00001119
Tim Peters2344fae2001-01-15 00:50:52 +00001120#Print instance variables (usage "pi classInst")
1121alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
Guido van Rossum2424f851998-09-11 22:50:09 +00001122
Tim Peters2344fae2001-01-15 00:50:52 +00001123#Print instance variables in self
1124alias ps pi self
1125"""
Guido van Rossum2424f851998-09-11 22:50:09 +00001126
Tim Peters2344fae2001-01-15 00:50:52 +00001127 def help_unalias(self):
Georg Brandl19564802006-05-10 17:13:20 +00001128 print >>self.stdout, """unalias name
Tim Peters2344fae2001-01-15 00:50:52 +00001129Deletes the specified alias."""
Guido van Rossum2424f851998-09-11 22:50:09 +00001130
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001131 def help_commands(self):
Georg Brandl19564802006-05-10 17:13:20 +00001132 print >>self.stdout, """commands [bpnumber]
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001133(com) ...
1134(com) end
1135(Pdb)
1136
1137Specify a list of commands for breakpoint number bpnumber. The
1138commands themselves appear on the following lines. Type a line
1139containing just 'end' to terminate the commands.
1140
1141To remove all commands from a breakpoint, type commands and
1142follow it immediately with end; that is, give no commands.
1143
1144With no bpnumber argument, commands refers to the last
1145breakpoint set.
1146
1147You can use breakpoint commands to start your program up again.
1148Simply use the continue command, or step, or any other
1149command that resumes execution.
1150
1151Specifying any command resuming execution (currently continue,
1152step, next, return, jump, quit and their abbreviations) terminates
1153the command list (as if that command was immediately followed by end).
1154This is because any time you resume execution
Martin v. Löwisf62eee12006-04-17 17:37:09 +00001155(even with a simple next or step), you may encounter
Martin v. Löwisbd30f522006-04-17 17:08:37 +00001156another breakpoint--which could have its own command list, leading to
1157ambiguities about which list to execute.
1158
1159 If you use the 'silent' command in the command list, the
1160usual message about stopping at a breakpoint is not printed. This may
1161be desirable for breakpoints that are to print a specific message and
1162then continue. If none of the other commands print anything, you
1163see no sign that the breakpoint was reached.
1164"""
1165
Tim Peters2344fae2001-01-15 00:50:52 +00001166 def help_pdb(self):
1167 help()
Guido van Rossumb6775db1994-08-01 11:34:53 +00001168
Tim Peters2344fae2001-01-15 00:50:52 +00001169 def lookupmodule(self, filename):
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001170 """Helper function for break/clear parsing -- may be overridden.
1171
1172 lookupmodule() translates (possibly incomplete) file or module name
1173 into an absolute file name.
1174 """
1175 if os.path.isabs(filename) and os.path.exists(filename):
Tim Peterse718f612004-10-12 21:51:32 +00001176 return filename
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001177 f = os.path.join(sys.path[0], filename)
1178 if os.path.exists(f) and self.canonic(f) == self.mainpyfile:
1179 return f
Tim Peters2344fae2001-01-15 00:50:52 +00001180 root, ext = os.path.splitext(filename)
1181 if ext == '':
1182 filename = filename + '.py'
1183 if os.path.isabs(filename):
1184 return filename
1185 for dirname in sys.path:
1186 while os.path.islink(dirname):
1187 dirname = os.readlink(dirname)
1188 fullname = os.path.join(dirname, filename)
1189 if os.path.exists(fullname):
1190 return fullname
1191 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +00001192
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001193 def _runscript(self, filename):
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001194 # The script has to run in __main__ namespace (or imports from
1195 # __main__ will break).
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001196 #
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001197 # So we clear up the __main__ and set several special variables
1198 # (this gets rid of pdb's globals and cleans old variables on restarts).
1199 import __main__
1200 __main__.__dict__.clear()
1201 __main__.__dict__.update({"__name__" : "__main__",
1202 "__file__" : filename,
1203 "__builtins__": __builtins__,
1204 })
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001205
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001206 # When bdb sets tracing, a number of call and line events happens
1207 # BEFORE debugger even reaches user's code (and the exact sequence of
1208 # events depends on python version). So we take special measures to
1209 # avoid stopping before we reach the main script (see user_line and
1210 # user_call for details).
1211 self._wait_for_mainpyfile = 1
1212 self.mainpyfile = self.canonic(filename)
1213 self._user_requested_quit = 0
1214 statement = 'execfile( "%s")' % filename
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001215 self.run(statement)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001216
Guido van Rossum35771131992-09-08 11:59:04 +00001217# Simplified interface
1218
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001219def run(statement, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001220 Pdb().run(statement, globals, locals)
Guido van Rossum5e38b6f1995-02-27 13:13:40 +00001221
1222def runeval(expression, globals=None, locals=None):
Tim Peters2344fae2001-01-15 00:50:52 +00001223 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001224
1225def runctx(statement, globals, locals):
Tim Peters2344fae2001-01-15 00:50:52 +00001226 # B/W compatibility
1227 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001228
Raymond Hettinger2ef7e6c2004-10-24 00:32:24 +00001229def runcall(*args, **kwds):
1230 return Pdb().runcall(*args, **kwds)
Guido van Rossum4e160981992-09-02 20:43:20 +00001231
Guido van Rossumb6775db1994-08-01 11:34:53 +00001232def set_trace():
Johannes Gijsbers84a6c202004-11-07 11:35:30 +00001233 Pdb().set_trace(sys._getframe().f_back)
Guido van Rossum35771131992-09-08 11:59:04 +00001234
1235# Post-Mortem interface
1236
Facundo Batistac54aec12008-03-08 16:50:27 +00001237def post_mortem(t=None):
1238 # handling the default
1239 if t is None:
1240 # sys.exc_info() returns (type, value, traceback) if an exception is
1241 # being handled, otherwise it returns None
1242 t = sys.exc_info()[2]
1243 if t is None:
1244 raise ValueError("A valid traceback must be passed if no "
1245 "exception is being handled")
1246
Tim Peters2344fae2001-01-15 00:50:52 +00001247 p = Pdb()
1248 p.reset()
Benjamin Petersonaf956f12008-10-22 21:19:41 +00001249 p.interaction(None, t)
Guido van Rossum35771131992-09-08 11:59:04 +00001250
1251def pm():
Tim Peters2344fae2001-01-15 00:50:52 +00001252 post_mortem(sys.last_traceback)
Guido van Rossum35771131992-09-08 11:59:04 +00001253
1254
1255# Main program for testing
1256
Guido van Rossum23efba41992-01-27 16:58:47 +00001257TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001258
Guido van Rossum921c8241992-01-10 14:54:42 +00001259def test():
Tim Peters2344fae2001-01-15 00:50:52 +00001260 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +00001261
1262# print help
1263def help():
Tim Peters2344fae2001-01-15 00:50:52 +00001264 for dirname in sys.path:
1265 fullname = os.path.join(dirname, 'pdb.doc')
1266 if os.path.exists(fullname):
1267 sts = os.system('${PAGER-more} '+fullname)
1268 if sts: print '*** Pager exit status:', sts
1269 break
1270 else:
1271 print 'Sorry, can\'t find the help file "pdb.doc"',
1272 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +00001273
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001274def main():
Benjamin Peterson13be2cf2008-03-26 11:57:47 +00001275 if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters2344fae2001-01-15 00:50:52 +00001276 print "usage: pdb.py scriptfile [arg] ..."
1277 sys.exit(2)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001278
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001279 mainpyfile = sys.argv[1] # Get script filename
1280 if not os.path.exists(mainpyfile):
1281 print 'Error:', mainpyfile, 'does not exist'
Tim Peters2344fae2001-01-15 00:50:52 +00001282 sys.exit(1)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001283
Tim Peters2344fae2001-01-15 00:50:52 +00001284 del sys.argv[0] # Hide "pdb.py" from argument list
Guido van Rossumec577d51996-09-10 17:39:34 +00001285
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001286 # Replace pdb's dir with script's dir in front of module search path.
1287 sys.path[0] = os.path.dirname(mainpyfile)
Guido van Rossumf17361d1996-07-30 16:28:13 +00001288
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001289 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1290 # modified by the script being debugged. It's a bad idea when it was
Georg Brandl8e84c652007-03-13 21:08:15 +00001291 # changed by the user from the command line. There is a "restart" command which
1292 # allows explicit specification of command line arguments.
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001293 pdb = Pdb()
Georg Brandle64de922010-08-01 22:10:15 +00001294 while True:
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001295 try:
1296 pdb._runscript(mainpyfile)
1297 if pdb._user_requested_quit:
1298 break
Tim Peterse718f612004-10-12 21:51:32 +00001299 print "The program finished and will be restarted"
Georg Brandl8e84c652007-03-13 21:08:15 +00001300 except Restart:
1301 print "Restarting", mainpyfile, "with arguments:"
1302 print "\t" + " ".join(sys.argv[1:])
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001303 except SystemExit:
1304 # In most cases SystemExit does not warrant a post-mortem session.
1305 print "The program exited via sys.exit(). Exit status: ",
1306 print sys.exc_info()[1]
1307 except:
1308 traceback.print_exc()
1309 print "Uncaught exception. Entering post mortem debugging"
1310 print "Running 'cont' or 'step' will restart the program"
1311 t = sys.exc_info()[2]
Benjamin Petersonaf956f12008-10-22 21:19:41 +00001312 pdb.interaction(None, t)
Johannes Gijsbers25b38c82004-10-12 18:12:09 +00001313 print "Post mortem debugger finished. The "+mainpyfile+" will be restarted"
1314
1315
1316# When invoked as main program, invoke the debugger on a script
Georg Brandlb6ae6aa2007-03-13 21:58:44 +00001317if __name__ == '__main__':
1318 import pdb
1319 pdb.main()