blob: b897efb6335154f3770fab333496c1509c41f376 [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 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 Rossumb5699c71998-07-20 23:13:54 +000013import os
Barry Warsaw2bee8fe1999-09-09 16:32:41 +000014import re
15
16def find_function(funcname, filename):
17 cre = re.compile(r'def\s+%s\s*[(]' % funcname)
18 try:
19 fp = open(filename)
20 except IOError:
21 return None
22 # consumer of this info expects the first line to be 1
23 lineno = 1
24 answer = None
25 while 1:
26 line = fp.readline()
27 if line == '':
28 break
29 if cre.match(line):
30 answer = funcname, filename, lineno
31 break
32 lineno = lineno + 1
33 fp.close()
34 return answer
Guido van Rossum921c8241992-01-10 14:54:42 +000035
36
Guido van Rossuma558e371994-11-10 22:27:35 +000037# Interaction prompt line will separate file and call info from code
38# text using value of line_prefix string. A newline and arrow may
39# be to your liking. You can set it once pdb is imported using the
40# command "pdb.line_prefix = '\n% '".
41# line_prefix = ': ' # Use this to get the old situation back
42line_prefix = '\n-> ' # Probably a better default
43
Guido van Rossum23efba41992-01-27 16:58:47 +000044class Pdb(bdb.Bdb, cmd.Cmd):
Guido van Rossum921c8241992-01-10 14:54:42 +000045
Guido van Rossum5ef74b81993-06-23 11:55:24 +000046 def __init__(self):
47 bdb.Bdb.__init__(self)
48 cmd.Cmd.__init__(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000049 self.prompt = '(Pdb) '
Guido van Rossum2424f851998-09-11 22:50:09 +000050 self.aliases = {}
Guido van Rossumb5699c71998-07-20 23:13:54 +000051 # Try to load readline if it exists
52 try:
53 import readline
54 except ImportError:
55 pass
Guido van Rossum2424f851998-09-11 22:50:09 +000056
57 # Read $HOME/.pdbrc and ./.pdbrc
58 self.rcLines = []
59 if os.environ.has_key('HOME'):
60 envHome = os.environ['HOME']
61 try:
62 rcFile = open (envHome + "/.pdbrc")
63 except IOError:
64 pass
65 else:
66 for line in rcFile.readlines():
67 self.rcLines.append (line)
68 rcFile.close()
69 try:
70 rcFile = open ("./.pdbrc")
71 except IOError:
72 pass
73 else:
74 for line in rcFile.readlines():
75 self.rcLines.append (line)
76 rcFile.close()
Guido van Rossum921c8241992-01-10 14:54:42 +000077
78 def reset(self):
Guido van Rossum23efba41992-01-27 16:58:47 +000079 bdb.Bdb.reset(self)
Guido van Rossum921c8241992-01-10 14:54:42 +000080 self.forget()
81
82 def forget(self):
Guido van Rossum921c8241992-01-10 14:54:42 +000083 self.lineno = None
Guido van Rossum6fe08b01992-01-16 13:50:21 +000084 self.stack = []
Guido van Rossum7ac1c811992-01-16 13:55:21 +000085 self.curindex = 0
86 self.curframe = None
Guido van Rossum23efba41992-01-27 16:58:47 +000087
88 def setup(self, f, t):
89 self.forget()
90 self.stack, self.curindex = self.get_stack(f, t)
Guido van Rossum7ac1c811992-01-16 13:55:21 +000091 self.curframe = self.stack[self.curindex][0]
Guido van Rossum3a98e781998-09-17 15:00:30 +000092 self.execRcLines()
Guido van Rossum2424f851998-09-11 22:50:09 +000093
94 # Can be executed earlier than 'setup' if desired
95 def execRcLines(self):
96 if self.rcLines:
97 # Make local copy because of recursion
98 rcLines = self.rcLines
99 # executed only once
100 self.rcLines = []
101 for line in rcLines:
102 line = line[:-1]
103 if len (line) > 0 and line[0] != '#':
104 self.onecmd (line)
Guido van Rossum921c8241992-01-10 14:54:42 +0000105
Guido van Rossum23efba41992-01-27 16:58:47 +0000106 # Override Bdb methods (except user_call, for now)
Guido van Rossumb9142571992-01-12 23:32:55 +0000107
Guido van Rossum23efba41992-01-27 16:58:47 +0000108 def user_line(self, frame):
109 # This function is called when we stop or break at this line
110 self.interaction(frame, None)
Guido van Rossum7ac1c811992-01-16 13:55:21 +0000111
Guido van Rossum23efba41992-01-27 16:58:47 +0000112 def user_return(self, frame, return_value):
113 # This function is called when a return trap is set here
114 frame.f_locals['__return__'] = return_value
115 print '--Return--'
116 self.interaction(frame, None)
Guido van Rossum921c8241992-01-10 14:54:42 +0000117
Guido van Rossum23efba41992-01-27 16:58:47 +0000118 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
119 # This function is called if an exception occurs,
120 # but only if we are to stop at or just below this level
121 frame.f_locals['__exception__'] = exc_type, exc_value
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000122 if type(exc_type) == type(''):
123 exc_type_name = exc_type
124 else: exc_type_name = exc_type.__name__
125 print exc_type_name + ':', repr.repr(exc_value)
Guido van Rossum23efba41992-01-27 16:58:47 +0000126 self.interaction(frame, exc_traceback)
Guido van Rossum921c8241992-01-10 14:54:42 +0000127
Guido van Rossum23efba41992-01-27 16:58:47 +0000128 # General interaction function
Guido van Rossumb9142571992-01-12 23:32:55 +0000129
Guido van Rossum23efba41992-01-27 16:58:47 +0000130 def interaction(self, frame, traceback):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000131 self.setup(frame, traceback)
Guido van Rossumb6aa92e1995-02-03 12:50:04 +0000132 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000133 self.cmdloop()
Guido van Rossumb9142571992-01-12 23:32:55 +0000134 self.forget()
Guido van Rossum23efba41992-01-27 16:58:47 +0000135
Guido van Rossum921c8241992-01-10 14:54:42 +0000136 def default(self, line):
Guido van Rossum23efba41992-01-27 16:58:47 +0000137 if line[:1] == '!': line = line[1:]
138 locals = self.curframe.f_locals
139 globals = self.curframe.f_globals
140 try:
Guido van Rossumf17361d1996-07-30 16:28:13 +0000141 code = compile(line + '\n', '<stdin>', 'single')
Guido van Rossumec8fd941995-08-07 20:16:05 +0000142 exec code in globals, locals
Guido van Rossum23efba41992-01-27 16:58:47 +0000143 except:
Guido van Rossumf15d1591997-09-29 23:22:12 +0000144 t, v = sys.exc_info()[:2]
145 if type(t) == type(''):
146 exc_type_name = t
147 else: exc_type_name = t.__name__
148 print '***', exc_type_name + ':', v
Guido van Rossum23efba41992-01-27 16:58:47 +0000149
Guido van Rossum2424f851998-09-11 22:50:09 +0000150 def precmd(self, line):
Guido van Rossum3a98e781998-09-17 15:00:30 +0000151 # Handle alias expansion and ';;' separator
Guido van Rossum2424f851998-09-11 22:50:09 +0000152 if not line:
153 return line
154 args = string.split(line)
155 while self.aliases.has_key(args[0]):
156 line = self.aliases[args[0]]
157 ii = 1
158 for tmpArg in args[1:]:
159 line = string.replace(line, "%" + str(ii),
160 tmpArg)
161 ii = ii + 1
Guido van Rossum3a98e781998-09-17 15:00:30 +0000162 line = string.replace(line, "%*",
163 string.join(args[1:], ' '))
Guido van Rossum2424f851998-09-11 22:50:09 +0000164 args = string.split(line)
Guido van Rossum3a98e781998-09-17 15:00:30 +0000165 # split into ';;' separated commands
Guido van Rossum2424f851998-09-11 22:50:09 +0000166 # unless it's an alias command
167 if args[0] != 'alias':
Guido van Rossum3a98e781998-09-17 15:00:30 +0000168 marker = string.find(line, ';;')
169 if marker >= 0:
170 # queue up everything after marker
171 next = string.lstrip(line[marker+2:])
Guido van Rossum2424f851998-09-11 22:50:09 +0000172 self.cmdqueue.append(next)
Guido van Rossum3a98e781998-09-17 15:00:30 +0000173 line = string.rstrip(line[:marker])
Guido van Rossum2424f851998-09-11 22:50:09 +0000174 return line
175
Guido van Rossum23efba41992-01-27 16:58:47 +0000176 # Command definitions, called by cmdloop()
177 # The argument is the remaining string on the command line
178 # Return true to exit from the command loop
Guido van Rossum921c8241992-01-10 14:54:42 +0000179
Guido van Rossum23efba41992-01-27 16:58:47 +0000180 do_h = cmd.Cmd.do_help
Guido van Rossumb6775db1994-08-01 11:34:53 +0000181
Guido van Rossum2424f851998-09-11 22:50:09 +0000182 def do_EOF(self, arg):
183 return 0 # Don't die on EOF
184
185 def do_break(self, arg, temporary = 0):
Guido van Rossumb5699c71998-07-20 23:13:54 +0000186 # break [ ([filename:]lineno | function) [, "condition"] ]
Guido van Rossum921c8241992-01-10 14:54:42 +0000187 if not arg:
Guido van Rossum2424f851998-09-11 22:50:09 +0000188 if self.breaks: # There's at least one
189 print "Num Type Disp Enb Where"
190 for bp in bdb.Breakpoint.bpbynumber:
191 if bp:
192 bp.bpprint()
Guido van Rossum921c8241992-01-10 14:54:42 +0000193 return
Guido van Rossumb5699c71998-07-20 23:13:54 +0000194 # parse arguments; comma has lowest precendence
195 # and cannot occur in filename
196 filename = None
197 lineno = None
198 cond = None
199 comma = string.find(arg, ',')
200 if comma > 0:
201 # parse stuff after comma: "condition"
202 cond = string.lstrip(arg[comma+1:])
203 arg = string.rstrip(arg[:comma])
Guido van Rossumb5699c71998-07-20 23:13:54 +0000204 # parse stuff before comma: [filename:]lineno | function
205 colon = string.rfind(arg, ':')
206 if colon >= 0:
207 filename = string.rstrip(arg[:colon])
Guido van Rossum2424f851998-09-11 22:50:09 +0000208 f = self.lookupmodule(filename)
209 if not f:
210 print '*** ', `filename`,
211 print 'not found from sys.path'
212 return
213 else:
214 filename = f
Guido van Rossumb5699c71998-07-20 23:13:54 +0000215 arg = string.lstrip(arg[colon+1:])
216 try:
217 lineno = int(arg)
218 except ValueError, msg:
219 print '*** Bad lineno:', arg
220 return
221 else:
222 # no colon; can be lineno or function
223 try:
224 lineno = int(arg)
225 except ValueError:
226 try:
227 func = eval(arg,
228 self.curframe.f_globals,
229 self.curframe.f_locals)
230 except:
Guido van Rossum2424f851998-09-11 22:50:09 +0000231 func = arg
Guido van Rossumb5699c71998-07-20 23:13:54 +0000232 try:
233 if hasattr(func, 'im_func'):
234 func = func.im_func
235 code = func.func_code
Guido van Rossum2424f851998-09-11 22:50:09 +0000236 lineno = code.co_firstlineno
Guido van Rossumb5699c71998-07-20 23:13:54 +0000237 filename = code.co_filename
Guido van Rossum2424f851998-09-11 22:50:09 +0000238 except:
239 # last thing to try
240 (ok, filename, ln) = self.lineinfo(arg)
241 if not ok:
242 print '*** The specified object',
243 print `arg`,
244 print 'is not a function'
245 print ('or was not found '
246 'along sys.path.')
247 return
248 lineno = int(ln)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000249 if not filename:
Guido van Rossum2424f851998-09-11 22:50:09 +0000250 filename = self.defaultFile()
251 # Check for reasonable breakpoint
252 line = self.checkline(filename, lineno)
253 if line:
254 # now set the break point
255 err = self.set_break(filename, line, temporary, cond)
256 if err: print '***', err
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000257 else:
258 bp = self.get_breaks(filename, line)[-1]
259 print "Breakpoint %d at %s:%d" % (bp.number,
260 bp.file,
261 bp.line)
Guido van Rossum2424f851998-09-11 22:50:09 +0000262
263 # To be overridden in derived debuggers
264 def defaultFile(self):
265 # Produce a reasonable default
266 filename = self.curframe.f_code.co_filename
267 if filename == '<string>' and mainpyfile:
268 filename = mainpyfile
269 return filename
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000270
Guido van Rossum921c8241992-01-10 14:54:42 +0000271 do_b = do_break
272
Guido van Rossum2424f851998-09-11 22:50:09 +0000273 def do_tbreak(self, arg):
274 self.do_break(arg, 1)
275
276 def lineinfo(self, identifier):
277 failed = (None, None, None)
278 # Input is identifier, may be in single quotes
279 idstring = string.split(identifier, "'")
280 if len(idstring) == 1:
281 # not in single quotes
282 id = string.strip(idstring[0])
283 elif len(idstring) == 3:
284 # quoted
285 id = string.strip(idstring[1])
286 else:
287 return failed
288 if id == '': return failed
289 parts = string.split(id, '.')
290 # Protection for derived debuggers
291 if parts[0] == 'self':
292 del parts[0]
293 if len(parts) == 0:
294 return failed
295 # Best first guess at file to look at
296 fname = self.defaultFile()
297 if len(parts) == 1:
298 item = parts[0]
299 else:
300 # More than one part.
301 # First is module, second is method/class
302 f = self.lookupmodule(parts[0])
303 if f:
304 fname = f
305 item = parts[1]
Barry Warsaw2bee8fe1999-09-09 16:32:41 +0000306 answer = find_function(item, fname)
307 return answer or failed
Guido van Rossum2424f851998-09-11 22:50:09 +0000308
309 def checkline(self, filename, lineno):
310 """Return line number of first line at or after input
311 argument such that if the input points to a 'def', the
312 returned line number is the first
313 non-blank/non-comment line to follow. If the input
314 points to a blank or comment line, return 0. At end
315 of file, also return 0."""
316
317 line = linecache.getline(filename, lineno)
318 if not line:
319 print 'End of file'
320 return 0
321 line = string.strip(line)
322 # Don't allow setting breakpoint at a blank line
323 if ( not line or (line[0] == '#') or
324 (line[:3] == '"""') or line[:3] == "'''" ):
325 print '*** Blank or comment'
326 return 0
327 # When a file is read in and a breakpoint is at
328 # the 'def' statement, the system stops there at
329 # code parse time. We don't want that, so all breakpoints
330 # set at 'def' statements are moved one line onward
331 if line[:3] == 'def':
332 incomment = ''
333 while 1:
334 lineno = lineno+1
335 line = linecache.getline(filename, lineno)
336 if not line:
337 print 'end of file'
338 return 0
339 line = string.strip(line)
340 if incomment:
341 if len(line) < 3: continue
342 if (line[-3:] == incomment):
343 incomment = ''
344 continue
345 if not line: continue # Blank line
346 if len(line) >= 3:
347 if (line[:3] == '"""'
348 or line[:3] == "'''"):
349 incomment = line[:3]
350 continue
351 if line[0] != '#': break
352 return lineno
353
354 def do_enable(self, arg):
355 args = string.split(arg)
356 for i in args:
357 bp = bdb.Breakpoint.bpbynumber[int(i)]
358 if bp:
359 bp.enable()
360
361 def do_disable(self, arg):
362 args = string.split(arg)
363 for i in args:
364 bp = bdb.Breakpoint.bpbynumber[int(i)]
365 if bp:
366 bp.disable()
367
368 def do_condition(self, arg):
369 # arg is breakpoint number and condition
370 args = string.split(arg, ' ', 1)
371 bpnum = int(string.strip(args[0]))
372 try:
373 cond = args[1]
374 except:
375 cond = None
376 bp = bdb.Breakpoint.bpbynumber[bpnum]
377 if bp:
378 bp.cond = cond
379 if not cond:
380 print 'Breakpoint', bpnum,
381 print 'is now unconditional.'
382
383 def do_ignore(self,arg):
384 # arg is bp number followed by ignore count
385 args = string.split(arg)
386 bpnum = int(string.strip(args[0]))
387 try:
388 count = int(string.strip(args[1]))
389 except:
390 count = 0
391 bp = bdb.Breakpoint.bpbynumber[bpnum]
392 if bp:
393 bp.ignore = count
394 if (count > 0):
395 reply = 'Will ignore next '
396 if (count > 1):
397 reply = reply + '%d crossings' % count
398 else:
399 reply = reply + '1 crossing'
400 print reply + ' of breakpoint %d.' % bpnum
401 else:
402 print 'Will stop next time breakpoint',
403 print bpnum, 'is reached.'
404
Guido van Rossum921c8241992-01-10 14:54:42 +0000405 def do_clear(self, arg):
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000406 # Three possibilities, tried in this order:
407 # clear -> clear all breaks, ask for confirmation
408 # clear file:lineno -> clear all breaks at file:lineno
409 # clear bpno bpno ... -> clear breakpoints by number
Guido van Rossum921c8241992-01-10 14:54:42 +0000410 if not arg:
Guido van Rossumb9142571992-01-12 23:32:55 +0000411 try:
412 reply = raw_input('Clear all breaks? ')
413 except EOFError:
414 reply = 'no'
415 reply = string.lower(string.strip(reply))
416 if reply in ('y', 'yes'):
Guido van Rossum23efba41992-01-27 16:58:47 +0000417 self.clear_all_breaks()
Guido van Rossum921c8241992-01-10 14:54:42 +0000418 return
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000419 if ':' in arg:
420 # Make sure it works for "clear C:\foo\bar.py:12"
421 i = string.rfind(arg, ':')
422 filename = arg[:i]
423 arg = arg[i+1:]
424 try:
425 lineno = int(arg)
426 except:
427 err = "Invalid line number (%s)" % arg
428 else:
429 err = self.clear_break(filename, lineno)
430 if err: print '***', err
431 return
Guido van Rossum2424f851998-09-11 22:50:09 +0000432 numberlist = string.split(arg)
433 for i in numberlist:
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000434 err = self.clear_bpbynumber(i)
Guido van Rossum2424f851998-09-11 22:50:09 +0000435 if err:
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000436 print '***', err
Guido van Rossum2424f851998-09-11 22:50:09 +0000437 else:
438 print 'Deleted breakpoint %s ' % (i,)
Guido van Rossumb9142571992-01-12 23:32:55 +0000439 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
Guido van Rossum921c8241992-01-10 14:54:42 +0000440
441 def do_where(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000442 self.print_stack_trace()
Guido van Rossum921c8241992-01-10 14:54:42 +0000443 do_w = do_where
444
445 def do_up(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000446 if self.curindex == 0:
447 print '*** Oldest frame'
Guido van Rossum921c8241992-01-10 14:54:42 +0000448 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000449 self.curindex = self.curindex - 1
450 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000451 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000452 self.lineno = None
Guido van Rossumb9142571992-01-12 23:32:55 +0000453 do_u = do_up
454
455 def do_down(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000456 if self.curindex + 1 == len(self.stack):
457 print '*** Newest frame'
Guido van Rossumb9142571992-01-12 23:32:55 +0000458 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000459 self.curindex = self.curindex + 1
460 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000461 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000462 self.lineno = None
Guido van Rossum921c8241992-01-10 14:54:42 +0000463 do_d = do_down
464
465 def do_step(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000466 self.set_step()
Guido van Rossumb9142571992-01-12 23:32:55 +0000467 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000468 do_s = do_step
469
470 def do_next(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000471 self.set_next(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000472 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000473 do_n = do_next
474
Guido van Rossumb9142571992-01-12 23:32:55 +0000475 def do_return(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000476 self.set_return(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000477 return 1
478 do_r = do_return
479
Guido van Rossum921c8241992-01-10 14:54:42 +0000480 def do_continue(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000481 self.set_continue()
Guido van Rossumb9142571992-01-12 23:32:55 +0000482 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000483 do_c = do_cont = do_continue
484
485 def do_quit(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000486 self.set_quit()
487 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000488 do_q = do_quit
489
Guido van Rossum23efba41992-01-27 16:58:47 +0000490 def do_args(self, arg):
Guido van Rossum46c86bb1998-02-25 20:50:32 +0000491 f = self.curframe
492 co = f.f_code
493 dict = f.f_locals
494 n = co.co_argcount
495 if co.co_flags & 4: n = n+1
496 if co.co_flags & 8: n = n+1
497 for i in range(n):
498 name = co.co_varnames[i]
499 print name, '=',
500 if dict.has_key(name): print dict[name]
501 else: print "*** undefined ***"
Guido van Rossum23efba41992-01-27 16:58:47 +0000502 do_a = do_args
503
504 def do_retval(self, arg):
505 if self.curframe.f_locals.has_key('__return__'):
506 print self.curframe.f_locals['__return__']
507 else:
508 print '*** Not yet returned!'
509 do_rv = do_retval
510
511 def do_p(self, arg):
512 try:
Guido van Rossum2424f851998-09-11 22:50:09 +0000513 value = eval(arg, self.curframe.f_globals,
Guido van Rossum23efba41992-01-27 16:58:47 +0000514 self.curframe.f_locals)
515 except:
Guido van Rossumf15d1591997-09-29 23:22:12 +0000516 t, v = sys.exc_info()[:2]
517 if type(t) == type(''):
518 exc_type_name = t
519 else: exc_type_name = t.__name__
520 print '***', exc_type_name + ':', `v`
Guido van Rossum23efba41992-01-27 16:58:47 +0000521 return
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000522
Guido van Rossum23efba41992-01-27 16:58:47 +0000523 print `value`
524
Guido van Rossum921c8241992-01-10 14:54:42 +0000525 def do_list(self, arg):
Guido van Rossumb9142571992-01-12 23:32:55 +0000526 self.lastcmd = 'list'
Guido van Rossum921c8241992-01-10 14:54:42 +0000527 last = None
528 if arg:
529 try:
530 x = eval(arg, {}, {})
531 if type(x) == type(()):
532 first, last = x
533 first = int(first)
534 last = int(last)
535 if last < first:
536 # Assume it's a count
537 last = first + last
538 else:
Guido van Rossumc629d341992-11-05 10:43:02 +0000539 first = max(1, int(x) - 5)
Guido van Rossum921c8241992-01-10 14:54:42 +0000540 except:
541 print '*** Error in argument:', `arg`
542 return
543 elif self.lineno is None:
544 first = max(1, self.curframe.f_lineno - 5)
545 else:
546 first = self.lineno + 1
Guido van Rossumc629d341992-11-05 10:43:02 +0000547 if last == None:
Guido van Rossum921c8241992-01-10 14:54:42 +0000548 last = first + 10
549 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000550 breaklist = self.get_file_breaks(filename)
Guido van Rossum921c8241992-01-10 14:54:42 +0000551 try:
552 for lineno in range(first, last+1):
553 line = linecache.getline(filename, lineno)
554 if not line:
555 print '[EOF]'
556 break
557 else:
558 s = string.rjust(`lineno`, 3)
559 if len(s) < 4: s = s + ' '
560 if lineno in breaklist: s = s + 'B'
561 else: s = s + ' '
562 if lineno == self.curframe.f_lineno:
563 s = s + '->'
564 print s + '\t' + line,
565 self.lineno = lineno
566 except KeyboardInterrupt:
567 pass
568 do_l = do_list
Guido van Rossum00230781993-03-29 11:39:45 +0000569
570 def do_whatis(self, arg):
Guido van Rossum00230781993-03-29 11:39:45 +0000571 try:
Guido van Rossum2424f851998-09-11 22:50:09 +0000572 value = eval(arg, self.curframe.f_globals,
Guido van Rossum00230781993-03-29 11:39:45 +0000573 self.curframe.f_locals)
574 except:
Guido van Rossumf15d1591997-09-29 23:22:12 +0000575 t, v = sys.exc_info()[:2]
576 if type(t) == type(''):
577 exc_type_name = t
578 else: exc_type_name = t.__name__
579 print '***', exc_type_name + ':', `v`
Guido van Rossum00230781993-03-29 11:39:45 +0000580 return
581 code = None
582 # Is it a function?
583 try: code = value.func_code
584 except: pass
585 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000586 print 'Function', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000587 return
588 # Is it an instance method?
589 try: code = value.im_func.func_code
590 except: pass
591 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000592 print 'Method', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000593 return
594 # None of the above...
595 print type(value)
Guido van Rossum2424f851998-09-11 22:50:09 +0000596
597 def do_alias(self, arg):
598 args = string.split (arg)
599 if len(args) == 0:
600 keys = self.aliases.keys()
601 keys.sort()
602 for alias in keys:
603 print "%s = %s" % (alias, self.aliases[alias])
604 return
605 if self.aliases.has_key(args[0]) and len (args) == 1:
606 print "%s = %s" % (args[0], self.aliases[args[0]])
607 else:
608 self.aliases[args[0]] = string.join(args[1:], ' ')
609
610 def do_unalias(self, arg):
611 args = string.split (arg)
612 if len(args) == 0: return
613 if self.aliases.has_key(args[0]):
614 del self.aliases[args[0]]
615
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000616 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000617 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000618 # this is different from dbx and gdb, but consistent with
619 # the Python interpreter's stack trace.
620 # It is also consistent with the up/down commands (which are
621 # compatible with dbx and gdb: up moves towards 'main()'
622 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000623
Guido van Rossum23efba41992-01-27 16:58:47 +0000624 def print_stack_trace(self):
625 try:
626 for frame_lineno in self.stack:
627 self.print_stack_entry(frame_lineno)
628 except KeyboardInterrupt:
629 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000630
Guido van Rossumb6aa92e1995-02-03 12:50:04 +0000631 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
Guido van Rossum23efba41992-01-27 16:58:47 +0000632 frame, lineno = frame_lineno
633 if frame is self.curframe:
634 print '>',
635 else:
636 print ' ',
Guido van Rossuma558e371994-11-10 22:27:35 +0000637 print self.format_stack_entry(frame_lineno, prompt_prefix)
Guido van Rossum921c8241992-01-10 14:54:42 +0000638
639
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640 # Help methods (derived from pdb.doc)
641
642 def help_help(self):
643 self.help_h()
644
645 def help_h(self):
646 print """h(elp)
647 Without argument, print the list of available commands.
648 With a command name as argument, print help about that command
649 "help pdb" pipes the full documentation file to the $PAGER
650 "help exec" gives help on the ! command"""
651
652 def help_where(self):
653 self.help_w()
654
655 def help_w(self):
656 print """w(here)
657 Print a stack trace, with the most recent frame at the bottom.
658 An arrow indicates the "current frame", which determines the
659 context of most commands."""
660
661 def help_down(self):
662 self.help_d()
663
664 def help_d(self):
665 print """d(own)
666 Move the current frame one level down in the stack trace
667 (to an older frame)."""
668
669 def help_up(self):
670 self.help_u()
671
672 def help_u(self):
673 print """u(p)
674 Move the current frame one level up in the stack trace
675 (to a newer frame)."""
676
677 def help_break(self):
678 self.help_b()
679
680 def help_b(self):
Guido van Rossum3a98e781998-09-17 15:00:30 +0000681 print """b(reak) ([file:]lineno | function) [, condition]
Guido van Rossumb6775db1994-08-01 11:34:53 +0000682 With a line number argument, set a break there in the current
Guido van Rossum2424f851998-09-11 22:50:09 +0000683 file. With a function name, set a break at first executable line
684 of that function. Without argument, list all breaks. If a second
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000685 argument is present, it is a string specifying an expression
686 which must evaluate to true before the breakpoint is honored.
Guido van Rossumb5699c71998-07-20 23:13:54 +0000687
688 The line number may be prefixed with a filename and a colon,
689 to specify a breakpoint in another file (probably one that
Guido van Rossum2424f851998-09-11 22:50:09 +0000690 hasn't been loaded yet). The file is searched for on sys.path;
Guido van Rossum1f00eed1998-07-22 13:35:21 +0000691 the .py suffix may be omitted."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000692
693 def help_clear(self):
694 self.help_cl()
695
696 def help_cl(self):
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000697 print "cl(ear) filename:lineno"
Guido van Rossum2424f851998-09-11 22:50:09 +0000698 print """cl(ear) [bpnumber [bpnumber...]]
699 With a space separated list of breakpoint numbers, clear
700 those breakpoints. Without argument, clear all breaks (but
Guido van Rossum816a9fb1999-01-25 20:56:07 +0000701 first ask confirmation). With a filename:lineno argument,
702 clear all breaks at that line in that file.
Guido van Rossumb5699c71998-07-20 23:13:54 +0000703
Guido van Rossum2424f851998-09-11 22:50:09 +0000704 Note that the argument is different from previous versions of
705 the debugger (in python distributions 1.5.1 and before) where
Guido van Rossumb657c931999-01-28 14:38:32 +0000706 a linenumber was used instead of either filename:lineno or
707 breakpoint numbers."""
Guido van Rossum2424f851998-09-11 22:50:09 +0000708
709 def help_tbreak(self):
710 print """tbreak same arguments as break, but breakpoint is
711 removed when first hit."""
712
713 def help_enable(self):
714 print """enable bpnumber [bpnumber ...]
715 Enables the breakpoints given as a space separated list of
716 bp numbers."""
717
718 def help_disable(self):
719 print """disable bpnumber [bpnumber ...]
720 Disables the breakpoints given as a space separated list of
721 bp numbers."""
722
723 def help_ignore(self):
724 print """ignore bpnumber count
725 Sets the ignore count for the given breakpoint number. A breakpoint
726 becomes active when the ignore count is zero. When non-zero, the
727 count is decremented each time the breakpoint is reached and the
728 breakpoint is not disabled and any associated condition evaluates
729 to true."""
730
731 def help_condition(self):
732 print """condition bpnumber str_condition
733 str_condition is a string specifying an expression which
734 must evaluate to true before the breakpoint is honored.
735 If str_condition is absent, any existing condition is removed;
736 i.e., the breakpoint is made unconditional."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737
738 def help_step(self):
739 self.help_s()
740
741 def help_s(self):
742 print """s(tep)
743 Execute the current line, stop at the first possible occasion
744 (either in a function that is called or in the current function)."""
745
746 def help_next(self):
747 self.help_n()
748
749 def help_n(self):
750 print """n(ext)
751 Continue execution until the next line in the current function
752 is reached or it returns."""
753
754 def help_return(self):
755 self.help_r()
756
757 def help_r(self):
758 print """r(eturn)
759 Continue execution until the current function returns."""
760
761 def help_continue(self):
762 self.help_c()
763
764 def help_cont(self):
765 self.help_c()
766
767 def help_c(self):
768 print """c(ont(inue))
769 Continue execution, only stop when a breakpoint is encountered."""
770
771 def help_list(self):
772 self.help_l()
773
774 def help_l(self):
775 print """l(ist) [first [,last]]
776 List source code for the current file.
777 Without arguments, list 11 lines around the current line
778 or continue the previous listing.
779 With one argument, list 11 lines starting at that line.
780 With two arguments, list the given range;
781 if the second argument is less than the first, it is a count."""
782
783 def help_args(self):
784 self.help_a()
785
786 def help_a(self):
787 print """a(rgs)
Guido van Rossum46c86bb1998-02-25 20:50:32 +0000788 Print the arguments of the current function."""
Guido van Rossumb6775db1994-08-01 11:34:53 +0000789
790 def help_p(self):
791 print """p expression
792 Print the value of the expression."""
793
794 def help_exec(self):
795 print """(!) statement
796 Execute the (one-line) statement in the context of
797 the current stack frame.
798 The exclamation point can be omitted unless the first word
799 of the statement resembles a debugger command.
800 To assign to a global variable you must always prefix the
801 command with a 'global' command, e.g.:
802 (Pdb) global list_options; list_options = ['-l']
803 (Pdb)"""
804
805 def help_quit(self):
806 self.help_q()
807
808 def help_q(self):
809 print """q(uit) Quit from the debugger.
810 The program being executed is aborted."""
811
Guido van Rossum2424f851998-09-11 22:50:09 +0000812 def help_whatis(self):
813 print """whatis arg
814 Prints the type of the argument."""
815
816 def help_EOF(self):
817 print """EOF
818 Handles the receipt of EOF as a command."""
819
820 def help_alias(self):
821 print """alias [name [command [parameter parameter ...] ]]
822 Creates an alias called 'name' the executes 'command'. The command
823 must *not* be enclosed in quotes. Replaceable parameters are
824 indicated by %1, %2, and so on, while %* is replaced by all the
825 parameters. If no command is given, the current alias for name
826 is shown. If no name is given, all aliases are listed.
827
828 Aliases may be nested and can contain anything that can be
829 legally typed at the pdb prompt. Note! You *can* override
830 internal pdb commands with aliases! Those internal commands
831 are then hidden until the alias is removed. Aliasing is recursively
832 applied to the first word of the command line; all other words
833 in the line are left alone.
834
835 Some useful aliases (especially when placed in the .pdbrc file) are:
836
837 #Print instance variables (usage "pi classInst")
838 alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
839
840 #Print instance variables in self
841 alias ps pi self
842 """
843
844 def help_unalias(self):
845 print """unalias name
846 Deletes the specified alias."""
847
Guido van Rossumb6775db1994-08-01 11:34:53 +0000848 def help_pdb(self):
849 help()
850
Guido van Rossumb5699c71998-07-20 23:13:54 +0000851 # Helper function for break/clear parsing -- may be overridden
852
853 def lookupmodule(self, filename):
Guido van Rossum1f00eed1998-07-22 13:35:21 +0000854 root, ext = os.path.splitext(filename)
855 if ext == '':
856 filename = filename + '.py'
857 if os.path.isabs(filename):
858 return filename
Guido van Rossumb5699c71998-07-20 23:13:54 +0000859 for dirname in sys.path:
Guido van Rossum2424f851998-09-11 22:50:09 +0000860 while os.path.islink(dirname):
861 dirname = os.readlink(dirname)
Guido van Rossumb5699c71998-07-20 23:13:54 +0000862 fullname = os.path.join(dirname, filename)
863 if os.path.exists(fullname):
864 return fullname
Guido van Rossum2424f851998-09-11 22:50:09 +0000865 return None
Guido van Rossumb5699c71998-07-20 23:13:54 +0000866
Guido van Rossum35771131992-09-08 11:59:04 +0000867# Simplified interface
868
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000869def run(statement, globals=None, locals=None):
870 Pdb().run(statement, globals, locals)
871
872def runeval(expression, globals=None, locals=None):
873 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000874
875def runctx(statement, globals, locals):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000876 # B/W compatibility
877 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000878
Guido van Rossum4e160981992-09-02 20:43:20 +0000879def runcall(*args):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000880 return apply(Pdb().runcall, args)
Guido van Rossum4e160981992-09-02 20:43:20 +0000881
Guido van Rossumb6775db1994-08-01 11:34:53 +0000882def set_trace():
883 Pdb().set_trace()
Guido van Rossum35771131992-09-08 11:59:04 +0000884
885# Post-Mortem interface
886
887def post_mortem(t):
Guido van Rossum5ef74b81993-06-23 11:55:24 +0000888 p = Pdb()
Guido van Rossum35771131992-09-08 11:59:04 +0000889 p.reset()
890 while t.tb_next <> None: t = t.tb_next
891 p.interaction(t.tb_frame, t)
892
893def pm():
Guido van Rossum35771131992-09-08 11:59:04 +0000894 post_mortem(sys.last_traceback)
895
896
897# Main program for testing
898
Guido van Rossum23efba41992-01-27 16:58:47 +0000899TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000900
Guido van Rossum921c8241992-01-10 14:54:42 +0000901def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000902 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +0000903
904# print help
905def help():
906 for dirname in sys.path:
907 fullname = os.path.join(dirname, 'pdb.doc')
908 if os.path.exists(fullname):
909 sts = os.system('${PAGER-more} '+fullname)
910 if sts: print '*** Pager exit status:', sts
911 break
912 else:
913 print 'Sorry, can\'t find the help file "pdb.doc"',
914 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +0000915
Guido van Rossumb5699c71998-07-20 23:13:54 +0000916mainmodule = ''
917mainpyfile = ''
918
Guido van Rossumf17361d1996-07-30 16:28:13 +0000919# When invoked as main program, invoke the debugger on a script
920if __name__=='__main__':
Guido van Rossumf17361d1996-07-30 16:28:13 +0000921 if not sys.argv[1:]:
922 print "usage: pdb.py scriptfile [arg] ..."
923 sys.exit(2)
924
Guido van Rossumb5699c71998-07-20 23:13:54 +0000925 mainpyfile = filename = sys.argv[1] # Get script filename
926 if not os.path.exists(filename):
927 print 'Error:', `filename`, 'does not exist'
928 sys.exit(1)
929 mainmodule = os.path.basename(filename)
Guido van Rossumec577d51996-09-10 17:39:34 +0000930 del sys.argv[0] # Hide "pdb.py" from argument list
931
932 # Insert script directory in front of module search path
933 sys.path.insert(0, os.path.dirname(filename))
Guido van Rossumf17361d1996-07-30 16:28:13 +0000934
Guido van Rossumc2047c11998-10-15 01:38:23 +0000935 run('execfile(' + `filename` + ')')