blob: b8446aab6c330996c6e8c13de3777a2fb9323a3e [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 Rossum89a78691992-12-14 12:57:56 +0000108 err = self.clear_break(filename, lineno)
Guido van Rossum23efba41992-01-27 16:58:47 +0000109 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 Rossumc629d341992-11-05 10:43:02 +0000123 self.lineno = None
Guido van Rossumb9142571992-01-12 23:32:55 +0000124 do_u = do_up
125
126 def do_down(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000127 if self.curindex + 1 == len(self.stack):
128 print '*** Newest frame'
Guido van Rossumb9142571992-01-12 23:32:55 +0000129 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000130 self.curindex = self.curindex + 1
131 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000132 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000133 self.lineno = None
Guido van Rossum921c8241992-01-10 14:54:42 +0000134 do_d = do_down
135
136 def do_step(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000137 self.set_step()
Guido van Rossumb9142571992-01-12 23:32:55 +0000138 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000139 do_s = do_step
140
141 def do_next(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000142 self.set_next(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000143 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000144 do_n = do_next
145
Guido van Rossumb9142571992-01-12 23:32:55 +0000146 def do_return(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000147 self.set_return(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000148 return 1
149 do_r = do_return
150
Guido van Rossum921c8241992-01-10 14:54:42 +0000151 def do_continue(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000152 self.set_continue()
Guido van Rossumb9142571992-01-12 23:32:55 +0000153 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000154 do_c = do_cont = do_continue
155
156 def do_quit(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000157 self.set_quit()
158 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000159 do_q = do_quit
160
Guido van Rossum23efba41992-01-27 16:58:47 +0000161 def do_args(self, arg):
162 if self.curframe.f_locals.has_key('__return__'):
163 print `self.curframe.f_locals['__return__']`
164 else:
165 print '*** Not arguments?!'
166 do_a = do_args
167
168 def do_retval(self, arg):
169 if self.curframe.f_locals.has_key('__return__'):
170 print self.curframe.f_locals['__return__']
171 else:
172 print '*** Not yet returned!'
173 do_rv = do_retval
174
175 def do_p(self, arg):
176 try:
177 value = eval(arg, self.curframe.f_globals, \
178 self.curframe.f_locals)
179 except:
180 print '***', sys.exc_type + ':', `sys.exc_value`
181 return
182 print `value`
183
Guido van Rossum921c8241992-01-10 14:54:42 +0000184 def do_list(self, arg):
Guido van Rossumb9142571992-01-12 23:32:55 +0000185 self.lastcmd = 'list'
Guido van Rossum921c8241992-01-10 14:54:42 +0000186 last = None
187 if arg:
188 try:
189 x = eval(arg, {}, {})
190 if type(x) == type(()):
191 first, last = x
192 first = int(first)
193 last = int(last)
194 if last < first:
195 # Assume it's a count
196 last = first + last
197 else:
Guido van Rossumc629d341992-11-05 10:43:02 +0000198 first = max(1, int(x) - 5)
Guido van Rossum921c8241992-01-10 14:54:42 +0000199 except:
200 print '*** Error in argument:', `arg`
201 return
202 elif self.lineno is None:
203 first = max(1, self.curframe.f_lineno - 5)
204 else:
205 first = self.lineno + 1
Guido van Rossumc629d341992-11-05 10:43:02 +0000206 if last == None:
Guido van Rossum921c8241992-01-10 14:54:42 +0000207 last = first + 10
208 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000209 breaklist = self.get_file_breaks(filename)
Guido van Rossum921c8241992-01-10 14:54:42 +0000210 try:
211 for lineno in range(first, last+1):
212 line = linecache.getline(filename, lineno)
213 if not line:
214 print '[EOF]'
215 break
216 else:
217 s = string.rjust(`lineno`, 3)
218 if len(s) < 4: s = s + ' '
219 if lineno in breaklist: s = s + 'B'
220 else: s = s + ' '
221 if lineno == self.curframe.f_lineno:
222 s = s + '->'
223 print s + '\t' + line,
224 self.lineno = lineno
225 except KeyboardInterrupt:
226 pass
227 do_l = do_list
Guido van Rossum00230781993-03-29 11:39:45 +0000228
229 def do_whatis(self, arg):
230 import codehack
231 try:
232 value = eval(arg, self.curframe.f_globals, \
233 self.curframe.f_locals)
234 except:
235 print '***', sys.exc_type + ':', `sys.exc_value`
236 return
237 code = None
238 # Is it a function?
239 try: code = value.func_code
240 except: pass
241 if code:
242 print 'Function', codehack.getcodename(code)
243 return
244 # Is it an instance method?
245 try: code = value.im_func.func_code
246 except: pass
247 if code:
248 print 'Method', codehack.getcodename(code)
249 return
250 # None of the above...
251 print type(value)
Guido van Rossumb9142571992-01-12 23:32:55 +0000252
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000253 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000254 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000255 # this is different from dbx and gdb, but consistent with
256 # the Python interpreter's stack trace.
257 # It is also consistent with the up/down commands (which are
258 # compatible with dbx and gdb: up moves towards 'main()'
259 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000260
Guido van Rossum23efba41992-01-27 16:58:47 +0000261 def print_stack_trace(self):
262 try:
263 for frame_lineno in self.stack:
264 self.print_stack_entry(frame_lineno)
265 except KeyboardInterrupt:
266 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000267
Guido van Rossum23efba41992-01-27 16:58:47 +0000268 def print_stack_entry(self, frame_lineno):
269 frame, lineno = frame_lineno
270 if frame is self.curframe:
271 print '>',
272 else:
273 print ' ',
274 print self.format_stack_entry(frame_lineno)
Guido van Rossum921c8241992-01-10 14:54:42 +0000275
276
Guido van Rossum35771131992-09-08 11:59:04 +0000277# Simplified interface
278
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000279def run(statement):
280 Pdb().init().run(statement)
281
282def runctx(statement, globals, locals):
283 Pdb().init().runctx(statement, globals, locals)
284
Guido van Rossum4e160981992-09-02 20:43:20 +0000285def runcall(*args):
286 apply(Pdb().init().runcall, args)
287
Guido van Rossum35771131992-09-08 11:59:04 +0000288
289# Post-Mortem interface
290
291def post_mortem(t):
292 p = Pdb().init()
293 p.reset()
294 while t.tb_next <> None: t = t.tb_next
295 p.interaction(t.tb_frame, t)
296
297def pm():
298 import sys
299 post_mortem(sys.last_traceback)
300
301
302# Main program for testing
303
Guido van Rossum23efba41992-01-27 16:58:47 +0000304TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000305
Guido van Rossum921c8241992-01-10 14:54:42 +0000306def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000307 import linecache
Guido van Rossum921c8241992-01-10 14:54:42 +0000308 linecache.checkcache()
Guido van Rossum23efba41992-01-27 16:58:47 +0000309 run(TESTCMD)