14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#! /usr/bin/env python
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""A Python debugger."""
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# (See pdb.doc for documentation.)
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport sys
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport linecache
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport cmd
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport bdb
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom repr import Repr
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport re
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport pprint
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport traceback
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Restart(Exception):
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Causes a debugger to be restarted for the debugged python program."""
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Create a custom safe Repr instance and increase its maxstring.
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# The default of 30 truncates error messages too easily.
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_repr = Repr()
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_repr.maxstring = 200
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao_saferepr = _repr.repr
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao           "post_mortem", "help"]
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef find_function(funcname, filename):
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    try:
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fp = open(filename)
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    except IOError:
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # consumer of this info expects the first line to be 1
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    lineno = 1
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    answer = None
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    while 1:
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = fp.readline()
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if line == '':
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            break
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if cre.match(line):
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            answer = funcname, filename, lineno
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            break
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lineno = lineno + 1
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    fp.close()
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return answer
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Interaction prompt line will separate file and call info from code
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# text using value of line_prefix string.  A newline and arrow may
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# be to your liking.  You can set it once pdb is imported using the
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# command "pdb.line_prefix = '\n% '".
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# line_prefix = ': '    # Use this to get the old situation back
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoline_prefix = '\n-> '   # Probably a better default
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass Pdb(bdb.Bdb, cmd.Cmd):
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bdb.Bdb.__init__(self, skip=skip)
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cmd.Cmd.__init__(self, completekey, stdin, stdout)
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if stdout:
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.use_rawinput = 0
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.prompt = '(Pdb) '
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.aliases = {}
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.mainpyfile = ''
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._wait_for_mainpyfile = 0
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Try to load readline if it exists
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import readline
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ImportError:
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Read $HOME/.pdbrc and ./.pdbrc
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.rcLines = []
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if 'HOME' in os.environ:
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            envHome = os.environ['HOME']
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rcFile = open(os.path.join(envHome, ".pdbrc"))
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except IOError:
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for line in rcFile.readlines():
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.rcLines.append(line)
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rcFile.close()
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rcFile = open(".pdbrc")
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IOError:
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for line in rcFile.readlines():
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.rcLines.append(line)
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rcFile.close()
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands = {} # associates a command list to breakpoint numbers
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_doprompt = {} # for each bp num, tells if the prompt
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                    # must be disp. after execing the cmd list
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_silent = {} # for each bp num, tells if the stack trace
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  # must be disp. after execing the cmd list
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_defining = False # True while in the process of defining
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                       # a command list
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_bnum = None # The breakpoint number for which we are
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  # defining a list
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def reset(self):
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bdb.Bdb.reset(self)
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.forget()
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def forget(self):
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.lineno = None
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack = []
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.curindex = 0
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.curframe = None
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setup(self, f, t):
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.forget()
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.stack, self.curindex = self.get_stack(f, t)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.curframe = self.stack[self.curindex][0]
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The f_locals dictionary is updated from the actual frame
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # locals whenever the .f_locals accessor is called, so we
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cache it here to ensure that modifications are not overwritten.
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.curframe_locals = self.curframe.f_locals
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.execRcLines()
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Can be executed earlier than 'setup' if desired
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def execRcLines(self):
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.rcLines:
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Make local copy because of recursion
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rcLines = self.rcLines
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # executed only once
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.rcLines = []
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for line in rcLines:
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line = line[:-1]
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if len(line) > 0 and line[0] != '#':
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.onecmd(line)
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Override Bdb methods
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def user_call(self, frame, argument_list):
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This method is called when there is the remote possibility
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        that we ever need to stop in this function."""
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._wait_for_mainpyfile:
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.stop_here(frame):
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '--Call--'
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.interaction(frame, None)
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def user_line(self, frame):
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This function is called when we stop or break at this line."""
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._wait_for_mainpyfile:
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                or frame.f_lineno<= 0):
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self._wait_for_mainpyfile = 0
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.bp_commands(frame):
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.interaction(frame, None)
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def bp_commands(self,frame):
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Call every command that was set for the current active breakpoint
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (if there is one).
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Returns True if the normal interaction function must be called,
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        False otherwise."""
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if getattr(self, "currentbp", False) and \
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao               self.currentbp in self.commands:
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            currentbp = self.currentbp
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.currentbp = 0
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            lastcmd_back = self.lastcmd
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.setup(frame, None)
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for line in self.commands[currentbp]:
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.onecmd(line)
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.lastcmd = lastcmd_back
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not self.commands_silent[currentbp]:
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.print_stack_entry(self.stack[self.curindex])
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self.commands_doprompt[currentbp]:
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.cmdloop()
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.forget()
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def user_return(self, frame, return_value):
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This function is called when a return trap is set here."""
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._wait_for_mainpyfile:
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        frame.f_locals['__return__'] = return_value
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, '--Return--'
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.interaction(frame, None)
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def user_exception(self, frame, exc_info):
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """This function is called if an exception occurs,
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        but only if we are to stop at or just below this level."""
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self._wait_for_mainpyfile:
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        exc_type, exc_value, exc_traceback = exc_info
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        frame.f_locals['__exception__'] = exc_type, exc_value
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if type(exc_type) == type(''):
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            exc_type_name = exc_type
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else: exc_type_name = exc_type.__name__
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.interaction(frame, exc_traceback)
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # General interaction function
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def interaction(self, frame, traceback):
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.setup(frame, traceback)
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.print_stack_entry(self.stack[self.curindex])
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.cmdloop()
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.forget()
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def displayhook(self, obj):
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Custom displayhook for the exec in default(), which prevents
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        assignment of the _ variable in the builtins.
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # reproduce the behavior of the standard displayhook, not printing None
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if obj is not None:
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print repr(obj)
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def default(self, line):
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if line[:1] == '!': line = line[1:]
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        locals = self.curframe_locals
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        globals = self.curframe.f_globals
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            code = compile(line + '\n', '<stdin>', 'single')
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save_stdout = sys.stdout
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save_stdin = sys.stdin
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            save_displayhook = sys.displayhook
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.stdin = self.stdin
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.stdout = self.stdout
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.displayhook = self.displayhook
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                exec code in globals, locals
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.stdout = save_stdout
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.stdin = save_stdin
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                sys.displayhook = save_displayhook
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t, v = sys.exc_info()[:2]
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if type(t) == type(''):
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                exc_type_name = t
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else: exc_type_name = t.__name__
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '***', exc_type_name + ':', v
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def precmd(self, line):
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Handle alias expansion and ';;' separator."""
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not line.strip():
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return line
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = line.split()
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        while args[0] in self.aliases:
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            line = self.aliases[args[0]]
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ii = 1
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for tmpArg in args[1:]:
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line = line.replace("%" + str(ii),
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                      tmpArg)
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                ii = ii + 1
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            line = line.replace("%*", ' '.join(args[1:]))
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            args = line.split()
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # split into ';;' separated commands
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # unless it's an alias command
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if args[0] != 'alias':
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            marker = line.find(';;')
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if marker >= 0:
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # queue up everything after marker
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                next = line[marker+2:].lstrip()
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.cmdqueue.append(next)
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line = line[:marker].rstrip()
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return line
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def onecmd(self, line):
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Interpret the argument as though it had been typed in response
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        to the prompt.
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Checks whether this line is typed at the normal prompt or in
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a breakpoint command list definition.
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not self.commands_defining:
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return cmd.Cmd.onecmd(self, line)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return self.handle_command_def(line)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def handle_command_def(self,line):
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Handles one command line during command list definition."""
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cmd, arg, line = self.parseline(line)
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not cmd:
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if cmd == 'silent':
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.commands_silent[self.commands_bnum] = True
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return # continue to handle other cmd def in the cmd list
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif cmd == 'end':
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cmdqueue = []
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 1 # end of cmd list
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cmdlist = self.commands[self.commands_bnum]
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if arg:
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cmdlist.append(cmd+' '+arg)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cmdlist.append(cmd)
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Determine if we must stop
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func = getattr(self, 'do_' + cmd)
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError:
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            func = self.default
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # one of the resuming commands
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if func.func_name in self.commands_resuming:
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.commands_doprompt[self.commands_bnum] = False
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cmdqueue = []
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 1
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Command definitions, called by cmdloop()
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The argument is the remaining string on the command line
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Return true to exit from the command loop
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_h = cmd.Cmd.do_help
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_commands(self, arg):
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Defines a list of commands associated to a breakpoint.
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Those commands will be executed whenever the breakpoint causes
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        the program to stop execution."""
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not arg:
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bnum = len(bdb.Breakpoint.bpbynumber)-1
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bnum = int(arg)
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, "Usage : commands [bnum]\n        ..." \
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     "\n        end"
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_bnum = bnum
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands[bnum] = []
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_doprompt[bnum] = True
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_silent[bnum] = False
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        prompt_back = self.prompt
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.prompt = '(com) '
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.commands_defining = True
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.cmdloop()
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.commands_defining = False
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.prompt = prompt_back
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_break(self, arg, temporary = 0):
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # break [ ([filename:]lineno | function) [, "condition"] ]
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not arg:
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if self.breaks:  # There's at least one
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, "Num Type         Disp Enb   Where"
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for bp in bdb.Breakpoint.bpbynumber:
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if bp:
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        bp.bpprint(self.stdout)
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # parse arguments; comma has lowest precedence
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and cannot occur in filename
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = None
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lineno = None
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cond = None
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        comma = arg.find(',')
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if comma > 0:
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # parse stuff after comma: "condition"
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cond = arg[comma+1:].lstrip()
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            arg = arg[:comma].rstrip()
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # parse stuff before comma: [filename:]lineno | function
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        colon = arg.rfind(':')
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        funcname = None
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if colon >= 0:
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = arg[:colon].rstrip()
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f = self.lookupmodule(filename)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not f:
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, '*** ', repr(filename),
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'not found from sys.path'
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                filename = f
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            arg = arg[colon+1:].lstrip()
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                lineno = int(arg)
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError, msg:
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, '*** Bad lineno:', arg
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # no colon; can be lineno or function
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                lineno = int(arg)
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    func = eval(arg,
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                self.curframe.f_globals,
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                self.curframe_locals)
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except:
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    func = arg
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try:
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if hasattr(func, 'im_func'):
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        func = func.im_func
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    code = func.func_code
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    #use co_name to identify the bkpt (function names
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    #could be aliased, but co_name is invariant)
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    funcname = code.co_name
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    lineno = code.co_firstlineno
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    filename = code.co_filename
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except:
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    # last thing to try
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    (ok, filename, ln) = self.lineinfo(arg)
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if not ok:
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        print >>self.stdout, '*** The specified object',
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        print >>self.stdout, repr(arg),
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        print >>self.stdout, 'is not a function'
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        print >>self.stdout, 'or was not found along sys.path.'
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        return
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    funcname = ok # ok contains a function name
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    lineno = int(ln)
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not filename:
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = self.defaultFile()
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check for reasonable breakpoint
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = self.checkline(filename, lineno)
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if line:
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # now set the break point
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            err = self.set_break(filename, line, temporary, cond, funcname)
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if err: print >>self.stdout, '***', err
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bp = self.get_breaks(filename, line)[-1]
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                                 bp.file,
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                                 bp.line)
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # To be overridden in derived debuggers
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def defaultFile(self):
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Produce a reasonable default."""
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = self.curframe.f_code.co_filename
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if filename == '<string>' and self.mainpyfile:
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = self.mainpyfile
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return filename
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_b = do_break
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_tbreak(self, arg):
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.do_break(arg, 1)
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def lineinfo(self, identifier):
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        failed = (None, None, None)
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Input is identifier, may be in single quotes
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        idstring = identifier.split("'")
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if len(idstring) == 1:
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # not in single quotes
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            id = idstring[0].strip()
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif len(idstring) == 3:
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # quoted
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            id = idstring[1].strip()
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return failed
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if id == '': return failed
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        parts = id.split('.')
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Protection for derived debuggers
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if parts[0] == 'self':
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del parts[0]
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if len(parts) == 0:
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return failed
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Best first guess at file to look at
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fname = self.defaultFile()
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if len(parts) == 1:
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            item = parts[0]
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # More than one part.
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # First is module, second is method/class
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f = self.lookupmodule(parts[0])
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if f:
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                fname = f
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            item = parts[1]
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        answer = find_function(item, fname)
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return answer or failed
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def checkline(self, filename, lineno):
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Check whether specified line seems to be executable.
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line or EOF). Warning: testing is not comprehensive.
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # this method should be callable before starting debugging, so default
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # to "no globals" if there is no current frame
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = linecache.getline(filename, lineno, globs)
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not line:
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, 'End of file'
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        line = line.strip()
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Don't allow setting breakpoint at a blank line
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if (not line or (line[0] == '#') or
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             (line[:3] == '"""') or line[:3] == "'''"):
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '*** Blank or comment'
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return 0
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return lineno
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_enable(self, arg):
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split()
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in args:
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                i = int(i)
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Breakpoint index %r is not a number' % i
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'No breakpoint numbered', i
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp = bdb.Breakpoint.bpbynumber[i]
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if bp:
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bp.enable()
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_disable(self, arg):
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split()
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in args:
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                i = int(i)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Breakpoint index %r is not a number' % i
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'No breakpoint numbered', i
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp = bdb.Breakpoint.bpbynumber[i]
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if bp:
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                bp.disable()
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_condition(self, arg):
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # arg is breakpoint number and condition
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split(' ', 1)
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bpnum = int(args[0].strip())
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # something went wrong
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, \
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'Breakpoint index %r is not a number' % args[0]
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cond = args[1]
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cond = None
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp = bdb.Breakpoint.bpbynumber[bpnum]
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IndexError:
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if bp:
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp.cond = cond
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not cond:
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Breakpoint', bpnum,
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'is now unconditional.'
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_ignore(self,arg):
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """arg is bp number followed by ignore count."""
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split()
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bpnum = int(args[0].strip())
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # something went wrong
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, \
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                'Breakpoint index %r is not a number' % args[0]
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            count = int(args[1].strip())
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            count = 0
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp = bdb.Breakpoint.bpbynumber[bpnum]
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except IndexError:
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if bp:
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            bp.ignore = count
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if count > 0:
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                reply = 'Will ignore next '
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if count > 1:
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    reply = reply + '%d crossings' % count
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    reply = reply + '1 crossing'
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Will stop next time breakpoint',
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, bpnum, 'is reached.'
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_clear(self, arg):
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Three possibilities, tried in this order:
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        clear -> clear all breaks, ask for confirmation
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        clear file:lineno -> clear all breaks at file:lineno
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        clear bpno bpno ... -> clear breakpoints by number"""
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not arg:
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                reply = raw_input('Clear all breaks? ')
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except EOFError:
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                reply = 'no'
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            reply = reply.strip().lower()
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if reply in ('y', 'yes'):
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.clear_all_breaks()
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if ':' in arg:
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # Make sure it works for "clear C:\foo\bar.py:12"
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = arg.rfind(':')
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = arg[:i]
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            arg = arg[i+1:]
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                lineno = int(arg)
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                err = "Invalid line number (%s)" % arg
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                err = self.clear_break(filename, lineno)
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if err: print >>self.stdout, '***', err
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        numberlist = arg.split()
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in numberlist:
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                i = int(i)
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError:
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Breakpoint index %r is not a number' % i
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'No breakpoint numbered', i
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                continue
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            err = self.clear_bpbynumber(i)
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if err:
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, '***', err
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, 'Deleted breakpoint', i
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_cl = do_clear # 'c' is already an abbreviation for 'continue'
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_where(self, arg):
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.print_stack_trace()
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_w = do_where
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_bt = do_where
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_up(self, arg):
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.curindex == 0:
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '*** Oldest frame'
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curindex = self.curindex - 1
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curframe = self.stack[self.curindex][0]
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curframe_locals = self.curframe.f_locals
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.print_stack_entry(self.stack[self.curindex])
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.lineno = None
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_u = do_up
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_down(self, arg):
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.curindex + 1 == len(self.stack):
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '*** Newest frame'
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curindex = self.curindex + 1
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curframe = self.stack[self.curindex][0]
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.curframe_locals = self.curframe.f_locals
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.print_stack_entry(self.stack[self.curindex])
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.lineno = None
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_d = do_down
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_until(self, arg):
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_until(self.curframe)
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_unt = do_until
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_step(self, arg):
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_step()
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_s = do_step
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_next(self, arg):
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_next(self.curframe)
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_n = do_next
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_run(self, arg):
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Restart program by raising an exception to be caught in the main
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        debugger loop.  If arguments were given, set them in sys.argv."""
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if arg:
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            import shlex
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            argv0 = sys.argv[0:1]
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            sys.argv = shlex.split(arg)
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            sys.argv[:0] = argv0
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        raise Restart
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_restart = do_run
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_return(self, arg):
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_return(self.curframe)
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_r = do_return
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_continue(self, arg):
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_continue()
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_c = do_cont = do_continue
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_jump(self, arg):
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if self.curindex + 1 != len(self.stack):
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, "*** You can only jump within the bottom frame"
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            arg = int(arg)
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, "*** The 'jump' command requires a line number."
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # Do the jump, fix up our copy of the stack, and display the
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # new position
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.curframe.f_lineno = arg
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.stack[self.curindex] = self.stack[self.curindex][0], arg
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.print_stack_entry(self.stack[self.curindex])
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except ValueError, e:
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, '*** Jump failed:', e
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_j = do_jump
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_debug(self, arg):
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.settrace(None)
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        globals = self.curframe.f_globals
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        locals = self.curframe_locals
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = Pdb(self.completekey, self.stdin, self.stdout)
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p.prompt = "(%s) " % self.prompt.strip()
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.call_tracing(p.run, (arg, globals, locals))
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.settrace(self.trace_dispatch)
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.lastcmd = p.lastcmd
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_quit(self, arg):
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._user_requested_quit = 1
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_quit()
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_q = do_quit
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_exit = do_quit
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_EOF(self, arg):
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._user_requested_quit = 1
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.set_quit()
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_args(self, arg):
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        co = self.curframe.f_code
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dict = self.curframe_locals
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        n = co.co_argcount
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if co.co_flags & 4: n = n+1
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if co.co_flags & 8: n = n+1
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(n):
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            name = co.co_varnames[i]
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, name, '=',
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if name in dict: print >>self.stdout, dict[name]
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else: print >>self.stdout, "*** undefined ***"
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_a = do_args
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_retval(self, arg):
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if '__return__' in self.curframe_locals:
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, self.curframe_locals['__return__']
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '*** Not yet returned!'
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_rv = do_retval
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _getval(self, arg):
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return eval(arg, self.curframe.f_globals,
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.curframe_locals)
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t, v = sys.exc_info()[:2]
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if isinstance(t, str):
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                exc_type_name = t
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else: exc_type_name = t.__name__
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '***', exc_type_name + ':', repr(v)
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_p(self, arg):
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, repr(self._getval(arg))
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_pp(self, arg):
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pprint.pprint(self._getval(arg), self.stdout)
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_list(self, arg):
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.lastcmd = 'list'
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        last = None
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if arg:
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x = eval(arg, {}, {})
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if type(x) == type(()):
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    first, last = x
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    first = int(first)
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    last = int(last)
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if last < first:
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        # Assume it's a count
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        last = first + last
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    first = max(1, int(x) - 5)
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, '*** Error in argument:', repr(arg)
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        elif self.lineno is None:
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            first = max(1, self.curframe.f_lineno - 5)
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            first = self.lineno + 1
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if last is None:
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            last = first + 10
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = self.curframe.f_code.co_filename
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        breaklist = self.get_file_breaks(filename)
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for lineno in range(first, last+1):
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                line = linecache.getline(filename, lineno,
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         self.curframe.f_globals)
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if not line:
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    print >>self.stdout, '[EOF]'
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    break
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    s = repr(lineno).rjust(3)
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if len(s) < 4: s = s + ' '
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if lineno in breaklist: s = s + 'B'
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    else: s = s + ' '
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if lineno == self.curframe.f_lineno:
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        s = s + '->'
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    print >>self.stdout, s + '\t' + line,
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.lineno = lineno
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except KeyboardInterrupt:
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    do_l = do_list
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_whatis(self, arg):
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            value = eval(arg, self.curframe.f_globals,
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self.curframe_locals)
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t, v = sys.exc_info()[:2]
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if type(t) == type(''):
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                exc_type_name = t
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else: exc_type_name = t.__name__
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '***', exc_type_name + ':', repr(v)
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        code = None
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Is it a function?
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try: code = value.func_code
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except: pass
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if code:
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, 'Function', code.co_name
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Is it an instance method?
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try: code = value.im_func.func_code
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except: pass
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if code:
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, 'Method', code.co_name
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # None of the above...
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, type(value)
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_alias(self, arg):
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split()
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if len(args) == 0:
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            keys = self.aliases.keys()
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            keys.sort()
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for alias in keys:
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if args[0] in self.aliases and len(args) == 1:
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.aliases[args[0]] = ' '.join(args[1:])
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def do_unalias(self, arg):
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        args = arg.split()
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if len(args) == 0: return
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if args[0] in self.aliases:
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del self.aliases[args[0]]
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #list of all the commands making the program resume execution.
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         'do_quit', 'do_jump']
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Print a traceback starting at the top stack frame.
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The most recently entered frame is printed last;
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # this is different from dbx and gdb, but consistent with
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # the Python interpreter's stack trace.
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # It is also consistent with the up/down commands (which are
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # compatible with dbx and gdb: up moves towards 'main()'
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # and down moves towards the most recent stack frame).
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def print_stack_trace(self):
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for frame_lineno in self.stack:
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.print_stack_entry(frame_lineno)
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except KeyboardInterrupt:
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        frame, lineno = frame_lineno
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if frame is self.curframe:
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, '>',
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print >>self.stdout, ' ',
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, self.format_stack_entry(frame_lineno,
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                     prompt_prefix)
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Help methods (derived from pdb.doc)
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_help(self):
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_h()
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_h(self):
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """h(elp)
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWithout argument, print the list of available commands.
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith a command name as argument, print help about that command
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"help pdb" pipes the full documentation file to the $PAGER
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"help exec" gives help on the ! command"""
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_where(self):
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_w()
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_w(self):
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """w(here)
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPrint a stack trace, with the most recent frame at the bottom.
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoAn arrow indicates the "current frame", which determines the
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocontext of most commands.  'bt' is an alias for this command."""
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help_bt = help_w
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_down(self):
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_d()
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_d(self):
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """d(own)
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoMove the current frame one level down in the stack trace
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(to a newer frame)."""
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_up(self):
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_u()
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_u(self):
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """u(p)
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoMove the current frame one level up in the stack trace
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(to an older frame)."""
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_break(self):
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_b()
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_b(self):
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith a line number argument, set a break there in the current
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofile.  With a function name, set a break at first executable line
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoof that function.  Without argument, list all breaks.  If a second
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoargument is present, it is a string specifying an expression
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaowhich must evaluate to true before the breakpoint is honored.
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe line number may be prefixed with a filename and a colon,
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoto specify a breakpoint in another file (probably one that
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaohasn't been loaded yet).  The file is searched for on sys.path;
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothe .py suffix may be omitted."""
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_clear(self):
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_cl()
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_cl(self):
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, "cl(ear) filename:lineno"
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith a space separated list of breakpoint numbers, clear
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothose breakpoints.  Without argument, clear all breaks (but
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofirst ask confirmation).  With a filename:lineno argument,
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclear all breaks at that line in that file.
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoNote that the argument is different from previous versions of
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothe debugger (in python distributions 1.5.1 and before) where
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoa linenumber was used instead of either filename:lineno or
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobreakpoint numbers."""
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_tbreak(self):
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """tbreak  same arguments as break, but breakpoint
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaois removed when first hit."""
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_enable(self):
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """enable bpnumber [bpnumber ...]
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEnables the breakpoints given as a space separated list of
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobp numbers."""
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_disable(self):
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """disable bpnumber [bpnumber ...]
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDisables the breakpoints given as a space separated list of
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobp numbers."""
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_ignore(self):
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """ignore bpnumber count
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSets the ignore count for the given breakpoint number.  A breakpoint
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobecomes active when the ignore count is zero.  When non-zero, the
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocount is decremented each time the breakpoint is reached and the
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobreakpoint is not disabled and any associated condition evaluates
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoto true."""
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_condition(self):
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """condition bpnumber str_condition
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaostr_condition is a string specifying an expression which
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomust evaluate to true before the breakpoint is honored.
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoIf str_condition is absent, any existing condition is removed;
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoi.e., the breakpoint is made unconditional."""
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_step(self):
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_s()
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_s(self):
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """s(tep)
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute the current line, stop at the first possible occasion
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(either in a function that is called or in the current function)."""
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_until(self):
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_unt()
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_unt(self):
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print """unt(il)
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoContinue execution until the line with a number greater than the current
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoone is reached or until the current frame returns"""
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_next(self):
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_n()
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_n(self):
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """n(ext)
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoContinue execution until the next line in the current function
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaois reached or it returns."""
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_return(self):
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_r()
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_r(self):
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """r(eturn)
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoContinue execution until the current function returns."""
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_continue(self):
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_c()
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_cont(self):
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_c()
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_c(self):
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """c(ont(inue))
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoContinue execution, only stop when a breakpoint is encountered."""
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_jump(self):
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_j()
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_j(self):
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """j(ump) lineno
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSet the next line that will be executed."""
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_debug(self):
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """debug code
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoEnter a recursive debugger that steps through the code argument
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(which is an arbitrary expression or statement to be executed
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoin the current environment)."""
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_list(self):
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_l()
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_l(self):
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """l(ist) [first [,last]]
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoList source code for the current file.
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWithout arguments, list 11 lines around the current line
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoor continue the previous listing.
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith one argument, list 11 lines starting at that line.
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith two arguments, list the given range;
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif the second argument is less than the first, it is a count."""
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_args(self):
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_a()
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_a(self):
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """a(rgs)
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPrint the arguments of the current function."""
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_p(self):
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """p expression
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPrint the value of the expression."""
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_pp(self):
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """pp expression
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPretty-print the value of the expression."""
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_exec(self):
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """(!) statement
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExecute the (one-line) statement in the context of
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothe current stack frame.
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe exclamation point can be omitted unless the first word
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoof the statement resembles a debugger command.
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTo assign to a global variable you must always prefix the
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocommand with a 'global' command, e.g.:
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(Pdb) global list_options; list_options = ['-l']
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(Pdb)"""
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_run(self):
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print """run [args...]
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoRestart the debugged python program. If a string is supplied, it is
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosplitted with "shlex" and the result is used as the new sys.argv.
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHistory, breakpoints, actions and debugger options are preserved.
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"restart" is an alias for "run"."""
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help_restart = help_run
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_quit(self):
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.help_q()
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_q(self):
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """q(uit) or exit - Quit from the debugger.
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThe program being executed is aborted."""
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    help_exit = help_q
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_whatis(self):
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """whatis arg
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoPrints the type of the argument."""
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_EOF(self):
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """EOF
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoHandles the receipt of EOF as a command."""
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_alias(self):
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """alias [name [command [parameter parameter ...]]]
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoCreates an alias called 'name' the executes 'command'.  The command
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomust *not* be enclosed in quotes.  Replaceable parameters are
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoindicated by %1, %2, and so on, while %* is replaced by all the
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoparameters.  If no command is given, the current alias for name
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaois shown. If no name is given, all aliases are listed.
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoAliases may be nested and can contain anything that can be
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaolegally typed at the pdb prompt.  Note!  You *can* override
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaointernal pdb commands with aliases!  Those internal commands
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoare then hidden until the alias is removed.  Aliasing is recursively
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoapplied to the first word of the command line; all other words
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoin the line are left alone.
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSome useful aliases (especially when placed in the .pdbrc file) are:
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#Print instance variables (usage "pi classInst")
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoalias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#Print instance variables in self
11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoalias ps pi self
11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_unalias(self):
11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """unalias name
11474adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoDeletes the specified alias."""
11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_commands(self):
11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print >>self.stdout, """commands [bpnumber]
11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(com) ...
11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(com) end
11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(Pdb)
11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11554adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSpecify a list of commands for breakpoint number bpnumber.  The
11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocommands themselves appear on the following lines.  Type a line
11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocontaining just 'end' to terminate the commands.
11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11594adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTo remove all commands from a breakpoint, type commands and
11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofollow it immediately with  end; that is, give no commands.
11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11624adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWith no bpnumber argument, commands refers to the last
11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobreakpoint set.
11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11654adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoYou can use breakpoint commands to start your program up again.
11664adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSimply use the continue command, or step, or any other
11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocommand that resumes execution.
11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11694adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoSpecifying any command resuming execution (currently continue,
11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaostep, next, return, jump, quit and their abbreviations) terminates
11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothe command list (as if that command was immediately followed by end).
11724adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis is because any time you resume execution
11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao(even with a simple next or step), you may encounter
11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoanother breakpoint--which could have its own command list, leading to
11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoambiguities about which list to execute.
11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao   If you use the 'silent' command in the command list, the
11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaousual message about stopping at a breakpoint is not printed.  This may
11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaobe desirable for breakpoints that are to print a specific message and
11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaothen continue.  If none of the other commands print anything, you
11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosee no sign that the breakpoint was reached.
11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def help_pdb(self):
11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        help()
11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def lookupmodule(self, filename):
11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Helper function for break/clear parsing -- may be overridden.
11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lookupmodule() translates (possibly incomplete) file or module name
11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        into an absolute file name.
11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if os.path.isabs(filename) and  os.path.exists(filename):
11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return filename
11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f = os.path.join(sys.path[0], filename)
11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if  os.path.exists(f) and self.canonic(f) == self.mainpyfile:
11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return f
11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        root, ext = os.path.splitext(filename)
11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if ext == '':
12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            filename = filename + '.py'
12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if os.path.isabs(filename):
12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return filename
12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for dirname in sys.path:
12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            while os.path.islink(dirname):
12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                dirname = os.readlink(dirname)
12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fullname = os.path.join(dirname, filename)
12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if os.path.exists(fullname):
12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return fullname
12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return None
12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _runscript(self, filename):
12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The script has to run in __main__ namespace (or imports from
12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # __main__ will break).
12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # So we clear up the __main__ and set several special variables
12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (this gets rid of pdb's globals and cleans old variables on restarts).
12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import __main__
12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __main__.__dict__.clear()
12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        __main__.__dict__.update({"__name__"    : "__main__",
12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  "__file__"    : filename,
12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                  "__builtins__": __builtins__,
12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                 })
12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When bdb sets tracing, a number of call and line events happens
12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # BEFORE debugger even reaches user's code (and the exact sequence of
12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # events depends on python version). So we take special measures to
12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # avoid stopping before we reach the main script (see user_line and
12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # user_call for details).
12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._wait_for_mainpyfile = 1
12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.mainpyfile = self.canonic(filename)
12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._user_requested_quit = 0
12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        statement = 'execfile(%r)' % filename
12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.run(statement)
12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Simplified interface
12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef run(statement, globals=None, locals=None):
12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pdb().run(statement, globals, locals)
12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef runeval(expression, globals=None, locals=None):
12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Pdb().runeval(expression, globals, locals)
12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef runctx(statement, globals, locals):
12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # B/W compatibility
12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run(statement, globals, locals)
12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef runcall(*args, **kwds):
12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return Pdb().runcall(*args, **kwds)
12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef set_trace():
12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Pdb().set_trace(sys._getframe().f_back)
12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Post-Mortem interface
12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef post_mortem(t=None):
12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # handling the default
12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if t is None:
12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # sys.exc_info() returns (type, value, traceback) if an exception is
12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # being handled, otherwise it returns None
12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = sys.exc_info()[2]
12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if t is None:
12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise ValueError("A valid traceback must be passed if no "
12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                               "exception is being handled")
12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    p = Pdb()
12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    p.reset()
12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    p.interaction(None, t)
12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef pm():
12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    post_mortem(sys.last_traceback)
12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Main program for testing
12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12754adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoTESTCMD = 'import x; x.main()'
12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test():
12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    run(TESTCMD)
12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# print help
12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef help():
12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for dirname in sys.path:
12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        fullname = os.path.join(dirname, 'pdb.doc')
12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if os.path.exists(fullname):
12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            sts = os.system('${PAGER-more} '+fullname)
12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if sts: print '*** Pager exit status:', sts
12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            break
12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    else:
12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print 'Sorry, can\'t find the help file "pdb.doc"',
12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print 'along the Python search path'
12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef main():
12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print "usage: pdb.py scriptfile [arg] ..."
12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.exit(2)
12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    mainpyfile =  sys.argv[1]     # Get script filename
12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    if not os.path.exists(mainpyfile):
12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        print 'Error:', mainpyfile, 'does not exist'
13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sys.exit(1)
13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    del sys.argv[0]         # Hide "pdb.py" from argument list
13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Replace pdb's dir with script's dir in front of module search path.
13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    sys.path[0] = os.path.dirname(mainpyfile)
13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # modified by the script being debugged. It's a bad idea when it was
13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # changed by the user from the command line. There is a "restart" command
13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # which allows explicit specification of command line arguments.
13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pdb = Pdb()
13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    while True:
13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pdb._runscript(mainpyfile)
13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if pdb._user_requested_quit:
13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                break
13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "The program finished and will be restarted"
13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except Restart:
13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "Restarting", mainpyfile, "with arguments:"
13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "\t" + " ".join(sys.argv[1:])
13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except SystemExit:
13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # In most cases SystemExit does not warrant a post-mortem session.
13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "The program exited via sys.exit(). Exit status: ",
13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print sys.exc_info()[1]
13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except:
13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            traceback.print_exc()
13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "Uncaught exception. Entering post mortem debugging"
13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "Running 'cont' or 'step' will restart the program"
13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t = sys.exc_info()[2]
13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pdb.interaction(None, t)
13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            print "Post mortem debugger finished. The " + mainpyfile + \
13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                  " will be restarted"
13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# When invoked as main program, invoke the debugger on a script
13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == '__main__':
13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    import pdb
13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pdb.main()
1339