blob: 99e619146c754815eb26586223348dc6072158a6 [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 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
Guido van Rossum9e1ee971997-07-11 13:43:53 +000099 try:
100 arg = eval(arg, self.curframe.f_globals,
101 self.curframe.f_locals)
102 except:
103 print '*** Could not eval argument:', arg
104 return
105
106 # Check for condition
107 try: arg, cond = arg
108 except: arg, cond = arg, None
109
Guido van Rossumb6775db1994-08-01 11:34:53 +0000110 try:
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000111 lineno = int(arg)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000112 filename = self.curframe.f_code.co_filename
Guido van Rossum921c8241992-01-10 14:54:42 +0000113 except:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000114 # Try function name as the argument
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115 try:
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000116 func = arg
Guido van Rossumb6775db1994-08-01 11:34:53 +0000117 if hasattr(func, 'im_func'):
118 func = func.im_func
119 code = func.func_code
120 except:
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000121 print '*** The specified object',
122 print 'is not a function', arg
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123 return
Guido van Rossumc4448651997-07-18 16:47:40 +0000124 lineno = code.co_firstlineno
Guido van Rossumb6775db1994-08-01 11:34:53 +0000125 filename = code.co_filename
126
127 # now set the break point
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000128 err = self.set_break(filename, lineno, cond)
Guido van Rossum23efba41992-01-27 16:58:47 +0000129 if err: print '***', err
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000130
Guido van Rossum921c8241992-01-10 14:54:42 +0000131 do_b = do_break
132
133 def do_clear(self, arg):
134 if not arg:
Guido van Rossumb9142571992-01-12 23:32:55 +0000135 try:
136 reply = raw_input('Clear all breaks? ')
137 except EOFError:
138 reply = 'no'
139 reply = string.lower(string.strip(reply))
140 if reply in ('y', 'yes'):
Guido van Rossum23efba41992-01-27 16:58:47 +0000141 self.clear_all_breaks()
Guido van Rossum921c8241992-01-10 14:54:42 +0000142 return
143 try:
144 lineno = int(eval(arg))
145 except:
146 print '*** Error in argument:', `arg`
147 return
148 filename = self.curframe.f_code.co_filename
Guido van Rossum89a78691992-12-14 12:57:56 +0000149 err = self.clear_break(filename, lineno)
Guido van Rossum23efba41992-01-27 16:58:47 +0000150 if err: print '***', err
Guido van Rossumb9142571992-01-12 23:32:55 +0000151 do_cl = do_clear # 'c' is already an abbreviation for 'continue'
Guido van Rossum921c8241992-01-10 14:54:42 +0000152
153 def do_where(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000154 self.print_stack_trace()
Guido van Rossum921c8241992-01-10 14:54:42 +0000155 do_w = do_where
156
157 def do_up(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000158 if self.curindex == 0:
159 print '*** Oldest frame'
Guido van Rossum921c8241992-01-10 14:54:42 +0000160 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000161 self.curindex = self.curindex - 1
162 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000163 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000164 self.lineno = None
Guido van Rossumb9142571992-01-12 23:32:55 +0000165 do_u = do_up
166
167 def do_down(self, arg):
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000168 if self.curindex + 1 == len(self.stack):
169 print '*** Newest frame'
Guido van Rossumb9142571992-01-12 23:32:55 +0000170 else:
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000171 self.curindex = self.curindex + 1
172 self.curframe = self.stack[self.curindex][0]
Guido van Rossum23efba41992-01-27 16:58:47 +0000173 self.print_stack_entry(self.stack[self.curindex])
Guido van Rossumc629d341992-11-05 10:43:02 +0000174 self.lineno = None
Guido van Rossum921c8241992-01-10 14:54:42 +0000175 do_d = do_down
176
177 def do_step(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000178 self.set_step()
Guido van Rossumb9142571992-01-12 23:32:55 +0000179 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000180 do_s = do_step
181
182 def do_next(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000183 self.set_next(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000184 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000185 do_n = do_next
186
Guido van Rossumb9142571992-01-12 23:32:55 +0000187 def do_return(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000188 self.set_return(self.curframe)
Guido van Rossumb9142571992-01-12 23:32:55 +0000189 return 1
190 do_r = do_return
191
Guido van Rossum921c8241992-01-10 14:54:42 +0000192 def do_continue(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000193 self.set_continue()
Guido van Rossumb9142571992-01-12 23:32:55 +0000194 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000195 do_c = do_cont = do_continue
196
197 def do_quit(self, arg):
Guido van Rossum23efba41992-01-27 16:58:47 +0000198 self.set_quit()
199 return 1
Guido van Rossum921c8241992-01-10 14:54:42 +0000200 do_q = do_quit
201
Guido van Rossum23efba41992-01-27 16:58:47 +0000202 def do_args(self, arg):
Guido van Rossumb6775db1994-08-01 11:34:53 +0000203 if self.curframe.f_locals.has_key('__args__'):
204 print `self.curframe.f_locals['__args__']`
Guido van Rossum23efba41992-01-27 16:58:47 +0000205 else:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000206 print '*** No arguments?!'
Guido van Rossum23efba41992-01-27 16:58:47 +0000207 do_a = do_args
208
209 def do_retval(self, arg):
210 if self.curframe.f_locals.has_key('__return__'):
211 print self.curframe.f_locals['__return__']
212 else:
213 print '*** Not yet returned!'
214 do_rv = do_retval
215
216 def do_p(self, arg):
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000217 self.curframe.f_globals['__privileged__'] = 1
Guido van Rossum23efba41992-01-27 16:58:47 +0000218 try:
219 value = eval(arg, self.curframe.f_globals, \
220 self.curframe.f_locals)
221 except:
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000222 if type(sys.exc_type) == type(''):
223 exc_type_name = sys.exc_type
224 else: exc_type_name = sys.exc_type.__name__
225 print '***', exc_type_name + ':', `sys.exc_value`
Guido van Rossum23efba41992-01-27 16:58:47 +0000226 return
Guido van Rossum8e2ec561993-07-29 09:37:38 +0000227
Guido van Rossum23efba41992-01-27 16:58:47 +0000228 print `value`
229
Guido van Rossum921c8241992-01-10 14:54:42 +0000230 def do_list(self, arg):
Guido van Rossumb9142571992-01-12 23:32:55 +0000231 self.lastcmd = 'list'
Guido van Rossum921c8241992-01-10 14:54:42 +0000232 last = None
233 if arg:
234 try:
235 x = eval(arg, {}, {})
236 if type(x) == type(()):
237 first, last = x
238 first = int(first)
239 last = int(last)
240 if last < first:
241 # Assume it's a count
242 last = first + last
243 else:
Guido van Rossumc629d341992-11-05 10:43:02 +0000244 first = max(1, int(x) - 5)
Guido van Rossum921c8241992-01-10 14:54:42 +0000245 except:
246 print '*** Error in argument:', `arg`
247 return
248 elif self.lineno is None:
249 first = max(1, self.curframe.f_lineno - 5)
250 else:
251 first = self.lineno + 1
Guido van Rossumc629d341992-11-05 10:43:02 +0000252 if last == None:
Guido van Rossum921c8241992-01-10 14:54:42 +0000253 last = first + 10
254 filename = self.curframe.f_code.co_filename
Guido van Rossum23efba41992-01-27 16:58:47 +0000255 breaklist = self.get_file_breaks(filename)
Guido van Rossum921c8241992-01-10 14:54:42 +0000256 try:
257 for lineno in range(first, last+1):
258 line = linecache.getline(filename, lineno)
259 if not line:
260 print '[EOF]'
261 break
262 else:
263 s = string.rjust(`lineno`, 3)
264 if len(s) < 4: s = s + ' '
265 if lineno in breaklist: s = s + 'B'
266 else: s = s + ' '
267 if lineno == self.curframe.f_lineno:
268 s = s + '->'
269 print s + '\t' + line,
270 self.lineno = lineno
271 except KeyboardInterrupt:
272 pass
273 do_l = do_list
Guido van Rossum00230781993-03-29 11:39:45 +0000274
275 def do_whatis(self, arg):
Guido van Rossum00230781993-03-29 11:39:45 +0000276 try:
277 value = eval(arg, self.curframe.f_globals, \
278 self.curframe.f_locals)
279 except:
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000280 if type(sys.exc_type) == type(''):
281 exc_type_name = sys.exc_type
282 else: exc_type_name = sys.exc_type.__name__
283 print '***', exc_type_name + ':', `sys.exc_value`
Guido van Rossum00230781993-03-29 11:39:45 +0000284 return
285 code = None
286 # Is it a function?
287 try: code = value.func_code
288 except: pass
289 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000290 print 'Function', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000291 return
292 # Is it an instance method?
293 try: code = value.im_func.func_code
294 except: pass
295 if code:
Guido van Rossumb6775db1994-08-01 11:34:53 +0000296 print 'Method', code.co_name
Guido van Rossum00230781993-03-29 11:39:45 +0000297 return
298 # None of the above...
299 print type(value)
Guido van Rossumb9142571992-01-12 23:32:55 +0000300
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000301 # Print a traceback starting at the top stack frame.
Guido van Rossum23efba41992-01-27 16:58:47 +0000302 # The most recently entered frame is printed last;
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000303 # this is different from dbx and gdb, but consistent with
304 # the Python interpreter's stack trace.
305 # It is also consistent with the up/down commands (which are
306 # compatible with dbx and gdb: up moves towards 'main()'
307 # and down moves towards the most recent stack frame).
Guido van Rossum921c8241992-01-10 14:54:42 +0000308
Guido van Rossum23efba41992-01-27 16:58:47 +0000309 def print_stack_trace(self):
310 try:
311 for frame_lineno in self.stack:
312 self.print_stack_entry(frame_lineno)
313 except KeyboardInterrupt:
314 pass
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000315
Guido van Rossumb6aa92e1995-02-03 12:50:04 +0000316 def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
Guido van Rossum23efba41992-01-27 16:58:47 +0000317 frame, lineno = frame_lineno
318 if frame is self.curframe:
319 print '>',
320 else:
321 print ' ',
Guido van Rossuma558e371994-11-10 22:27:35 +0000322 print self.format_stack_entry(frame_lineno, prompt_prefix)
Guido van Rossum921c8241992-01-10 14:54:42 +0000323
324
Guido van Rossumb6775db1994-08-01 11:34:53 +0000325 # Help methods (derived from pdb.doc)
326
327 def help_help(self):
328 self.help_h()
329
330 def help_h(self):
331 print """h(elp)
332 Without argument, print the list of available commands.
333 With a command name as argument, print help about that command
334 "help pdb" pipes the full documentation file to the $PAGER
335 "help exec" gives help on the ! command"""
336
337 def help_where(self):
338 self.help_w()
339
340 def help_w(self):
341 print """w(here)
342 Print a stack trace, with the most recent frame at the bottom.
343 An arrow indicates the "current frame", which determines the
344 context of most commands."""
345
346 def help_down(self):
347 self.help_d()
348
349 def help_d(self):
350 print """d(own)
351 Move the current frame one level down in the stack trace
352 (to an older frame)."""
353
354 def help_up(self):
355 self.help_u()
356
357 def help_u(self):
358 print """u(p)
359 Move the current frame one level up in the stack trace
360 (to a newer frame)."""
361
362 def help_break(self):
363 self.help_b()
364
365 def help_b(self):
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000366 print """b(reak) [lineno | function] [, "condition"]
Guido van Rossumb6775db1994-08-01 11:34:53 +0000367 With a line number argument, set a break there in the current
368 file. With a function name, set a break at the entry of that
Guido van Rossum9e1ee971997-07-11 13:43:53 +0000369 function. Without argument, list all breaks. If a second
370 argument is present, it is a string specifying an expression
371 which must evaluate to true before the breakpoint is honored.
372 """
Guido van Rossumb6775db1994-08-01 11:34:53 +0000373
374 def help_clear(self):
375 self.help_cl()
376
377 def help_cl(self):
378 print """cl(ear) [lineno]
379 With a line number argument, clear that break in the current file.
380 Without argument, clear all breaks (but first ask confirmation)."""
381
382 def help_step(self):
383 self.help_s()
384
385 def help_s(self):
386 print """s(tep)
387 Execute the current line, stop at the first possible occasion
388 (either in a function that is called or in the current function)."""
389
390 def help_next(self):
391 self.help_n()
392
393 def help_n(self):
394 print """n(ext)
395 Continue execution until the next line in the current function
396 is reached or it returns."""
397
398 def help_return(self):
399 self.help_r()
400
401 def help_r(self):
402 print """r(eturn)
403 Continue execution until the current function returns."""
404
405 def help_continue(self):
406 self.help_c()
407
408 def help_cont(self):
409 self.help_c()
410
411 def help_c(self):
412 print """c(ont(inue))
413 Continue execution, only stop when a breakpoint is encountered."""
414
415 def help_list(self):
416 self.help_l()
417
418 def help_l(self):
419 print """l(ist) [first [,last]]
420 List source code for the current file.
421 Without arguments, list 11 lines around the current line
422 or continue the previous listing.
423 With one argument, list 11 lines starting at that line.
424 With two arguments, list the given range;
425 if the second argument is less than the first, it is a count."""
426
427 def help_args(self):
428 self.help_a()
429
430 def help_a(self):
431 print """a(rgs)
432 Print the argument list of the current function."""
433
434 def help_p(self):
435 print """p expression
436 Print the value of the expression."""
437
438 def help_exec(self):
439 print """(!) statement
440 Execute the (one-line) statement in the context of
441 the current stack frame.
442 The exclamation point can be omitted unless the first word
443 of the statement resembles a debugger command.
444 To assign to a global variable you must always prefix the
445 command with a 'global' command, e.g.:
446 (Pdb) global list_options; list_options = ['-l']
447 (Pdb)"""
448
449 def help_quit(self):
450 self.help_q()
451
452 def help_q(self):
453 print """q(uit) Quit from the debugger.
454 The program being executed is aborted."""
455
456 def help_pdb(self):
457 help()
458
Guido van Rossum35771131992-09-08 11:59:04 +0000459# Simplified interface
460
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000461def run(statement, globals=None, locals=None):
462 Pdb().run(statement, globals, locals)
463
464def runeval(expression, globals=None, locals=None):
465 return Pdb().runeval(expression, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000466
467def runctx(statement, globals, locals):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000468 # B/W compatibility
469 run(statement, globals, locals)
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000470
Guido van Rossum4e160981992-09-02 20:43:20 +0000471def runcall(*args):
Guido van Rossum5e38b6f1995-02-27 13:13:40 +0000472 return apply(Pdb().runcall, args)
Guido van Rossum4e160981992-09-02 20:43:20 +0000473
Guido van Rossumb6775db1994-08-01 11:34:53 +0000474def set_trace():
475 Pdb().set_trace()
Guido van Rossum35771131992-09-08 11:59:04 +0000476
477# Post-Mortem interface
478
479def post_mortem(t):
Guido van Rossum5ef74b81993-06-23 11:55:24 +0000480 p = Pdb()
Guido van Rossum35771131992-09-08 11:59:04 +0000481 p.reset()
482 while t.tb_next <> None: t = t.tb_next
483 p.interaction(t.tb_frame, t)
484
485def pm():
486 import sys
487 post_mortem(sys.last_traceback)
488
489
490# Main program for testing
491
Guido van Rossum23efba41992-01-27 16:58:47 +0000492TESTCMD = 'import x; x.main()'
Guido van Rossum6fe08b01992-01-16 13:50:21 +0000493
Guido van Rossum921c8241992-01-10 14:54:42 +0000494def test():
Guido van Rossum23efba41992-01-27 16:58:47 +0000495 run(TESTCMD)
Guido van Rossume61fa0a1993-10-22 13:56:35 +0000496
497# print help
498def help():
Guido van Rossumb37954f1993-10-22 13:57:38 +0000499 import os
Guido van Rossume61fa0a1993-10-22 13:56:35 +0000500 for dirname in sys.path:
501 fullname = os.path.join(dirname, 'pdb.doc')
502 if os.path.exists(fullname):
503 sts = os.system('${PAGER-more} '+fullname)
504 if sts: print '*** Pager exit status:', sts
505 break
506 else:
507 print 'Sorry, can\'t find the help file "pdb.doc"',
508 print 'along the Python search path'
Guido van Rossumf17361d1996-07-30 16:28:13 +0000509
510# When invoked as main program, invoke the debugger on a script
511if __name__=='__main__':
512 import sys
Guido van Rossumec577d51996-09-10 17:39:34 +0000513 import os
Guido van Rossumf17361d1996-07-30 16:28:13 +0000514 if not sys.argv[1:]:
515 print "usage: pdb.py scriptfile [arg] ..."
516 sys.exit(2)
517
Guido van Rossumec577d51996-09-10 17:39:34 +0000518 filename = sys.argv[1] # Get script filename
Guido van Rossumf17361d1996-07-30 16:28:13 +0000519
Guido van Rossumec577d51996-09-10 17:39:34 +0000520 del sys.argv[0] # Hide "pdb.py" from argument list
521
522 # Insert script directory in front of module search path
523 sys.path.insert(0, os.path.dirname(filename))
Guido van Rossumf17361d1996-07-30 16:28:13 +0000524
525 run('execfile(' + `filename` + ')', {'__name__': '__main__'})