blob: f564f642b3bf5ed4e1f317923eabe73458bd493f [file] [log] [blame]
Guido van Rossum6fe08b01992-01-16 13:50:21 +00001# pdb.py -- finally, a Python debugger!
Guido van Rossum92df0c61992-01-14 18:30:15 +00002
Guido van Rossum23efba41992-01-27 16:58:47 +00003# (See pdb.doc for documentation.)
Guido van Rossum921c8241992-01-10 14:54:42 +00004
5import string
6import sys
7import linecache
Guido van Rossum23efba41992-01-27 16:58:47 +00008import cmd
9import bdb
10import repr
Guido van Rossum921c8241992-01-10 14:54:42 +000011
12
Guido van Rossum23efba41992-01-27 16:58:47 +000013class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum921c8241992-01-10 14:54:42 +000014
15 def init(self):
Guido van Rossum23efba41992-01-27 16:58:47 +000016 self = bdb.Bdb.init(self)
17 self = cmd.Cmd.init(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000018 self.prompt = '(Pdb) '
Guido van Rossum921c8241992-01-10 14:54:42 +000019 return self
20
21 def reset(self):
Guido van Rossum23efba41992-01-27 16:58:47 +000022 bdb.Bdb.reset(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000023 self.forget()
24
25 def forget(self):
Guido van Rossum921c8241992-01-10 14:54:42 +000026 self.lineno = None
Guido van Rossum6fe08b01992-01-16 13:50:21 +000027 self.stack = []
Guido van Rossum7ac1c811992-01-16 13:55:21 +000028 self.curindex = 0
29 self.curframe = None
Guido van Rossum23efba41992-01-27 16:58:47 +000030
31 def setup(self, f, t):
32 self.forget()
33 self.stack, self.curindex = self.get_stack(f, t)
Guido van Rossum7ac1c811992-01-16 13:55:21 +000034 self.curframe = self.stack[self.curindex][0]
Guido van Rossum921c8241992-01-10 14:54:42 +000035
Guido van Rossum23efba41992-01-27 16:58:47 +000036 # Override Bdb methods (except user_call, for now)
Guido van Rossumb9142571992-01-12 23:32:55 +000037
Guido van Rossum23efba41992-01-27 16:58:47 +000038 def user_line(self, frame):
39 # This function is called when we stop or break at this line
40 self.interaction(frame, None)
Guido van Rossum7ac1c811992-01-16 13:55:21 +000041
Guido van Rossum23efba41992-01-27 16:58:47 +000042 def user_return(self, frame, return_value):
43 # This function is called when a return trap is set here
44 frame.f_locals['__return__'] = return_value
45 print '--Return--'
46 self.interaction(frame, None)
Guido van Rossum921c8241992-01-10 14:54:42 +000047
Guido van Rossum23efba41992-01-27 16:58:47 +000048 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
49 # This function is called if an exception occurs,
50 # but only if we are to stop at or just below this level
51 frame.f_locals['__exception__'] = exc_type, exc_value
52 print exc_type + ':', repr.repr(exc_value)
53 self.interaction(frame, exc_traceback)
Guido van Rossum921c8241992-01-10 14:54:42 +000054
Guido van Rossum23efba41992-01-27 16:58:47 +000055 # General interaction function
Guido van Rossumb9142571992-01-12 23:32:55 +000056
Guido van Rossum23efba41992-01-27 16:58:47 +000057 def interaction(self, frame, traceback):
Guido van Rossum6fe08b01992-01-16 13:50:21 +000058 self.setup(frame, traceback)
Guido van Rossum23efba41992-01-27 16:58:47 +000059 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossum6fe08b01992-01-16 13:50:21 +000060 self.cmdloop()
Guido van Rossumb9142571992-01-12 23:32:55 +000061 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +000062
Guido van Rossum921c8241992-01-10 14:54:42 +000063 def default(self, line):
Guido van Rossum23efba41992-01-27 16:58:47 +000064 if line[:1] == '!': line = line[1:]
65 locals = self.curframe.f_locals
66 globals = self.curframe.f_globals
67 try:
68 exec(line + '\n', globals, locals)
69 except:
70 print '***', sys.exc_type + ':', sys.exc_value
71
72 # Command definitions, called by cmdloop()
73 # The argument is the remaining string on the command line
74 # Return true to exit from the command loop
Guido van Rossum921c8241992-01-10 14:54:42 +000075
Guido van Rossum23efba41992-01-27 16:58:47 +000076 do_h = cmd.Cmd.do_help
Guido van Rossum921c8241992-01-10 14:54:42 +000077
78 def do_break(self, arg):
79 if not arg:
Guido van Rossum23efba41992-01-27 16:58:47 +000080 print self.get_all_breaks() # XXX
Guido van Rossum921c8241992-01-10 14:54:42 +000081 return
82 try:
83 lineno = int(eval(arg))
84 except:
85 print '*** Error in argument:', `arg`
86 return
87 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +000088 err = self.set_break(filename, lineno)
89 if err: print '***', err
Guido van Rossum921c8241992-01-10 14:54:42 +000090 do_b = do_break
91
92 def do_clear(self, arg):
93 if not arg:
Guido van Rossumb9142571992-01-12 23:32:55 +000094 try:
95 reply = raw_input('Clear all breaks? ')
96 except EOFError:
97 reply = 'no'
98 reply = string.lower(string.strip(reply))
99 if reply in ('y', 'yes'):
Guido van Rossum23efba41992-01-27 16:58:47 +0000100 self.clear_all_breaks()
Guido van Rossum921c8241992-01-10 14:54:42 +0000101 return
102 try:
103 lineno = int(eval(arg))
104 except:
105 print '*** Error in argument:', `arg`
106 return
107 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000108 err = self.set_break(filename, lineno)
109 if err: print '***', err
Guido van Rossumb9142571992-01-12 23:32:55 +0000110 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
Guido van Rossum921c8241992-01-10 14:54:42 +0000111
112 def do_where(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000113 self.print_stack_trace()
Guido van Rossum921c8241992-01-10 14:54:42 +0000114 do_w = do_where
115
116 def do_up(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000117 if self.curindex == 0:
118 print '*** Oldest frame'
Guido van Rossum921c8241992-01-10 14:54:42 +0000119 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000120 self.curindex = self.curindex - 1
121 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000122 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumb9142571992-01-12 23:32:55 +0000123 do_u = do_up
124
125 def do_down(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000126 if self.curindex + 1 == len(self.stack):
127 print '*** Newest frame'
Guido van Rossumb9142571992-01-12 23:32:55 +0000128 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000129 self.curindex = self.curindex + 1
130 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000131 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossum921c8241992-01-10 14:54:42 +0000132 do_d = do_down
133
134 def do_step(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000135 self.set_step()
Guido van Rossumb9142571992-01-12 23:32:55 +0000136 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000137 do_s = do_step
138
139 def do_next(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000140 self.set_next(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000141 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000142 do_n = do_next
143
Guido van Rossumb9142571992-01-12 23:32:55 +0000144 def do_return(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000145 self.set_return(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000146 return 1
147 do_r = do_return
148
Guido van Rossum921c8241992-01-10 14:54:42 +0000149 def do_continue(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000150 self.set_continue()
Guido van Rossumb9142571992-01-12 23:32:55 +0000151 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000152 do_c = do_cont = do_continue
153
154 def do_quit(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000155 self.set_quit()
156 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000157 do_q = do_quit
158
Guido van Rossum23efba41992-01-27 16:58:47 +0000159 def do_args(self, arg):
160 if self.curframe.f_locals.has_key('__return__'):
161 print `self.curframe.f_locals['__return__']`
162 else:
163 print '*** Not arguments?!'
164 do_a = do_args
165
166 def do_retval(self, arg):
167 if self.curframe.f_locals.has_key('__return__'):
168 print self.curframe.f_locals['__return__']
169 else:
170 print '*** Not yet returned!'
171 do_rv = do_retval
172
173 def do_p(self, arg):
174 try:
175 value = eval(arg, self.curframe.f_globals, \
176 self.curframe.f_locals)
177 except:
178 print '***', sys.exc_type + ':', `sys.exc_value`
179 return
180 print `value`
181
Guido van Rossum921c8241992-01-10 14:54:42 +0000182 def do_list(self, arg):
Guido van Rossumb9142571992-01-12 23:32:55 +0000183 self.lastcmd = 'list'
Guido van Rossum921c8241992-01-10 14:54:42 +0000184 last = None
185 if arg:
186 try:
187 x = eval(arg, {}, {})
188 if type(x) == type(()):
189 first, last = x
190 first = int(first)
191 last = int(last)
192 if last < first:
193 # Assume it's a count
194 last = first + last
195 else:
196 first = int(x)
197 except:
198 print '*** Error in argument:', `arg`
199 return
200 elif self.lineno is None:
201 first = max(1, self.curframe.f_lineno - 5)
202 else:
203 first = self.lineno + 1
204 if last is None:
205 last = first + 10
206 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000207 breaklist = self.get_file_breaks(filename)
Guido van Rossum921c8241992-01-10 14:54:42 +0000208 try:
209 for lineno in range(first, last+1):
210 line = linecache.getline(filename, lineno)
211 if not line:
212 print '[EOF]'
213 break
214 else:
215 s = string.rjust(`lineno`, 3)
216 if len(s) < 4: s = s + ' '
217 if lineno in breaklist: s = s + 'B'
218 else: s = s + ' '
219 if lineno == self.curframe.f_lineno:
220 s = s + '->'
221 print s + '\t' + line,
222 self.lineno = lineno
223 except KeyboardInterrupt:
224 pass
225 do_l = do_list
Guido van Rossumb9142571992-01-12 23:32:55 +0000226
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000227 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000228 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000229 # this is different from dbx and gdb, but consistent with
230 # the Python interpreter's stack trace.
231 # It is also consistent with the up/down commands (which are
232 # compatible with dbx and gdb: up moves towards 'main()'
233 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000234
Guido van Rossum23efba41992-01-27 16:58:47 +0000235 def print_stack_trace(self):
236 try:
237 for frame_lineno in self.stack:
238 self.print_stack_entry(frame_lineno)
239 except KeyboardInterrupt:
240 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000241
Guido van Rossum23efba41992-01-27 16:58:47 +0000242 def print_stack_entry(self, frame_lineno):
243 frame, lineno = frame_lineno
244 if frame is self.curframe:
245 print '>',
246 else:
247 print ' ',
248 print self.format_stack_entry(frame_lineno)
Guido van Rossum921c8241992-01-10 14:54:42 +0000249
250
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000251def run(statement):
252 Pdb().init().run(statement)
253
254def runctx(statement, globals, locals):
255 Pdb().init().runctx(statement, globals, locals)
256
Guido van Rossum4e160981992-09-02 20:43:20 +0000257def runcall(*args):
258 apply(Pdb().init().runcall, args)
259
Guido van Rossum23efba41992-01-27 16:58:47 +0000260TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000261
Guido van Rossum921c8241992-01-10 14:54:42 +0000262def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000263 import linecache
Guido van Rossum921c8241992-01-10 14:54:42 +0000264 linecache.checkcache()
Guido van Rossum23efba41992-01-27 16:58:47 +0000265 run(TESTCMD)