blob: 48d0b2719f2b95d388b6237d08cb9a79c3ddea26 [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 Rossumb9142571992-01-12 23:32:55 +0000228
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000229 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000230 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000231 # this is different from dbx and gdb, but consistent with
232 # the Python interpreter's stack trace.
233 # It is also consistent with the up/down commands (which are
234 # compatible with dbx and gdb: up moves towards 'main()'
235 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000236
Guido van Rossum23efba41992-01-27 16:58:47 +0000237 def print_stack_trace(self):
238 try:
239 for frame_lineno in self.stack:
240 self.print_stack_entry(frame_lineno)
241 except KeyboardInterrupt:
242 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000243
Guido van Rossum23efba41992-01-27 16:58:47 +0000244 def print_stack_entry(self, frame_lineno):
245 frame, lineno = frame_lineno
246 if frame is self.curframe:
247 print '>',
248 else:
249 print ' ',
250 print self.format_stack_entry(frame_lineno)
Guido van Rossum921c8241992-01-10 14:54:42 +0000251
252
Guido van Rossum35771131992-09-08 11:59:04 +0000253# Simplified interface
254
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000255def run(statement):
256 Pdb().init().run(statement)
257
258def runctx(statement, globals, locals):
259 Pdb().init().runctx(statement, globals, locals)
260
Guido van Rossum4e160981992-09-02 20:43:20 +0000261def runcall(*args):
262 apply(Pdb().init().runcall, args)
263
Guido van Rossum35771131992-09-08 11:59:04 +0000264
265# Post-Mortem interface
266
267def post_mortem(t):
268 p = Pdb().init()
269 p.reset()
270 while t.tb_next <> None: t = t.tb_next
271 p.interaction(t.tb_frame, t)
272
273def pm():
274 import sys
275 post_mortem(sys.last_traceback)
276
277
278# Main program for testing
279
Guido van Rossum23efba41992-01-27 16:58:47 +0000280TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000281
Guido van Rossum921c8241992-01-10 14:54:42 +0000282def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000283 import linecache
Guido van Rossum921c8241992-01-10 14:54:42 +0000284 linecache.checkcache()
Guido van Rossum23efba41992-01-27 16:58:47 +0000285 run(TESTCMD)