blob: 60b34125665c328c13930fcc45fbb249fdfe7e17 [file] [log] [blame]
Guido van Rossumf17361d1996-07-30 16:28:13 +00001#! /usr/local/bin/python
2
Guido van Rossum6fe08b01992-01-16 13:50:21 +00003# pdb.py -- finally, 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
7import string
8import sys
9import linecache
Guido van Rossum23efba41992-01-27 16:58:47 +000010import cmd
11import bdb
12import repr
Guido van Rossum921c8241992-01-10 14:54:42 +000013
14
Guido van Rossuma558e371994-11-10 22:27:35 +000015# Interaction prompt line will separate file and call info from code
16# text using value of line_prefix string. A newline and arrow may
17# be to your liking. You can set it once pdb is imported using the
18# command "pdb.line_prefix = '\n% '".
19# line_prefix = ': ' # Use this to get the old situation back
20line_prefix = '\n-> ' # Probably a better default
21
Guido van Rossum23efba41992-01-27 16:58:47 +000022class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum921c8241992-01-10 14:54:42 +000023
Guido van Rossum5ef74b81993-06-23 11:55:24 +000024 def __init__(self):
25 bdb.Bdb.__init__(self)
26 cmd.Cmd.__init__(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000027 self.prompt = '(Pdb) '
Guido van Rossum921c8241992-01-10 14:54:42 +000028
29 def reset(self):
Guido van Rossum23efba41992-01-27 16:58:47 +000030 bdb.Bdb.reset(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000031 self.forget()
32
33 def forget(self):
Guido van Rossum921c8241992-01-10 14:54:42 +000034 self.lineno = None
Guido van Rossum6fe08b01992-01-16 13:50:21 +000035 self.stack = []
Guido van Rossum7ac1c811992-01-16 13:55:21 +000036 self.curindex = 0
37 self.curframe = None
Guido van Rossum23efba41992-01-27 16:58:47 +000038
39 def setup(self, f, t):
40 self.forget()
41 self.stack, self.curindex = self.get_stack(f, t)
Guido van Rossum7ac1c811992-01-16 13:55:21 +000042 self.curframe = self.stack[self.curindex][0]
Guido van Rossum921c8241992-01-10 14:54:42 +000043
Guido van Rossum23efba41992-01-27 16:58:47 +000044 # Override Bdb methods (except user_call, for now)
Guido van Rossumb9142571992-01-12 23:32:55 +000045
Guido van Rossum23efba41992-01-27 16:58:47 +000046 def user_line(self, frame):
47 # This function is called when we stop or break at this line
48 self.interaction(frame, None)
Guido van Rossum7ac1c811992-01-16 13:55:21 +000049
Guido van Rossum23efba41992-01-27 16:58:47 +000050 def user_return(self, frame, return_value):
51 # This function is called when a return trap is set here
52 frame.f_locals['__return__'] = return_value
53 print '--Return--'
54 self.interaction(frame, None)
Guido van Rossum921c8241992-01-10 14:54:42 +000055
Guido van Rossum23efba41992-01-27 16:58:47 +000056 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
57 # This function is called if an exception occurs,
58 # but only if we are to stop at or just below this level
59 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum5e38b6f1995-02-27 13:13:40 +000060 if type(exc_type) == type(''):
61 exc_type_name = exc_type
62 else: exc_type_name = exc_type.__name__
63 print exc_type_name + ':', repr.repr(exc_value)
Guido van Rossum23efba41992-01-27 16:58:47 +000064 self.interaction(frame, exc_traceback)
Guido van Rossum921c8241992-01-10 14:54:42 +000065
Guido van Rossum23efba41992-01-27 16:58:47 +000066 # General interaction function
Guido van Rossumb9142571992-01-12 23:32:55 +000067
Guido van Rossum23efba41992-01-27 16:58:47 +000068 def interaction(self, frame, traceback):
Guido van Rossum6fe08b01992-01-16 13:50:21 +000069 self.setup(frame, traceback)
Guido van Rossumb6aa92e1995-02-03 12:50:04 +000070 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossum6fe08b01992-01-16 13:50:21 +000071 self.cmdloop()
Guido van Rossumb9142571992-01-12 23:32:55 +000072 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +000073
Guido van Rossum921c8241992-01-10 14:54:42 +000074 def default(self, line):
Guido van Rossum23efba41992-01-27 16:58:47 +000075 if line[:1] == '!': line = line[1:]
76 locals = self.curframe.f_locals
77 globals = self.curframe.f_globals
Guido van Rossum8e2ec561993-07-29 09:37:38 +000078 globals['__privileged__'] = 1
Guido van Rossum23efba41992-01-27 16:58:47 +000079 try:
Guido van Rossumf17361d1996-07-30 16:28:13 +000080 code = compile(line + '\n', '<stdin>', 'single')
Guido van Rossumec8fd941995-08-07 20:16:05 +000081 exec code in globals, locals
Guido van Rossum23efba41992-01-27 16:58:47 +000082 except:
Guido van Rossum5e38b6f1995-02-27 13:13:40 +000083 if type(sys.exc_type) == type(''):
84 exc_type_name = sys.exc_type
85 else: exc_type_name = sys.exc_type.__name__
86 print '***', exc_type_name + ':', sys.exc_value
Guido van Rossum23efba41992-01-27 16:58:47 +000087
88 # Command definitions, called by cmdloop()
89 # The argument is the remaining string on the command line
90 # Return true to exit from the command loop
Guido van Rossum921c8241992-01-10 14:54:42 +000091
Guido van Rossum23efba41992-01-27 16:58:47 +000092 do_h = cmd.Cmd.do_help
Guido van Rossumb6775db1994-08-01 11:34:53 +000093
Guido van Rossum921c8241992-01-10 14:54:42 +000094 def do_break(self, arg):
95 if not arg:
Guido van Rossum23efba41992-01-27 16:58:47 +000096 print self.get_all_breaks() # XXX
Guido van Rossum921c8241992-01-10 14:54:42 +000097 return
Guido van Rossumb6775db1994-08-01 11:34:53 +000098 # Try line number as argument
99 try:
Guido van Rossum921c8241992-01-10 14:54:42 +0000100 lineno = int(eval(arg))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000101 filename = self.curframe.f_code.co_filename
Guido van Rossum921c8241992-01-10 14:54:42 +0000102 except:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000103 # Try function name as the argument
104 import codehack
105 try:
106 func = eval(arg, self.curframe.f_globals,
107 self.curframe.f_locals)
108 if hasattr(func, 'im_func'):
109 func = func.im_func
110 code = func.func_code
111 except:
112 print '*** Could not eval argument:', arg
113 return
114 lineno = codehack.getlineno(code)
115 filename = code.co_filename
116
117 # now set the break point
Guido van Rossum23efba41992-01-27 16:58:47 +0000118 err = self.set_break(filename, lineno)
119 if err: print '***', err
Guido van Rossum921c8241992-01-10 14:54:42 +0000120 do_b = do_break
121
122 def do_clear(self, arg):
123 if not arg:
Guido van Rossumb9142571992-01-12 23:32:55 +0000124 try:
125 reply = raw_input('Clear all breaks? ')
126 except EOFError:
127 reply = 'no'
128 reply = string.lower(string.strip(reply))
129 if reply in ('y', 'yes'):
Guido van Rossum23efba41992-01-27 16:58:47 +0000130 self.clear_all_breaks()
Guido van Rossum921c8241992-01-10 14:54:42 +0000131 return
132 try:
133 lineno = int(eval(arg))
134 except:
135 print '*** Error in argument:', `arg`
136 return
137 filename = self.curframe.f_code.co_filename
Guido van Rossum89a78691992-12-14 12:57:56 +0000138 err = self.clear_break(filename, lineno)
Guido van Rossum23efba41992-01-27 16:58:47 +0000139 if err: print '***', err
Guido van Rossumb9142571992-01-12 23:32:55 +0000140 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
Guido van Rossum921c8241992-01-10 14:54:42 +0000141
142 def do_where(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000143 self.print_stack_trace()
Guido van Rossum921c8241992-01-10 14:54:42 +0000144 do_w = do_where
145
146 def do_up(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000147 if self.curindex == 0:
148 print '*** Oldest frame'
Guido van Rossum921c8241992-01-10 14:54:42 +0000149 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000150 self.curindex = self.curindex - 1
151 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000152 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000153 self.lineno = None
Guido van Rossumb9142571992-01-12 23:32:55 +0000154 do_u = do_up
155
156 def do_down(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000157 if self.curindex + 1 == len(self.stack):
158 print '*** Newest frame'
Guido van Rossumb9142571992-01-12 23:32:55 +0000159 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000160 self.curindex = self.curindex + 1
161 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000162 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000163 self.lineno = None
Guido van Rossum921c8241992-01-10 14:54:42 +0000164 do_d = do_down
165
166 def do_step(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000167 self.set_step()
Guido van Rossumb9142571992-01-12 23:32:55 +0000168 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000169 do_s = do_step
170
171 def do_next(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000172 self.set_next(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000173 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000174 do_n = do_next
175
Guido van Rossumb9142571992-01-12 23:32:55 +0000176 def do_return(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000177 self.set_return(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000178 return 1
179 do_r = do_return
180
Guido van Rossum921c8241992-01-10 14:54:42 +0000181 def do_continue(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000182 self.set_continue()
Guido van Rossumb9142571992-01-12 23:32:55 +0000183 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000184 do_c = do_cont = do_continue
185
186 def do_quit(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000187 self.set_quit()
188 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000189 do_q = do_quit
190
Guido van Rossum23efba41992-01-27 16:58:47 +0000191 def do_args(self, arg):
Guido van Rossumb6775db1994-08-01 11:34:53 +0000192 if self.curframe.f_locals.has_key('__args__'):
193 print `self.curframe.f_locals['__args__']`
Guido van Rossum23efba41992-01-27 16:58:47 +0000194 else:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195 print '*** No arguments?!'
Guido van Rossum23efba41992-01-27 16:58:47 +0000196 do_a = do_args
197
198 def do_retval(self, arg):
199 if self.curframe.f_locals.has_key('__return__'):
200 print self.curframe.f_locals['__return__']
201 else:
202 print '*** Not yet returned!'
203 do_rv = do_retval
204
205 def do_p(self, arg):
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000206 self.curframe.f_globals['__privileged__'] = 1
Guido van Rossum23efba41992-01-27 16:58:47 +0000207 try:
208 value = eval(arg, self.curframe.f_globals, \
209 self.curframe.f_locals)
210 except:
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000211 if type(sys.exc_type) == type(''):
212 exc_type_name = sys.exc_type
213 else: exc_type_name = sys.exc_type.__name__
214 print '***', exc_type_name + ':', `sys.exc_value`
Guido van Rossum23efba41992-01-27 16:58:47 +0000215 return
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000216
Guido van Rossum23efba41992-01-27 16:58:47 +0000217 print `value`
218
Guido van Rossum921c8241992-01-10 14:54:42 +0000219 def do_list(self, arg):
Guido van Rossumb9142571992-01-12 23:32:55 +0000220 self.lastcmd = 'list'
Guido van Rossum921c8241992-01-10 14:54:42 +0000221 last = None
222 if arg:
223 try:
224 x = eval(arg, {}, {})
225 if type(x) == type(()):
226 first, last = x
227 first = int(first)
228 last = int(last)
229 if last < first:
230 # Assume it's a count
231 last = first + last
232 else:
Guido van Rossumc629d341992-11-05 10:43:02 +0000233 first = max(1, int(x) - 5)
Guido van Rossum921c8241992-01-10 14:54:42 +0000234 except:
235 print '*** Error in argument:', `arg`
236 return
237 elif self.lineno is None:
238 first = max(1, self.curframe.f_lineno - 5)
239 else:
240 first = self.lineno + 1
Guido van Rossumc629d341992-11-05 10:43:02 +0000241 if last == None:
Guido van Rossum921c8241992-01-10 14:54:42 +0000242 last = first + 10
243 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000244 breaklist = self.get_file_breaks(filename)
Guido van Rossum921c8241992-01-10 14:54:42 +0000245 try:
246 for lineno in range(first, last+1):
247 line = linecache.getline(filename, lineno)
248 if not line:
249 print '[EOF]'
250 break
251 else:
252 s = string.rjust(`lineno`, 3)
253 if len(s) < 4: s = s + ' '
254 if lineno in breaklist: s = s + 'B'
255 else: s = s + ' '
256 if lineno == self.curframe.f_lineno:
257 s = s + '->'
258 print s + '\t' + line,
259 self.lineno = lineno
260 except KeyboardInterrupt:
261 pass
262 do_l = do_list
Guido van Rossum00230781993-03-29 11:39:45 +0000263
264 def do_whatis(self, arg):
Guido van Rossum00230781993-03-29 11:39:45 +0000265 try:
266 value = eval(arg, self.curframe.f_globals, \
267 self.curframe.f_locals)
268 except:
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000269 if type(sys.exc_type) == type(''):
270 exc_type_name = sys.exc_type
271 else: exc_type_name = sys.exc_type.__name__
272 print '***', exc_type_name + ':', `sys.exc_value`
Guido van Rossum00230781993-03-29 11:39:45 +0000273 return
274 code = None
275 # Is it a function?
276 try: code = value.func_code
277 except: pass
278 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000279 print 'Function', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000280 return
281 # Is it an instance method?
282 try: code = value.im_func.func_code
283 except: pass
284 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000285 print 'Method', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000286 return
287 # None of the above...
288 print type(value)
Guido van Rossumb9142571992-01-12 23:32:55 +0000289
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000290 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000291 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000292 # this is different from dbx and gdb, but consistent with
293 # the Python interpreter's stack trace.
294 # It is also consistent with the up/down commands (which are
295 # compatible with dbx and gdb: up moves towards 'main()'
296 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000297
Guido van Rossum23efba41992-01-27 16:58:47 +0000298 def print_stack_trace(self):
299 try:
300 for frame_lineno in self.stack:
301 self.print_stack_entry(frame_lineno)
302 except KeyboardInterrupt:
303 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000304
Guido van Rossumb6aa92e1995-02-03 12:50:04 +0000305 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
Guido van Rossum23efba41992-01-27 16:58:47 +0000306 frame, lineno = frame_lineno
307 if frame is self.curframe:
308 print '>',
309 else:
310 print ' ',
Guido van Rossuma558e371994-11-10 22:27:35 +0000311 print self.format_stack_entry(frame_lineno, prompt_prefix)
Guido van Rossum921c8241992-01-10 14:54:42 +0000312
313
Guido van Rossumb6775db1994-08-01 11:34:53 +0000314 # Help methods (derived from pdb.doc)
315
316 def help_help(self):
317 self.help_h()
318
319 def help_h(self):
320 print """h(elp)
321 Without argument, print the list of available commands.
322 With a command name as argument, print help about that command
323 "help pdb" pipes the full documentation file to the $PAGER
324 "help exec" gives help on the ! command"""
325
326 def help_where(self):
327 self.help_w()
328
329 def help_w(self):
330 print """w(here)
331 Print a stack trace, with the most recent frame at the bottom.
332 An arrow indicates the "current frame", which determines the
333 context of most commands."""
334
335 def help_down(self):
336 self.help_d()
337
338 def help_d(self):
339 print """d(own)
340 Move the current frame one level down in the stack trace
341 (to an older frame)."""
342
343 def help_up(self):
344 self.help_u()
345
346 def help_u(self):
347 print """u(p)
348 Move the current frame one level up in the stack trace
349 (to a newer frame)."""
350
351 def help_break(self):
352 self.help_b()
353
354 def help_b(self):
355 print """b(reak) [lineno | function]
356 With a line number argument, set a break there in the current
357 file. With a function name, set a break at the entry of that
358 function. Without argument, list all breaks."""
359
360 def help_clear(self):
361 self.help_cl()
362
363 def help_cl(self):
364 print """cl(ear) [lineno]
365 With a line number argument, clear that break in the current file.
366 Without argument, clear all breaks (but first ask confirmation)."""
367
368 def help_step(self):
369 self.help_s()
370
371 def help_s(self):
372 print """s(tep)
373 Execute the current line, stop at the first possible occasion
374 (either in a function that is called or in the current function)."""
375
376 def help_next(self):
377 self.help_n()
378
379 def help_n(self):
380 print """n(ext)
381 Continue execution until the next line in the current function
382 is reached or it returns."""
383
384 def help_return(self):
385 self.help_r()
386
387 def help_r(self):
388 print """r(eturn)
389 Continue execution until the current function returns."""
390
391 def help_continue(self):
392 self.help_c()
393
394 def help_cont(self):
395 self.help_c()
396
397 def help_c(self):
398 print """c(ont(inue))
399 Continue execution, only stop when a breakpoint is encountered."""
400
401 def help_list(self):
402 self.help_l()
403
404 def help_l(self):
405 print """l(ist) [first [,last]]
406 List source code for the current file.
407 Without arguments, list 11 lines around the current line
408 or continue the previous listing.
409 With one argument, list 11 lines starting at that line.
410 With two arguments, list the given range;
411 if the second argument is less than the first, it is a count."""
412
413 def help_args(self):
414 self.help_a()
415
416 def help_a(self):
417 print """a(rgs)
418 Print the argument list of the current function."""
419
420 def help_p(self):
421 print """p expression
422 Print the value of the expression."""
423
424 def help_exec(self):
425 print """(!) statement
426 Execute the (one-line) statement in the context of
427 the current stack frame.
428 The exclamation point can be omitted unless the first word
429 of the statement resembles a debugger command.
430 To assign to a global variable you must always prefix the
431 command with a 'global' command, e.g.:
432 (Pdb) global list_options; list_options = ['-l']
433 (Pdb)"""
434
435 def help_quit(self):
436 self.help_q()
437
438 def help_q(self):
439 print """q(uit) Quit from the debugger.
440 The program being executed is aborted."""
441
442 def help_pdb(self):
443 help()
444
Guido van Rossum35771131992-09-08 11:59:04 +0000445# Simplified interface
446
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000447def run(statement, globals=None, locals=None):
448 Pdb().run(statement, globals, locals)
449
450def runeval(expression, globals=None, locals=None):
451 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000452
453def runctx(statement, globals, locals):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000454 # B/W compatibility
455 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000456
Guido van Rossum4e160981992-09-02 20:43:20 +0000457def runcall(*args):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000458 return apply(Pdb().runcall, args)
Guido van Rossum4e160981992-09-02 20:43:20 +0000459
Guido van Rossumb6775db1994-08-01 11:34:53 +0000460def set_trace():
461 Pdb().set_trace()
Guido van Rossum35771131992-09-08 11:59:04 +0000462
463# Post-Mortem interface
464
465def post_mortem(t):
Guido van Rossum5ef74b81993-06-23 11:55:24 +0000466 p = Pdb()
Guido van Rossum35771131992-09-08 11:59:04 +0000467 p.reset()
468 while t.tb_next <> None: t = t.tb_next
469 p.interaction(t.tb_frame, t)
470
471def pm():
472 import sys
473 post_mortem(sys.last_traceback)
474
475
476# Main program for testing
477
Guido van Rossum23efba41992-01-27 16:58:47 +0000478TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000479
Guido van Rossum921c8241992-01-10 14:54:42 +0000480def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000481 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +0000482
483# print help
484def help():
Guido van Rossumb37954f1993-10-22 13:57:38 +0000485 import os
Guido van Rossume61fa0a1993-10-22 13:56:35 +0000486 for dirname in sys.path:
487 fullname = os.path.join(dirname, 'pdb.doc')
488 if os.path.exists(fullname):
489 sts = os.system('${PAGER-more} '+fullname)
490 if sts: print '*** Pager exit status:', sts
491 break
492 else:
493 print 'Sorry, can\'t find the help file "pdb.doc"',
494 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +0000495
496# When invoked as main program, invoke the debugger on a script
497if __name__=='__main__':
498 import sys
499 if not sys.argv[1:]:
500 print "usage: pdb.py scriptfile [arg] ..."
501 sys.exit(2)
502
503 # Get the module name and function name, if present
504 filename = sys.argv[1]
505
506 del sys.argv[0]
507
508 run('execfile(' + `filename` + ')', {'__name__': '__main__'})