3 """A Python debugger."""
5 # (See pdb.doc for documentation.)
16 # Create a custom safe Repr instance and increase its maxstring.
17 # The default of 30 truncates error messages too easily.
20 _saferepr
= _repr
.repr
22 __all__
= ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
23 "post_mortem", "help"]
25 def find_function(funcname
, filename
):
26 cre
= re
.compile(r
'def\s+%s\s*[(]' % funcname
)
31 # consumer of this info expects the first line to be 1
39 answer
= funcname
, filename
, lineno
46 # Interaction prompt line will separate file and call info from code
47 # text using value of line_prefix string. A newline and arrow may
48 # be to your liking. You can set it once pdb is imported using the
49 # command "pdb.line_prefix = '\n% '".
50 # line_prefix = ': ' # Use this to get the old situation back
51 line_prefix
= '\n-> ' # Probably a better default
53 class Pdb(bdb
.Bdb
, cmd
.Cmd
):
55 def __init__(self
, completekey
='tab', stdin
=None, stdout
=None):
56 bdb
.Bdb
.__init
__(self
)
57 cmd
.Cmd
.__init
__(self
, completekey
, stdin
, stdout
)
60 self
.prompt
= '(Pdb) '
63 self
._wait
_for
_mainpyfile
= 0
64 # Try to load readline if it exists
70 # Read $HOME/.pdbrc and ./.pdbrc
72 if 'HOME' in os
.environ
:
73 envHome
= os
.environ
['HOME']
75 rcFile
= open(os
.path
.join(envHome
, ".pdbrc"))
79 for line
in rcFile
.readlines():
80 self
.rcLines
.append(line
)
83 rcFile
= open(".pdbrc")
87 for line
in rcFile
.readlines():
88 self
.rcLines
.append(line
)
91 self
.commands
= {} # associates a command list to breakpoint numbers
92 self
.commands_doprompt
= {} # for each bp num, tells if the prompt must be disp. after execing the cmd list
93 self
.commands_silent
= {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list
94 self
.commands_defining
= False # True while in the process of defining a command list
95 self
.commands_bnum
= None # The breakpoint number for which we are defining a list
107 def setup(self
, f
, t
):
109 self
.stack
, self
.curindex
= self
.get_stack(f
, t
)
110 self
.curframe
= self
.stack
[self
.curindex
][0]
113 # Can be executed earlier than 'setup' if desired
114 def execRcLines(self
):
116 # Make local copy because of recursion
117 rcLines
= self
.rcLines
122 if len(line
) > 0 and line
[0] != '#':
125 # Override Bdb methods
127 def user_call(self
, frame
, argument_list
):
128 """This method is called when there is the remote possibility
129 that we ever need to stop in this function."""
130 if self
._wait
_for
_mainpyfile
:
132 if self
.stop_here(frame
):
133 print >>self
.stdout
, '--Call--'
134 self
.interaction(frame
, None)
136 def user_line(self
, frame
):
137 """This function is called when we stop or break at this line."""
138 if self
._wait
_for
_mainpyfile
:
139 if (self
.mainpyfile
!= self
.canonic(frame
.f_code
.co_filename
)
140 or frame
.f_lineno
<= 0):
142 self
._wait
_for
_mainpyfile
= 0
143 if self
.bp_commands(frame
):
144 self
.interaction(frame
, None)
146 def bp_commands(self
,frame
):
147 """ Call every command that was set for the current active breakpoint (if there is one)
148 Returns True if the normal interaction function must be called, False otherwise """
149 #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit
150 if getattr(self
,"currentbp",False) and self
.currentbp
in self
.commands
:
151 currentbp
= self
.currentbp
153 lastcmd_back
= self
.lastcmd
154 self
.setup(frame
, None)
155 for line
in self
.commands
[currentbp
]:
157 self
.lastcmd
= lastcmd_back
158 if not self
.commands_silent
[currentbp
]:
159 self
.print_stack_entry(self
.stack
[self
.curindex
])
160 if self
.commands_doprompt
[currentbp
]:
166 def user_return(self
, frame
, return_value
):
167 """This function is called when a return trap is set here."""
168 frame
.f_locals
['__return__'] = return_value
169 print >>self
.stdout
, '--Return--'
170 self
.interaction(frame
, None)
172 def user_exception(self
, frame
, (exc_type
, exc_value
, exc_traceback
)):
173 """This function is called if an exception occurs,
174 but only if we are to stop at or just below this level."""
175 frame
.f_locals
['__exception__'] = exc_type
, exc_value
176 if type(exc_type
) == type(''):
177 exc_type_name
= exc_type
178 else: exc_type_name
= exc_type
.__name
__
179 print >>self
.stdout
, exc_type_name
+ ':', _saferepr(exc_value
)
180 self
.interaction(frame
, exc_traceback
)
182 # General interaction function
184 def interaction(self
, frame
, traceback
):
185 self
.setup(frame
, traceback
)
186 self
.print_stack_entry(self
.stack
[self
.curindex
])
190 def default(self
, line
):
191 if line
[:1] == '!': line
= line
[1:]
192 locals = self
.curframe
.f_locals
193 globals = self
.curframe
.f_globals
195 code
= compile(line
+ '\n', '<stdin>', 'single')
196 exec code
in globals, locals
198 t
, v
= sys
.exc_info()[:2]
199 if type(t
) == type(''):
201 else: exc_type_name
= t
.__name
__
202 print >>self
.stdout
, '***', exc_type_name
+ ':', v
204 def precmd(self
, line
):
205 """Handle alias expansion and ';;' separator."""
209 while args
[0] in self
.aliases
:
210 line
= self
.aliases
[args
[0]]
212 for tmpArg
in args
[1:]:
213 line
= line
.replace("%" + str(ii
),
216 line
= line
.replace("%*", ' '.join(args
[1:]))
218 # split into ';;' separated commands
219 # unless it's an alias command
220 if args
[0] != 'alias':
221 marker
= line
.find(';;')
223 # queue up everything after marker
224 next
= line
[marker
+2:].lstrip()
225 self
.cmdqueue
.append(next
)
226 line
= line
[:marker
].rstrip()
229 def onecmd(self
, line
):
230 """Interpret the argument as though it had been typed in response
233 Checks whether this line is typed at the normal prompt or in
234 a breakpoint command list definition.
236 if not self
.commands_defining
:
237 return cmd
.Cmd
.onecmd(self
, line
)
239 return self
.handle_command_def(line
)
241 def handle_command_def(self
,line
):
242 """ Handles one command line during command list definition. """
243 cmd
, arg
, line
= self
.parseline(line
)
245 self
.commands_silent
[self
.commands_bnum
] = True
246 return # continue to handle other cmd def in the cmd list
249 return 1 # end of cmd list
250 cmdlist
= self
.commands
[self
.commands_bnum
]
252 cmdlist
.append(cmd
+' '+arg
)
255 # Determine if we must stop
257 func
= getattr(self
, 'do_' + cmd
)
258 except AttributeError:
260 if func
.func_name
in self
.commands_resuming
: # one of the resuming commands.
261 self
.commands_doprompt
[self
.commands_bnum
] = False
266 # Command definitions, called by cmdloop()
267 # The argument is the remaining string on the command line
268 # Return true to exit from the command loop
270 do_h
= cmd
.Cmd
.do_help
272 def do_commands(self
, arg
):
273 """Defines a list of commands associated to a breakpoint
274 Those commands will be executed whenever the breakpoint causes the program to stop execution."""
276 bnum
= len(bdb
.Breakpoint
.bpbynumber
)-1
281 print >>self
.stdout
, "Usage : commands [bnum]\n ...\n end"
283 self
.commands_bnum
= bnum
284 self
.commands
[bnum
] = []
285 self
.commands_doprompt
[bnum
] = True
286 self
.commands_silent
[bnum
] = False
287 prompt_back
= self
.prompt
288 self
.prompt
= '(com) '
289 self
.commands_defining
= True
291 self
.commands_defining
= False
292 self
.prompt
= prompt_back
294 def do_break(self
, arg
, temporary
= 0):
295 # break [ ([filename:]lineno | function) [, "condition"] ]
297 if self
.breaks
: # There's at least one
298 print >>self
.stdout
, "Num Type Disp Enb Where"
299 for bp
in bdb
.Breakpoint
.bpbynumber
:
301 bp
.bpprint(self
.stdout
)
303 # parse arguments; comma has lowest precedence
304 # and cannot occur in filename
308 comma
= arg
.find(',')
310 # parse stuff after comma: "condition"
311 cond
= arg
[comma
+1:].lstrip()
312 arg
= arg
[:comma
].rstrip()
313 # parse stuff before comma: [filename:]lineno | function
314 colon
= arg
.rfind(':')
317 filename
= arg
[:colon
].rstrip()
318 f
= self
.lookupmodule(filename
)
320 print >>self
.stdout
, '*** ', repr(filename
),
321 print >>self
.stdout
, 'not found from sys.path'
325 arg
= arg
[colon
+1:].lstrip()
328 except ValueError, msg
:
329 print >>self
.stdout
, '*** Bad lineno:', arg
332 # no colon; can be lineno or function
338 self
.curframe
.f_globals
,
339 self
.curframe
.f_locals
)
343 if hasattr(func
, 'im_func'):
345 code
= func
.func_code
346 #use co_name to identify the bkpt (function names
347 #could be aliased, but co_name is invariant)
348 funcname
= code
.co_name
349 lineno
= code
.co_firstlineno
350 filename
= code
.co_filename
353 (ok
, filename
, ln
) = self
.lineinfo(arg
)
355 print >>self
.stdout
, '*** The specified object',
356 print >>self
.stdout
, repr(arg
),
357 print >>self
.stdout
, 'is not a function'
358 print >>self
.stdout
, 'or was not found along sys.path.'
360 funcname
= ok
# ok contains a function name
363 filename
= self
.defaultFile()
364 # Check for reasonable breakpoint
365 line
= self
.checkline(filename
, lineno
)
367 # now set the break point
368 err
= self
.set_break(filename
, line
, temporary
, cond
, funcname
)
369 if err
: print >>self
.stdout
, '***', err
371 bp
= self
.get_breaks(filename
, line
)[-1]
372 print >>self
.stdout
, "Breakpoint %d at %s:%d" % (bp
.number
,
376 # To be overridden in derived debuggers
377 def defaultFile(self
):
378 """Produce a reasonable default."""
379 filename
= self
.curframe
.f_code
.co_filename
380 if filename
== '<string>' and self
.mainpyfile
:
381 filename
= self
.mainpyfile
386 def do_tbreak(self
, arg
):
387 self
.do_break(arg
, 1)
389 def lineinfo(self
, identifier
):
390 failed
= (None, None, None)
391 # Input is identifier, may be in single quotes
392 idstring
= identifier
.split("'")
393 if len(idstring
) == 1:
394 # not in single quotes
395 id = idstring
[0].strip()
396 elif len(idstring
) == 3:
398 id = idstring
[1].strip()
401 if id == '': return failed
402 parts
= id.split('.')
403 # Protection for derived debuggers
404 if parts
[0] == 'self':
408 # Best first guess at file to look at
409 fname
= self
.defaultFile()
413 # More than one part.
414 # First is module, second is method/class
415 f
= self
.lookupmodule(parts
[0])
419 answer
= find_function(item
, fname
)
420 return answer
or failed
422 def checkline(self
, filename
, lineno
):
423 """Check whether specified line seems to be executable.
425 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
426 line or EOF). Warning: testing is not comprehensive.
428 line
= linecache
.getline(filename
, lineno
)
430 print >>self
.stdout
, 'End of file'
433 # Don't allow setting breakpoint at a blank line
434 if (not line
or (line
[0] == '#') or
435 (line
[:3] == '"""') or line
[:3] == "'''"):
436 print >>self
.stdout
, '*** Blank or comment'
440 def do_enable(self
, arg
):
446 print >>self
.stdout
, 'Breakpoint index %r is not a number' % i
449 if not (0 <= i
< len(bdb
.Breakpoint
.bpbynumber
)):
450 print >>self
.stdout
, 'No breakpoint numbered', i
453 bp
= bdb
.Breakpoint
.bpbynumber
[i
]
457 def do_disable(self
, arg
):
463 print >>self
.stdout
, 'Breakpoint index %r is not a number' % i
466 if not (0 <= i
< len(bdb
.Breakpoint
.bpbynumber
)):
467 print >>self
.stdout
, 'No breakpoint numbered', i
470 bp
= bdb
.Breakpoint
.bpbynumber
[i
]
474 def do_condition(self
, arg
):
475 # arg is breakpoint number and condition
476 args
= arg
.split(' ', 1)
477 bpnum
= int(args
[0].strip())
482 bp
= bdb
.Breakpoint
.bpbynumber
[bpnum
]
486 print >>self
.stdout
, 'Breakpoint', bpnum
,
487 print >>self
.stdout
, 'is now unconditional.'
489 def do_ignore(self
,arg
):
490 """arg is bp number followed by ignore count."""
492 bpnum
= int(args
[0].strip())
494 count
= int(args
[1].strip())
497 bp
= bdb
.Breakpoint
.bpbynumber
[bpnum
]
501 reply
= 'Will ignore next '
503 reply
= reply
+ '%d crossings' % count
505 reply
= reply
+ '1 crossing'
506 print >>self
.stdout
, reply
+ ' of breakpoint %d.' % bpnum
508 print >>self
.stdout
, 'Will stop next time breakpoint',
509 print >>self
.stdout
, bpnum
, 'is reached.'
511 def do_clear(self
, arg
):
512 """Three possibilities, tried in this order:
513 clear -> clear all breaks, ask for confirmation
514 clear file:lineno -> clear all breaks at file:lineno
515 clear bpno bpno ... -> clear breakpoints by number"""
518 reply
= raw_input('Clear all breaks? ')
521 reply
= reply
.strip().lower()
522 if reply
in ('y', 'yes'):
523 self
.clear_all_breaks()
526 # Make sure it works for "clear C:\foo\bar.py:12"
533 err
= "Invalid line number (%s)" % arg
535 err
= self
.clear_break(filename
, lineno
)
536 if err
: print >>self
.stdout
, '***', err
538 numberlist
= arg
.split()
543 print >>self
.stdout
, 'Breakpoint index %r is not a number' % i
546 if not (0 <= i
< len(bdb
.Breakpoint
.bpbynumber
)):
547 print >>self
.stdout
, 'No breakpoint numbered', i
549 err
= self
.clear_bpbynumber(i
)
551 print >>self
.stdout
, '***', err
553 print >>self
.stdout
, 'Deleted breakpoint', i
554 do_cl
= do_clear
# 'c' is already an abbreviation for 'continue'
556 def do_where(self
, arg
):
557 self
.print_stack_trace()
561 def do_up(self
, arg
):
562 if self
.curindex
== 0:
563 print >>self
.stdout
, '*** Oldest frame'
565 self
.curindex
= self
.curindex
- 1
566 self
.curframe
= self
.stack
[self
.curindex
][0]
567 self
.print_stack_entry(self
.stack
[self
.curindex
])
571 def do_down(self
, arg
):
572 if self
.curindex
+ 1 == len(self
.stack
):
573 print >>self
.stdout
, '*** Newest frame'
575 self
.curindex
= self
.curindex
+ 1
576 self
.curframe
= self
.stack
[self
.curindex
][0]
577 self
.print_stack_entry(self
.stack
[self
.curindex
])
581 def do_step(self
, arg
):
586 def do_next(self
, arg
):
587 self
.set_next(self
.curframe
)
591 def do_return(self
, arg
):
592 self
.set_return(self
.curframe
)
596 def do_continue(self
, arg
):
599 do_c
= do_cont
= do_continue
601 def do_jump(self
, arg
):
602 if self
.curindex
+ 1 != len(self
.stack
):
603 print >>self
.stdout
, "*** You can only jump within the bottom frame"
608 print >>self
.stdout
, "*** The 'jump' command requires a line number."
611 # Do the jump, fix up our copy of the stack, and display the
613 self
.curframe
.f_lineno
= arg
614 self
.stack
[self
.curindex
] = self
.stack
[self
.curindex
][0], arg
615 self
.print_stack_entry(self
.stack
[self
.curindex
])
616 except ValueError, e
:
617 print >>self
.stdout
, '*** Jump failed:', e
620 def do_debug(self
, arg
):
622 globals = self
.curframe
.f_globals
623 locals = self
.curframe
.f_locals
625 p
.prompt
= "(%s) " % self
.prompt
.strip()
626 print >>self
.stdout
, "ENTERING RECURSIVE DEBUGGER"
627 sys
.call_tracing(p
.run
, (arg
, globals, locals))
628 print >>self
.stdout
, "LEAVING RECURSIVE DEBUGGER"
629 sys
.settrace(self
.trace_dispatch
)
630 self
.lastcmd
= p
.lastcmd
632 def do_quit(self
, arg
):
633 self
._user
_requested
_quit
= 1
640 def do_EOF(self
, arg
):
642 self
._user
_requested
_quit
= 1
646 def do_args(self
, arg
):
651 if co
.co_flags
& 4: n
= n
+1
652 if co
.co_flags
& 8: n
= n
+1
654 name
= co
.co_varnames
[i
]
655 print >>self
.stdout
, name
, '=',
656 if name
in dict: print >>self
.stdout
, dict[name
]
657 else: print >>self
.stdout
, "*** undefined ***"
660 def do_retval(self
, arg
):
661 if '__return__' in self
.curframe
.f_locals
:
662 print >>self
.stdout
, self
.curframe
.f_locals
['__return__']
664 print >>self
.stdout
, '*** Not yet returned!'
667 def _getval(self
, arg
):
669 return eval(arg
, self
.curframe
.f_globals
,
670 self
.curframe
.f_locals
)
672 t
, v
= sys
.exc_info()[:2]
673 if isinstance(t
, str):
675 else: exc_type_name
= t
.__name
__
676 print >>self
.stdout
, '***', exc_type_name
+ ':', repr(v
)
681 print >>self
.stdout
, repr(self
._getval
(arg
))
685 def do_pp(self
, arg
):
687 pprint
.pprint(self
._getval
(arg
), self
.stdout
)
691 def do_list(self
, arg
):
692 self
.lastcmd
= 'list'
696 x
= eval(arg
, {}, {})
697 if type(x
) == type(()):
702 # Assume it's a count
705 first
= max(1, int(x
) - 5)
707 print >>self
.stdout
, '*** Error in argument:', repr(arg
)
709 elif self
.lineno
is None:
710 first
= max(1, self
.curframe
.f_lineno
- 5)
712 first
= self
.lineno
+ 1
715 filename
= self
.curframe
.f_code
.co_filename
716 breaklist
= self
.get_file_breaks(filename
)
718 for lineno
in range(first
, last
+1):
719 line
= linecache
.getline(filename
, lineno
)
721 print >>self
.stdout
, '[EOF]'
724 s
= repr(lineno
).rjust(3)
725 if len(s
) < 4: s
= s
+ ' '
726 if lineno
in breaklist
: s
= s
+ 'B'
728 if lineno
== self
.curframe
.f_lineno
:
730 print >>self
.stdout
, s
+ '\t' + line
,
732 except KeyboardInterrupt:
736 def do_whatis(self
, arg
):
738 value
= eval(arg
, self
.curframe
.f_globals
,
739 self
.curframe
.f_locals
)
741 t
, v
= sys
.exc_info()[:2]
742 if type(t
) == type(''):
744 else: exc_type_name
= t
.__name
__
745 print >>self
.stdout
, '***', exc_type_name
+ ':', repr(v
)
749 try: code
= value
.func_code
752 print >>self
.stdout
, 'Function', code
.co_name
754 # Is it an instance method?
755 try: code
= value
.im_func
.func_code
758 print >>self
.stdout
, 'Method', code
.co_name
760 # None of the above...
761 print >>self
.stdout
, type(value
)
763 def do_alias(self
, arg
):
766 keys
= self
.aliases
.keys()
769 print >>self
.stdout
, "%s = %s" % (alias
, self
.aliases
[alias
])
771 if args
[0] in self
.aliases
and len(args
) == 1:
772 print >>self
.stdout
, "%s = %s" % (args
[0], self
.aliases
[args
[0]])
774 self
.aliases
[args
[0]] = ' '.join(args
[1:])
776 def do_unalias(self
, arg
):
778 if len(args
) == 0: return
779 if args
[0] in self
.aliases
:
780 del self
.aliases
[args
[0]]
782 #list of all the commands making the program resume execution.
783 commands_resuming
= ['do_continue', 'do_step', 'do_next', 'do_return',
784 'do_quit', 'do_jump']
786 # Print a traceback starting at the top stack frame.
787 # The most recently entered frame is printed last;
788 # this is different from dbx and gdb, but consistent with
789 # the Python interpreter's stack trace.
790 # It is also consistent with the up/down commands (which are
791 # compatible with dbx and gdb: up moves towards 'main()'
792 # and down moves towards the most recent stack frame).
794 def print_stack_trace(self
):
796 for frame_lineno
in self
.stack
:
797 self
.print_stack_entry(frame_lineno
)
798 except KeyboardInterrupt:
801 def print_stack_entry(self
, frame_lineno
, prompt_prefix
=line_prefix
):
802 frame
, lineno
= frame_lineno
803 if frame
is self
.curframe
:
804 print >>self
.stdout
, '>',
806 print >>self
.stdout
, ' ',
807 print >>self
.stdout
, self
.format_stack_entry(frame_lineno
,
811 # Help methods (derived from pdb.doc)
817 print >>self
.stdout
, """h(elp)
818 Without argument, print the list of available commands.
819 With a command name as argument, print help about that command
820 "help pdb" pipes the full documentation file to the $PAGER
821 "help exec" gives help on the ! command"""
823 def help_where(self
):
827 print >>self
.stdout
, """w(here)
828 Print a stack trace, with the most recent frame at the bottom.
829 An arrow indicates the "current frame", which determines the
830 context of most commands. 'bt' is an alias for this command."""
838 print >>self
.stdout
, """d(own)
839 Move the current frame one level down in the stack trace
840 (to a newer frame)."""
846 print >>self
.stdout
, """u(p)
847 Move the current frame one level up in the stack trace
848 (to an older frame)."""
850 def help_break(self
):
854 print >>self
.stdout
, """b(reak) ([file:]lineno | function) [, condition]
855 With a line number argument, set a break there in the current
856 file. With a function name, set a break at first executable line
857 of that function. Without argument, list all breaks. If a second
858 argument is present, it is a string specifying an expression
859 which must evaluate to true before the breakpoint is honored.
861 The line number may be prefixed with a filename and a colon,
862 to specify a breakpoint in another file (probably one that
863 hasn't been loaded yet). The file is searched for on sys.path;
864 the .py suffix may be omitted."""
866 def help_clear(self
):
870 print >>self
.stdout
, "cl(ear) filename:lineno"
871 print >>self
.stdout
, """cl(ear) [bpnumber [bpnumber...]]
872 With a space separated list of breakpoint numbers, clear
873 those breakpoints. Without argument, clear all breaks (but
874 first ask confirmation). With a filename:lineno argument,
875 clear all breaks at that line in that file.
877 Note that the argument is different from previous versions of
878 the debugger (in python distributions 1.5.1 and before) where
879 a linenumber was used instead of either filename:lineno or
880 breakpoint numbers."""
882 def help_tbreak(self
):
883 print >>self
.stdout
, """tbreak same arguments as break, but breakpoint is
884 removed when first hit."""
886 def help_enable(self
):
887 print >>self
.stdout
, """enable bpnumber [bpnumber ...]
888 Enables the breakpoints given as a space separated list of
891 def help_disable(self
):
892 print >>self
.stdout
, """disable bpnumber [bpnumber ...]
893 Disables the breakpoints given as a space separated list of
896 def help_ignore(self
):
897 print >>self
.stdout
, """ignore bpnumber count
898 Sets the ignore count for the given breakpoint number. A breakpoint
899 becomes active when the ignore count is zero. When non-zero, the
900 count is decremented each time the breakpoint is reached and the
901 breakpoint is not disabled and any associated condition evaluates
904 def help_condition(self
):
905 print >>self
.stdout
, """condition bpnumber str_condition
906 str_condition is a string specifying an expression which
907 must evaluate to true before the breakpoint is honored.
908 If str_condition is absent, any existing condition is removed;
909 i.e., the breakpoint is made unconditional."""
915 print >>self
.stdout
, """s(tep)
916 Execute the current line, stop at the first possible occasion
917 (either in a function that is called or in the current function)."""
923 print >>self
.stdout
, """n(ext)
924 Continue execution until the next line in the current function
925 is reached or it returns."""
927 def help_return(self
):
931 print >>self
.stdout
, """r(eturn)
932 Continue execution until the current function returns."""
934 def help_continue(self
):
941 print >>self
.stdout
, """c(ont(inue))
942 Continue execution, only stop when a breakpoint is encountered."""
948 print >>self
.stdout
, """j(ump) lineno
949 Set the next line that will be executed."""
951 def help_debug(self
):
952 print >>self
.stdout
, """debug code
953 Enter a recursive debugger that steps through the code argument
954 (which is an arbitrary expression or statement to be executed
955 in the current environment)."""
961 print >>self
.stdout
, """l(ist) [first [,last]]
962 List source code for the current file.
963 Without arguments, list 11 lines around the current line
964 or continue the previous listing.
965 With one argument, list 11 lines starting at that line.
966 With two arguments, list the given range;
967 if the second argument is less than the first, it is a count."""
973 print >>self
.stdout
, """a(rgs)
974 Print the arguments of the current function."""
977 print >>self
.stdout
, """p expression
978 Print the value of the expression."""
981 print >>self
.stdout
, """pp expression
982 Pretty-print the value of the expression."""
985 print >>self
.stdout
, """(!) statement
986 Execute the (one-line) statement in the context of
987 the current stack frame.
988 The exclamation point can be omitted unless the first word
989 of the statement resembles a debugger command.
990 To assign to a global variable you must always prefix the
991 command with a 'global' command, e.g.:
992 (Pdb) global list_options; list_options = ['-l']
999 print >>self
.stdout
, """q(uit) or exit - Quit from the debugger.
1000 The program being executed is aborted."""
1004 def help_whatis(self
):
1005 print >>self
.stdout
, """whatis arg
1006 Prints the type of the argument."""
1009 print >>self
.stdout
, """EOF
1010 Handles the receipt of EOF as a command."""
1012 def help_alias(self
):
1013 print >>self
.stdout
, """alias [name [command [parameter parameter ...] ]]
1014 Creates an alias called 'name' the executes 'command'. The command
1015 must *not* be enclosed in quotes. Replaceable parameters are
1016 indicated by %1, %2, and so on, while %* is replaced by all the
1017 parameters. If no command is given, the current alias for name
1018 is shown. If no name is given, all aliases are listed.
1020 Aliases may be nested and can contain anything that can be
1021 legally typed at the pdb prompt. Note! You *can* override
1022 internal pdb commands with aliases! Those internal commands
1023 are then hidden until the alias is removed. Aliasing is recursively
1024 applied to the first word of the command line; all other words
1025 in the line are left alone.
1027 Some useful aliases (especially when placed in the .pdbrc file) are:
1029 #Print instance variables (usage "pi classInst")
1030 alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
1032 #Print instance variables in self
1036 def help_unalias(self
):
1037 print >>self
.stdout
, """unalias name
1038 Deletes the specified alias."""
1040 def help_commands(self
):
1041 print >>self
.stdout
, """commands [bpnumber]
1046 Specify a list of commands for breakpoint number bpnumber. The
1047 commands themselves appear on the following lines. Type a line
1048 containing just 'end' to terminate the commands.
1050 To remove all commands from a breakpoint, type commands and
1051 follow it immediately with end; that is, give no commands.
1053 With no bpnumber argument, commands refers to the last
1056 You can use breakpoint commands to start your program up again.
1057 Simply use the continue command, or step, or any other
1058 command that resumes execution.
1060 Specifying any command resuming execution (currently continue,
1061 step, next, return, jump, quit and their abbreviations) terminates
1062 the command list (as if that command was immediately followed by end).
1063 This is because any time you resume execution
1064 (even with a simple next or step), you may encounter
1065 another breakpoint--which could have its own command list, leading to
1066 ambiguities about which list to execute.
1068 If you use the 'silent' command in the command list, the
1069 usual message about stopping at a breakpoint is not printed. This may
1070 be desirable for breakpoints that are to print a specific message and
1071 then continue. If none of the other commands print anything, you
1072 see no sign that the breakpoint was reached.
1078 def lookupmodule(self
, filename
):
1079 """Helper function for break/clear parsing -- may be overridden.
1081 lookupmodule() translates (possibly incomplete) file or module name
1082 into an absolute file name.
1084 if os
.path
.isabs(filename
) and os
.path
.exists(filename
):
1086 f
= os
.path
.join(sys
.path
[0], filename
)
1087 if os
.path
.exists(f
) and self
.canonic(f
) == self
.mainpyfile
:
1089 root
, ext
= os
.path
.splitext(filename
)
1091 filename
= filename
+ '.py'
1092 if os
.path
.isabs(filename
):
1094 for dirname
in sys
.path
:
1095 while os
.path
.islink(dirname
):
1096 dirname
= os
.readlink(dirname
)
1097 fullname
= os
.path
.join(dirname
, filename
)
1098 if os
.path
.exists(fullname
):
1102 def _runscript(self
, filename
):
1103 # Start with fresh empty copy of globals and locals and tell the script
1104 # that it's being run as __main__ to avoid scripts being able to access
1105 # the pdb.py namespace.
1106 globals_
= {"__name__" : "__main__"}
1109 # When bdb sets tracing, a number of call and line events happens
1110 # BEFORE debugger even reaches user's code (and the exact sequence of
1111 # events depends on python version). So we take special measures to
1112 # avoid stopping before we reach the main script (see user_line and
1113 # user_call for details).
1114 self
._wait
_for
_mainpyfile
= 1
1115 self
.mainpyfile
= self
.canonic(filename
)
1116 self
._user
_requested
_quit
= 0
1117 statement
= 'execfile( "%s")' % filename
1118 self
.run(statement
, globals=globals_
, locals=locals_
)
1120 # Simplified interface
1122 def run(statement
, globals=None, locals=None):
1123 Pdb().run(statement
, globals, locals)
1125 def runeval(expression
, globals=None, locals=None):
1126 return Pdb().runeval(expression
, globals, locals)
1128 def runctx(statement
, globals, locals):
1130 run(statement
, globals, locals)
1132 def runcall(*args
, **kwds
):
1133 return Pdb().runcall(*args
, **kwds
)
1136 Pdb().set_trace(sys
._getframe
().f_back
)
1138 # Post-Mortem interface
1143 while t
.tb_next
is not None:
1145 p
.interaction(t
.tb_frame
, t
)
1148 post_mortem(sys
.last_traceback
)
1151 # Main program for testing
1153 TESTCMD
= 'import x; x.main()'
1160 for dirname
in sys
.path
:
1161 fullname
= os
.path
.join(dirname
, 'pdb.doc')
1162 if os
.path
.exists(fullname
):
1163 sts
= os
.system('${PAGER-more} '+fullname
)
1164 if sts
: print '*** Pager exit status:', sts
1167 print 'Sorry, can\'t find the help file "pdb.doc"',
1168 print 'along the Python search path'
1171 if not sys
.argv
[1:]:
1172 print "usage: pdb.py scriptfile [arg] ..."
1175 mainpyfile
= sys
.argv
[1] # Get script filename
1176 if not os
.path
.exists(mainpyfile
):
1177 print 'Error:', mainpyfile
, 'does not exist'
1180 del sys
.argv
[0] # Hide "pdb.py" from argument list
1182 # Replace pdb's dir with script's dir in front of module search path.
1183 sys
.path
[0] = os
.path
.dirname(mainpyfile
)
1185 # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
1186 # modified by the script being debugged. It's a bad idea when it was
1187 # changed by the user from the command line. The best approach would be to
1188 # have a "restart" command which would allow explicit specification of
1189 # command line arguments.
1193 pdb
._runscript
(mainpyfile
)
1194 if pdb
._user
_requested
_quit
:
1196 print "The program finished and will be restarted"
1198 # In most cases SystemExit does not warrant a post-mortem session.
1199 print "The program exited via sys.exit(). Exit status: ",
1200 print sys
.exc_info()[1]
1202 traceback
.print_exc()
1203 print "Uncaught exception. Entering post mortem debugging"
1204 print "Running 'cont' or 'step' will restart the program"
1205 t
= sys
.exc_info()[2]
1206 while t
.tb_next
is not None:
1208 pdb
.interaction(t
.tb_frame
,t
)
1209 print "Post mortem debugger finished. The "+mainpyfile
+" will be restarted"
1212 # When invoked as main program, invoke the debugger on a script
1213 if __name__
=='__main__':