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