| Guido van Rossum | f06ee5f | 1996-11-27 19:52:01 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python | 
| Guido van Rossum | f17361d | 1996-07-30 16:28:13 +0000 | [diff] [blame] | 2 |  | 
| Guido van Rossum | 4b8c6ea | 2000-02-04 15:39:30 +0000 | [diff] [blame] | 3 | """A Python debugger.""" | 
| Guido van Rossum | 92df0c6 | 1992-01-14 18:30:15 +0000 | [diff] [blame] | 4 |  | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 5 | # (See pdb.doc for documentation.) | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 6 |  | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 7 | import sys | 
 | 8 | import linecache | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 9 | import cmd | 
 | 10 | import bdb | 
| Guido van Rossum | ef1b41b | 2002-09-10 21:57:14 +0000 | [diff] [blame] | 11 | from repr import Repr | 
| Guido van Rossum | b5699c7 | 1998-07-20 23:13:54 +0000 | [diff] [blame] | 12 | import os | 
| Barry Warsaw | 2bee8fe | 1999-09-09 16:32:41 +0000 | [diff] [blame] | 13 | import re | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 14 | import pprint | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 15 | import traceback | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 16 |  | 
 | 17 |  | 
 | 18 | class Restart(Exception): | 
 | 19 |     """Causes a debugger to be restarted for the debugged python program.""" | 
 | 20 |     pass | 
 | 21 |  | 
| Guido van Rossum | ef1b41b | 2002-09-10 21:57:14 +0000 | [diff] [blame] | 22 | # Create a custom safe Repr instance and increase its maxstring. | 
 | 23 | # The default of 30 truncates error messages too easily. | 
 | 24 | _repr = Repr() | 
 | 25 | _repr.maxstring = 200 | 
 | 26 | _saferepr = _repr.repr | 
 | 27 |  | 
| Skip Montanaro | 352674d | 2001-02-07 23:14:30 +0000 | [diff] [blame] | 28 | __all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace", | 
 | 29 |            "post_mortem", "help"] | 
 | 30 |  | 
| Barry Warsaw | 2bee8fe | 1999-09-09 16:32:41 +0000 | [diff] [blame] | 31 | def find_function(funcname, filename): | 
| Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 32 |     cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname)) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 33 |     try: | 
 | 34 |         fp = open(filename) | 
 | 35 |     except IOError: | 
 | 36 |         return None | 
 | 37 |     # consumer of this info expects the first line to be 1 | 
 | 38 |     lineno = 1 | 
 | 39 |     answer = None | 
 | 40 |     while 1: | 
 | 41 |         line = fp.readline() | 
 | 42 |         if line == '': | 
 | 43 |             break | 
 | 44 |         if cre.match(line): | 
 | 45 |             answer = funcname, filename, lineno | 
 | 46 |             break | 
 | 47 |         lineno = lineno + 1 | 
 | 48 |     fp.close() | 
 | 49 |     return answer | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 50 |  | 
 | 51 |  | 
| Guido van Rossum | a558e37 | 1994-11-10 22:27:35 +0000 | [diff] [blame] | 52 | # Interaction prompt line will separate file and call info from code | 
 | 53 | # text using value of line_prefix string.  A newline and arrow may | 
 | 54 | # be to your liking.  You can set it once pdb is imported using the | 
 | 55 | # command "pdb.line_prefix = '\n% '". | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 56 | # line_prefix = ': '    # Use this to get the old situation back | 
 | 57 | line_prefix = '\n-> '   # Probably a better default | 
| Guido van Rossum | a558e37 | 1994-11-10 22:27:35 +0000 | [diff] [blame] | 58 |  | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 59 | class Pdb(bdb.Bdb, cmd.Cmd): | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 60 |  | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 61 |     def __init__(self, completekey='tab', stdin=None, stdout=None): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 62 |         bdb.Bdb.__init__(self) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 63 |         cmd.Cmd.__init__(self, completekey, stdin, stdout) | 
 | 64 |         if stdout: | 
 | 65 |             self.use_rawinput = 0 | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 66 |         self.prompt = '(Pdb) ' | 
 | 67 |         self.aliases = {} | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 68 |         self.mainpyfile = '' | 
 | 69 |         self._wait_for_mainpyfile = 0 | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 70 |         # Try to load readline if it exists | 
 | 71 |         try: | 
 | 72 |             import readline | 
 | 73 |         except ImportError: | 
 | 74 |             pass | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 75 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 76 |         # Read $HOME/.pdbrc and ./.pdbrc | 
 | 77 |         self.rcLines = [] | 
| Raymond Hettinger | 54f0222 | 2002-06-01 14:18:47 +0000 | [diff] [blame] | 78 |         if 'HOME' in os.environ: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 79 |             envHome = os.environ['HOME'] | 
 | 80 |             try: | 
 | 81 |                 rcFile = open(os.path.join(envHome, ".pdbrc")) | 
 | 82 |             except IOError: | 
 | 83 |                 pass | 
 | 84 |             else: | 
 | 85 |                 for line in rcFile.readlines(): | 
 | 86 |                     self.rcLines.append(line) | 
 | 87 |                 rcFile.close() | 
 | 88 |         try: | 
 | 89 |             rcFile = open(".pdbrc") | 
 | 90 |         except IOError: | 
 | 91 |             pass | 
 | 92 |         else: | 
 | 93 |             for line in rcFile.readlines(): | 
 | 94 |                 self.rcLines.append(line) | 
 | 95 |             rcFile.close() | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 96 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 97 |         self.commands = {} # associates a command list to breakpoint numbers | 
 | 98 |         self.commands_doprompt = {} # for each bp num, tells if the prompt must be disp. after execing the cmd list | 
 | 99 |         self.commands_silent = {} # for each bp num, tells if the stack trace must be disp. after execing the cmd list | 
 | 100 |         self.commands_defining = False # True while in the process of defining a command list | 
 | 101 |         self.commands_bnum = None # The breakpoint number for which we are defining a list | 
 | 102 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 103 |     def reset(self): | 
 | 104 |         bdb.Bdb.reset(self) | 
 | 105 |         self.forget() | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 106 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 107 |     def forget(self): | 
 | 108 |         self.lineno = None | 
 | 109 |         self.stack = [] | 
 | 110 |         self.curindex = 0 | 
 | 111 |         self.curframe = None | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 112 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 113 |     def setup(self, f, t): | 
 | 114 |         self.forget() | 
 | 115 |         self.stack, self.curindex = self.get_stack(f, t) | 
 | 116 |         self.curframe = self.stack[self.curindex][0] | 
 | 117 |         self.execRcLines() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 118 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 119 |     # Can be executed earlier than 'setup' if desired | 
 | 120 |     def execRcLines(self): | 
 | 121 |         if self.rcLines: | 
 | 122 |             # Make local copy because of recursion | 
 | 123 |             rcLines = self.rcLines | 
 | 124 |             # executed only once | 
 | 125 |             self.rcLines = [] | 
 | 126 |             for line in rcLines: | 
 | 127 |                 line = line[:-1] | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 128 |                 if len(line) > 0 and line[0] != '#': | 
 | 129 |                     self.onecmd(line) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 130 |  | 
| Tim Peters | 280488b | 2002-08-23 18:19:30 +0000 | [diff] [blame] | 131 |     # Override Bdb methods | 
| Michael W. Hudson | dd32a91 | 2002-08-15 14:59:02 +0000 | [diff] [blame] | 132 |  | 
 | 133 |     def user_call(self, frame, argument_list): | 
 | 134 |         """This method is called when there is the remote possibility | 
 | 135 |         that we ever need to stop in this function.""" | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 136 |         if self._wait_for_mainpyfile: | 
 | 137 |             return | 
| Michael W. Hudson | 01eb85c | 2003-01-31 17:48:29 +0000 | [diff] [blame] | 138 |         if self.stop_here(frame): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 139 |             print('--Call--', file=self.stdout) | 
| Michael W. Hudson | 01eb85c | 2003-01-31 17:48:29 +0000 | [diff] [blame] | 140 |             self.interaction(frame, None) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 141 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 142 |     def user_line(self, frame): | 
 | 143 |         """This function is called when we stop or break at this line.""" | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 144 |         if self._wait_for_mainpyfile: | 
 | 145 |             if (self.mainpyfile != self.canonic(frame.f_code.co_filename) | 
 | 146 |                 or frame.f_lineno<= 0): | 
 | 147 |                 return | 
 | 148 |             self._wait_for_mainpyfile = 0 | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 149 |         if self.bp_commands(frame): | 
 | 150 |             self.interaction(frame, None) | 
 | 151 |  | 
 | 152 |     def bp_commands(self,frame): | 
 | 153 |         """ Call every command that was set for the current active breakpoint (if there is one) | 
 | 154 |         Returns True if the normal interaction function must be called, False otherwise """ | 
 | 155 |         #self.currentbp is set in bdb.py in bdb.break_here if a breakpoint was hit | 
 | 156 |         if getattr(self,"currentbp",False) and self.currentbp in self.commands: | 
 | 157 |             currentbp = self.currentbp | 
 | 158 |             self.currentbp = 0 | 
 | 159 |             lastcmd_back = self.lastcmd | 
 | 160 |             self.setup(frame, None) | 
 | 161 |             for line in self.commands[currentbp]: | 
 | 162 |                 self.onecmd(line) | 
 | 163 |             self.lastcmd = lastcmd_back | 
 | 164 |             if not self.commands_silent[currentbp]: | 
 | 165 |                 self.print_stack_entry(self.stack[self.curindex]) | 
 | 166 |             if self.commands_doprompt[currentbp]: | 
 | 167 |                 self.cmdloop() | 
 | 168 |             self.forget() | 
 | 169 |             return | 
 | 170 |         return 1 | 
| Guido van Rossum | 9e1ee97 | 1997-07-11 13:43:53 +0000 | [diff] [blame] | 171 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 172 |     def user_return(self, frame, return_value): | 
 | 173 |         """This function is called when a return trap is set here.""" | 
 | 174 |         frame.f_locals['__return__'] = return_value | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 175 |         print('--Return--', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 176 |         self.interaction(frame, None) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 177 |  | 
| Guido van Rossum | 1bc535d | 2007-05-15 18:46:22 +0000 | [diff] [blame] | 178 |     def user_exception(self, frame, exc_info): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 179 |         """This function is called if an exception occurs, | 
 | 180 |         but only if we are to stop at or just below this level.""" | 
| Guido van Rossum | 1bc535d | 2007-05-15 18:46:22 +0000 | [diff] [blame] | 181 |         exc_type, exc_value, exc_traceback = exc_info | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 182 |         frame.f_locals['__exception__'] = exc_type, exc_value | 
| Guido van Rossum | 1bc535d | 2007-05-15 18:46:22 +0000 | [diff] [blame] | 183 |         exc_type_name = exc_type.__name__ | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 184 |         print(exc_type_name + ':', _saferepr(exc_value), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 185 |         self.interaction(frame, exc_traceback) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 186 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 187 |     # General interaction function | 
 | 188 |  | 
 | 189 |     def interaction(self, frame, traceback): | 
 | 190 |         self.setup(frame, traceback) | 
 | 191 |         self.print_stack_entry(self.stack[self.curindex]) | 
 | 192 |         self.cmdloop() | 
 | 193 |         self.forget() | 
 | 194 |  | 
 | 195 |     def default(self, line): | 
 | 196 |         if line[:1] == '!': line = line[1:] | 
 | 197 |         locals = self.curframe.f_locals | 
 | 198 |         globals = self.curframe.f_globals | 
 | 199 |         try: | 
 | 200 |             code = compile(line + '\n', '<stdin>', 'single') | 
| Georg Brandl | 7cae87c | 2006-09-06 06:51:57 +0000 | [diff] [blame] | 201 |             exec(code, globals, locals) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 202 |         except: | 
 | 203 |             t, v = sys.exc_info()[:2] | 
 | 204 |             if type(t) == type(''): | 
 | 205 |                 exc_type_name = t | 
 | 206 |             else: exc_type_name = t.__name__ | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 207 |             print('***', exc_type_name + ':', v, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 208 |  | 
 | 209 |     def precmd(self, line): | 
 | 210 |         """Handle alias expansion and ';;' separator.""" | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 211 |         if not line.strip(): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 212 |             return line | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 213 |         args = line.split() | 
| Raymond Hettinger | 54f0222 | 2002-06-01 14:18:47 +0000 | [diff] [blame] | 214 |         while args[0] in self.aliases: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 215 |             line = self.aliases[args[0]] | 
 | 216 |             ii = 1 | 
 | 217 |             for tmpArg in args[1:]: | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 218 |                 line = line.replace("%" + str(ii), | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 219 |                                       tmpArg) | 
 | 220 |                 ii = ii + 1 | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 221 |             line = line.replace("%*", ' '.join(args[1:])) | 
 | 222 |             args = line.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 223 |         # split into ';;' separated commands | 
 | 224 |         # unless it's an alias command | 
 | 225 |         if args[0] != 'alias': | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 226 |             marker = line.find(';;') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 227 |             if marker >= 0: | 
 | 228 |                 # queue up everything after marker | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 229 |                 next = line[marker+2:].lstrip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 230 |                 self.cmdqueue.append(next) | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 231 |                 line = line[:marker].rstrip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 232 |         return line | 
 | 233 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 234 |     def onecmd(self, line): | 
 | 235 |         """Interpret the argument as though it had been typed in response | 
 | 236 |         to the prompt. | 
 | 237 |  | 
| Thomas Wouters | 0e3f591 | 2006-08-11 14:57:12 +0000 | [diff] [blame] | 238 |         Checks whether this line is typed at the normal prompt or in | 
 | 239 |         a breakpoint command list definition. | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 240 |         """ | 
 | 241 |         if not self.commands_defining: | 
 | 242 |             return cmd.Cmd.onecmd(self, line) | 
 | 243 |         else: | 
 | 244 |             return self.handle_command_def(line) | 
 | 245 |  | 
 | 246 |     def handle_command_def(self,line): | 
 | 247 |         """ Handles one command line during command list definition. """ | 
 | 248 |         cmd, arg, line = self.parseline(line) | 
 | 249 |         if cmd == 'silent': | 
 | 250 |             self.commands_silent[self.commands_bnum] = True | 
 | 251 |             return # continue to handle other cmd def in the cmd list | 
 | 252 |         elif cmd == 'end': | 
 | 253 |             self.cmdqueue = [] | 
 | 254 |             return 1 # end of cmd list | 
 | 255 |         cmdlist = self.commands[self.commands_bnum] | 
 | 256 |         if (arg): | 
 | 257 |             cmdlist.append(cmd+' '+arg) | 
 | 258 |         else: | 
 | 259 |             cmdlist.append(cmd) | 
 | 260 |         # Determine if we must stop | 
 | 261 |         try: | 
 | 262 |             func = getattr(self, 'do_' + cmd) | 
 | 263 |         except AttributeError: | 
 | 264 |             func = self.default | 
| Neal Norwitz | 221085d | 2007-02-25 20:55:47 +0000 | [diff] [blame] | 265 |         if func.__name__ in self.commands_resuming : # one of the resuming commands. | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 266 |             self.commands_doprompt[self.commands_bnum] = False | 
 | 267 |             self.cmdqueue = [] | 
 | 268 |             return 1 | 
 | 269 |         return | 
 | 270 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 271 |     # Command definitions, called by cmdloop() | 
 | 272 |     # The argument is the remaining string on the command line | 
 | 273 |     # Return true to exit from the command loop | 
 | 274 |  | 
 | 275 |     do_h = cmd.Cmd.do_help | 
 | 276 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 277 |     def do_commands(self, arg): | 
 | 278 |         """Defines a list of commands associated to a breakpoint | 
 | 279 |         Those commands will be executed whenever the breakpoint causes the program to stop execution.""" | 
 | 280 |         if not arg: | 
 | 281 |             bnum = len(bdb.Breakpoint.bpbynumber)-1 | 
 | 282 |         else: | 
 | 283 |             try: | 
 | 284 |                 bnum = int(arg) | 
 | 285 |             except: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 286 |                 print("Usage : commands [bnum]\n        ...\n        end", file=self.stdout) | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 287 |                 return | 
 | 288 |         self.commands_bnum = bnum | 
 | 289 |         self.commands[bnum] = [] | 
 | 290 |         self.commands_doprompt[bnum] = True | 
 | 291 |         self.commands_silent[bnum] = False | 
 | 292 |         prompt_back = self.prompt | 
 | 293 |         self.prompt = '(com) ' | 
 | 294 |         self.commands_defining = True | 
 | 295 |         self.cmdloop() | 
 | 296 |         self.commands_defining = False | 
 | 297 |         self.prompt = prompt_back | 
 | 298 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 299 |     def do_break(self, arg, temporary = 0): | 
 | 300 |         # break [ ([filename:]lineno | function) [, "condition"] ] | 
 | 301 |         if not arg: | 
 | 302 |             if self.breaks:  # There's at least one | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 303 |                 print("Num Type         Disp Enb   Where", file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 304 |                 for bp in bdb.Breakpoint.bpbynumber: | 
 | 305 |                     if bp: | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 306 |                         bp.bpprint(self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 307 |             return | 
 | 308 |         # parse arguments; comma has lowest precedence | 
 | 309 |         # and cannot occur in filename | 
 | 310 |         filename = None | 
 | 311 |         lineno = None | 
 | 312 |         cond = None | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 313 |         comma = arg.find(',') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 314 |         if comma > 0: | 
 | 315 |             # parse stuff after comma: "condition" | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 316 |             cond = arg[comma+1:].lstrip() | 
 | 317 |             arg = arg[:comma].rstrip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 318 |         # parse stuff before comma: [filename:]lineno | function | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 319 |         colon = arg.rfind(':') | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 320 |         funcname = None | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 321 |         if colon >= 0: | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 322 |             filename = arg[:colon].rstrip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 323 |             f = self.lookupmodule(filename) | 
 | 324 |             if not f: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 325 |                 print('*** ', repr(filename), end=' ', file=self.stdout) | 
 | 326 |                 print('not found from sys.path', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 327 |                 return | 
 | 328 |             else: | 
 | 329 |                 filename = f | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 330 |             arg = arg[colon+1:].lstrip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 331 |             try: | 
 | 332 |                 lineno = int(arg) | 
| Guido van Rossum | b940e11 | 2007-01-10 16:19:56 +0000 | [diff] [blame] | 333 |             except ValueError as msg: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 334 |                 print('*** Bad lineno:', arg, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 335 |                 return | 
 | 336 |         else: | 
 | 337 |             # no colon; can be lineno or function | 
 | 338 |             try: | 
 | 339 |                 lineno = int(arg) | 
 | 340 |             except ValueError: | 
 | 341 |                 try: | 
 | 342 |                     func = eval(arg, | 
 | 343 |                                 self.curframe.f_globals, | 
 | 344 |                                 self.curframe.f_locals) | 
 | 345 |                 except: | 
 | 346 |                     func = arg | 
 | 347 |                 try: | 
 | 348 |                     if hasattr(func, 'im_func'): | 
 | 349 |                         func = func.im_func | 
| Neal Norwitz | 221085d | 2007-02-25 20:55:47 +0000 | [diff] [blame] | 350 |                     code = func.__code__ | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 351 |                     #use co_name to identify the bkpt (function names | 
 | 352 |                     #could be aliased, but co_name is invariant) | 
 | 353 |                     funcname = code.co_name | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 354 |                     lineno = code.co_firstlineno | 
 | 355 |                     filename = code.co_filename | 
 | 356 |                 except: | 
 | 357 |                     # last thing to try | 
 | 358 |                     (ok, filename, ln) = self.lineinfo(arg) | 
 | 359 |                     if not ok: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 360 |                         print('*** The specified object', end=' ', file=self.stdout) | 
 | 361 |                         print(repr(arg), end=' ', file=self.stdout) | 
 | 362 |                         print('is not a function', file=self.stdout) | 
 | 363 |                         print('or was not found along sys.path.', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 364 |                         return | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 365 |                     funcname = ok # ok contains a function name | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 366 |                     lineno = int(ln) | 
 | 367 |         if not filename: | 
 | 368 |             filename = self.defaultFile() | 
 | 369 |         # Check for reasonable breakpoint | 
 | 370 |         line = self.checkline(filename, lineno) | 
 | 371 |         if line: | 
 | 372 |             # now set the break point | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 373 |             err = self.set_break(filename, line, temporary, cond, funcname) | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 374 |             if err: print('***', err, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 375 |             else: | 
 | 376 |                 bp = self.get_breaks(filename, line)[-1] | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 377 |                 print("Breakpoint %d at %s:%d" % (bp.number, | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 378 |                                                                  bp.file, | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 379 |                                                                  bp.line), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 380 |  | 
 | 381 |     # To be overridden in derived debuggers | 
 | 382 |     def defaultFile(self): | 
 | 383 |         """Produce a reasonable default.""" | 
 | 384 |         filename = self.curframe.f_code.co_filename | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 385 |         if filename == '<string>' and self.mainpyfile: | 
 | 386 |             filename = self.mainpyfile | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 387 |         return filename | 
 | 388 |  | 
 | 389 |     do_b = do_break | 
 | 390 |  | 
 | 391 |     def do_tbreak(self, arg): | 
 | 392 |         self.do_break(arg, 1) | 
 | 393 |  | 
 | 394 |     def lineinfo(self, identifier): | 
 | 395 |         failed = (None, None, None) | 
 | 396 |         # Input is identifier, may be in single quotes | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 397 |         idstring = identifier.split("'") | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 398 |         if len(idstring) == 1: | 
 | 399 |             # not in single quotes | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 400 |             id = idstring[0].strip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 401 |         elif len(idstring) == 3: | 
 | 402 |             # quoted | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 403 |             id = idstring[1].strip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 404 |         else: | 
 | 405 |             return failed | 
 | 406 |         if id == '': return failed | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 407 |         parts = id.split('.') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 408 |         # Protection for derived debuggers | 
 | 409 |         if parts[0] == 'self': | 
 | 410 |             del parts[0] | 
 | 411 |             if len(parts) == 0: | 
 | 412 |                 return failed | 
 | 413 |         # Best first guess at file to look at | 
 | 414 |         fname = self.defaultFile() | 
 | 415 |         if len(parts) == 1: | 
 | 416 |             item = parts[0] | 
 | 417 |         else: | 
 | 418 |             # More than one part. | 
 | 419 |             # First is module, second is method/class | 
 | 420 |             f = self.lookupmodule(parts[0]) | 
 | 421 |             if f: | 
 | 422 |                 fname = f | 
 | 423 |             item = parts[1] | 
 | 424 |         answer = find_function(item, fname) | 
 | 425 |         return answer or failed | 
 | 426 |  | 
 | 427 |     def checkline(self, filename, lineno): | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 428 |         """Check whether specified line seems to be executable. | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 429 |  | 
| Johannes Gijsbers | 4a9faa1 | 2004-08-30 13:29:44 +0000 | [diff] [blame] | 430 |         Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank | 
 | 431 |         line or EOF). Warning: testing is not comprehensive. | 
 | 432 |         """ | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 433 |         line = linecache.getline(filename, lineno) | 
 | 434 |         if not line: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 435 |             print('End of file', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 436 |             return 0 | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 437 |         line = line.strip() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 438 |         # Don't allow setting breakpoint at a blank line | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 439 |         if (not line or (line[0] == '#') or | 
 | 440 |              (line[:3] == '"""') or line[:3] == "'''"): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 441 |             print('*** Blank or comment', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 442 |             return 0 | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 443 |         return lineno | 
 | 444 |  | 
 | 445 |     def do_enable(self, arg): | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 446 |         args = arg.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 447 |         for i in args: | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 448 |             try: | 
 | 449 |                 i = int(i) | 
 | 450 |             except ValueError: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 451 |                 print('Breakpoint index %r is not a number' % i, file=self.stdout) | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 452 |                 continue | 
 | 453 |  | 
 | 454 |             if not (0 <= i < len(bdb.Breakpoint.bpbynumber)): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 455 |                 print('No breakpoint numbered', i, file=self.stdout) | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 456 |                 continue | 
 | 457 |  | 
 | 458 |             bp = bdb.Breakpoint.bpbynumber[i] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 459 |             if bp: | 
 | 460 |                 bp.enable() | 
 | 461 |  | 
 | 462 |     def do_disable(self, arg): | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 463 |         args = arg.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 464 |         for i in args: | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 465 |             try: | 
 | 466 |                 i = int(i) | 
 | 467 |             except ValueError: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 468 |                 print('Breakpoint index %r is not a number' % i, file=self.stdout) | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 469 |                 continue | 
| Tim Peters | f545baa | 2003-06-15 23:26:30 +0000 | [diff] [blame] | 470 |  | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 471 |             if not (0 <= i < len(bdb.Breakpoint.bpbynumber)): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 472 |                 print('No breakpoint numbered', i, file=self.stdout) | 
| Andrew M. Kuchling | b1f8bab | 2003-05-22 14:46:12 +0000 | [diff] [blame] | 473 |                 continue | 
 | 474 |  | 
 | 475 |             bp = bdb.Breakpoint.bpbynumber[i] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 476 |             if bp: | 
 | 477 |                 bp.disable() | 
 | 478 |  | 
 | 479 |     def do_condition(self, arg): | 
 | 480 |         # arg is breakpoint number and condition | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 481 |         args = arg.split(' ', 1) | 
| Thomas Wouters | b213704 | 2007-02-01 18:02:27 +0000 | [diff] [blame] | 482 |         try: | 
 | 483 |             bpnum = int(args[0].strip()) | 
 | 484 |         except ValueError: | 
 | 485 |             # something went wrong | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 486 |             print('Breakpoint index %r is not a number' % args[0], file=self.stdout) | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 487 |             return | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 488 |         try: | 
 | 489 |             cond = args[1] | 
 | 490 |         except: | 
 | 491 |             cond = None | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 492 |         try: | 
 | 493 |             bp = bdb.Breakpoint.bpbynumber[bpnum] | 
 | 494 |         except IndexError: | 
 | 495 |             print >>self.stdout, 'Breakpoint index %r is not valid' % args[0] | 
 | 496 |             return | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 497 |         if bp: | 
 | 498 |             bp.cond = cond | 
 | 499 |             if not cond: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 500 |                 print('Breakpoint', bpnum, end=' ', file=self.stdout) | 
 | 501 |                 print('is now unconditional.', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 502 |  | 
 | 503 |     def do_ignore(self,arg): | 
 | 504 |         """arg is bp number followed by ignore count.""" | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 505 |         args = arg.split() | 
| Thomas Wouters | b213704 | 2007-02-01 18:02:27 +0000 | [diff] [blame] | 506 |         try: | 
 | 507 |             bpnum = int(args[0].strip()) | 
 | 508 |         except ValueError: | 
 | 509 |             # something went wrong | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 510 |             print('Breakpoint index %r is not a number' % args[0], file=self.stdout) | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 511 |             return | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 512 |         try: | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 513 |             count = int(args[1].strip()) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 514 |         except: | 
 | 515 |             count = 0 | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 516 |         try: | 
 | 517 |             bp = bdb.Breakpoint.bpbynumber[bpnum] | 
 | 518 |         except IndexError: | 
 | 519 |             print >>self.stdout, 'Breakpoint index %r is not valid' % args[0] | 
 | 520 |             return | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 521 |         if bp: | 
 | 522 |             bp.ignore = count | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 523 |             if count > 0: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 524 |                 reply = 'Will ignore next ' | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 525 |                 if count > 1: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 526 |                     reply = reply + '%d crossings' % count | 
 | 527 |                 else: | 
 | 528 |                     reply = reply + '1 crossing' | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 529 |                 print(reply + ' of breakpoint %d.' % bpnum, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 530 |             else: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 531 |                 print('Will stop next time breakpoint', end=' ', file=self.stdout) | 
 | 532 |                 print(bpnum, 'is reached.', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 533 |  | 
 | 534 |     def do_clear(self, arg): | 
 | 535 |         """Three possibilities, tried in this order: | 
 | 536 |         clear -> clear all breaks, ask for confirmation | 
 | 537 |         clear file:lineno -> clear all breaks at file:lineno | 
 | 538 |         clear bpno bpno ... -> clear breakpoints by number""" | 
 | 539 |         if not arg: | 
 | 540 |             try: | 
| Guido van Rossum | c5b6ab0 | 2007-05-27 09:19:52 +0000 | [diff] [blame] | 541 |                 reply = input('Clear all breaks? ') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 542 |             except EOFError: | 
 | 543 |                 reply = 'no' | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 544 |             reply = reply.strip().lower() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 545 |             if reply in ('y', 'yes'): | 
 | 546 |                 self.clear_all_breaks() | 
 | 547 |             return | 
 | 548 |         if ':' in arg: | 
 | 549 |             # Make sure it works for "clear C:\foo\bar.py:12" | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 550 |             i = arg.rfind(':') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 551 |             filename = arg[:i] | 
 | 552 |             arg = arg[i+1:] | 
 | 553 |             try: | 
 | 554 |                 lineno = int(arg) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 555 |             except ValueError: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 556 |                 err = "Invalid line number (%s)" % arg | 
 | 557 |             else: | 
 | 558 |                 err = self.clear_break(filename, lineno) | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 559 |             if err: print('***', err, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 560 |             return | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 561 |         numberlist = arg.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 562 |         for i in numberlist: | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 563 |             try: | 
 | 564 |                 i = int(i) | 
 | 565 |             except ValueError: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 566 |                 print('Breakpoint index %r is not a number' % i, file=self.stdout) | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 567 |                 continue | 
 | 568 |  | 
| Georg Brandl | 6d2b346 | 2005-08-24 07:36:17 +0000 | [diff] [blame] | 569 |             if not (0 <= i < len(bdb.Breakpoint.bpbynumber)): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 570 |                 print('No breakpoint numbered', i, file=self.stdout) | 
| Georg Brandl | 6d2b346 | 2005-08-24 07:36:17 +0000 | [diff] [blame] | 571 |                 continue | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 572 |             err = self.clear_bpbynumber(i) | 
 | 573 |             if err: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 574 |                 print('***', err, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 575 |             else: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 576 |                 print('Deleted breakpoint', i, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 577 |     do_cl = do_clear # 'c' is already an abbreviation for 'continue' | 
 | 578 |  | 
 | 579 |     def do_where(self, arg): | 
 | 580 |         self.print_stack_trace() | 
 | 581 |     do_w = do_where | 
| Guido van Rossum | 6bd6835 | 2001-01-20 17:57:37 +0000 | [diff] [blame] | 582 |     do_bt = do_where | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 583 |  | 
 | 584 |     def do_up(self, arg): | 
 | 585 |         if self.curindex == 0: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 586 |             print('*** Oldest frame', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 587 |         else: | 
 | 588 |             self.curindex = self.curindex - 1 | 
 | 589 |             self.curframe = self.stack[self.curindex][0] | 
 | 590 |             self.print_stack_entry(self.stack[self.curindex]) | 
 | 591 |             self.lineno = None | 
 | 592 |     do_u = do_up | 
 | 593 |  | 
 | 594 |     def do_down(self, arg): | 
 | 595 |         if self.curindex + 1 == len(self.stack): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 596 |             print('*** Newest frame', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 597 |         else: | 
 | 598 |             self.curindex = self.curindex + 1 | 
 | 599 |             self.curframe = self.stack[self.curindex][0] | 
 | 600 |             self.print_stack_entry(self.stack[self.curindex]) | 
 | 601 |             self.lineno = None | 
 | 602 |     do_d = do_down | 
 | 603 |  | 
 | 604 |     def do_step(self, arg): | 
 | 605 |         self.set_step() | 
 | 606 |         return 1 | 
 | 607 |     do_s = do_step | 
 | 608 |  | 
 | 609 |     def do_next(self, arg): | 
 | 610 |         self.set_next(self.curframe) | 
 | 611 |         return 1 | 
 | 612 |     do_n = do_next | 
 | 613 |  | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 614 |     def do_run(self, arg): | 
 | 615 |         """Restart program by raising an exception to be caught in the main debugger | 
 | 616 |         loop. If arguments were given, set them in sys.argv.""" | 
 | 617 |         if arg: | 
 | 618 |             import shlex | 
 | 619 |             argv0 = sys.argv[0:1] | 
 | 620 |             sys.argv = shlex.split(arg) | 
 | 621 |             sys.argv[:0] = argv0 | 
 | 622 |         raise Restart | 
 | 623 |  | 
 | 624 |     do_restart = do_run | 
 | 625 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 626 |     def do_return(self, arg): | 
 | 627 |         self.set_return(self.curframe) | 
 | 628 |         return 1 | 
 | 629 |     do_r = do_return | 
 | 630 |  | 
 | 631 |     def do_continue(self, arg): | 
 | 632 |         self.set_continue() | 
 | 633 |         return 1 | 
 | 634 |     do_c = do_cont = do_continue | 
 | 635 |  | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 636 |     def do_jump(self, arg): | 
 | 637 |         if self.curindex + 1 != len(self.stack): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 638 |             print("*** You can only jump within the bottom frame", file=self.stdout) | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 639 |             return | 
 | 640 |         try: | 
 | 641 |             arg = int(arg) | 
 | 642 |         except ValueError: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 643 |             print("*** The 'jump' command requires a line number.", file=self.stdout) | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 644 |         else: | 
 | 645 |             try: | 
 | 646 |                 # Do the jump, fix up our copy of the stack, and display the | 
 | 647 |                 # new position | 
 | 648 |                 self.curframe.f_lineno = arg | 
 | 649 |                 self.stack[self.curindex] = self.stack[self.curindex][0], arg | 
 | 650 |                 self.print_stack_entry(self.stack[self.curindex]) | 
| Guido van Rossum | b940e11 | 2007-01-10 16:19:56 +0000 | [diff] [blame] | 651 |             except ValueError as e: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 652 |                 print('*** Jump failed:', e, file=self.stdout) | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 653 |     do_j = do_jump | 
 | 654 |  | 
| Guido van Rossum | a12fe4e | 2003-04-09 19:06:21 +0000 | [diff] [blame] | 655 |     def do_debug(self, arg): | 
 | 656 |         sys.settrace(None) | 
 | 657 |         globals = self.curframe.f_globals | 
 | 658 |         locals = self.curframe.f_locals | 
| Guido van Rossum | ed538d8 | 2003-04-09 19:36:34 +0000 | [diff] [blame] | 659 |         p = Pdb() | 
 | 660 |         p.prompt = "(%s) " % self.prompt.strip() | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 661 |         print("ENTERING RECURSIVE DEBUGGER", file=self.stdout) | 
| Guido van Rossum | ed538d8 | 2003-04-09 19:36:34 +0000 | [diff] [blame] | 662 |         sys.call_tracing(p.run, (arg, globals, locals)) | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 663 |         print("LEAVING RECURSIVE DEBUGGER", file=self.stdout) | 
| Guido van Rossum | a12fe4e | 2003-04-09 19:06:21 +0000 | [diff] [blame] | 664 |         sys.settrace(self.trace_dispatch) | 
 | 665 |         self.lastcmd = p.lastcmd | 
 | 666 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 667 |     def do_quit(self, arg): | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 668 |         self._user_requested_quit = 1 | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 669 |         self.set_quit() | 
 | 670 |         return 1 | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 671 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 672 |     do_q = do_quit | 
| Guido van Rossum | d1c08f3 | 2002-04-15 00:48:24 +0000 | [diff] [blame] | 673 |     do_exit = do_quit | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 674 |  | 
| Guido van Rossum | eef2607 | 2003-01-13 21:13:55 +0000 | [diff] [blame] | 675 |     def do_EOF(self, arg): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 676 |         print(file=self.stdout) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 677 |         self._user_requested_quit = 1 | 
| Guido van Rossum | eef2607 | 2003-01-13 21:13:55 +0000 | [diff] [blame] | 678 |         self.set_quit() | 
 | 679 |         return 1 | 
 | 680 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 681 |     def do_args(self, arg): | 
 | 682 |         f = self.curframe | 
 | 683 |         co = f.f_code | 
 | 684 |         dict = f.f_locals | 
 | 685 |         n = co.co_argcount | 
 | 686 |         if co.co_flags & 4: n = n+1 | 
 | 687 |         if co.co_flags & 8: n = n+1 | 
 | 688 |         for i in range(n): | 
 | 689 |             name = co.co_varnames[i] | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 690 |             print(name, '=', end=' ', file=self.stdout) | 
 | 691 |             if name in dict: print(dict[name], file=self.stdout) | 
 | 692 |             else: print("*** undefined ***", file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 693 |     do_a = do_args | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 694 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 695 |     def do_retval(self, arg): | 
| Raymond Hettinger | 54f0222 | 2002-06-01 14:18:47 +0000 | [diff] [blame] | 696 |         if '__return__' in self.curframe.f_locals: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 697 |             print(self.curframe.f_locals['__return__'], file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 698 |         else: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 699 |             print('*** Not yet returned!', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 700 |     do_rv = do_retval | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 701 |  | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 702 |     def _getval(self, arg): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 703 |         try: | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 704 |             return eval(arg, self.curframe.f_globals, | 
 | 705 |                         self.curframe.f_locals) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 706 |         except: | 
 | 707 |             t, v = sys.exc_info()[:2] | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 708 |             if isinstance(t, str): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 709 |                 exc_type_name = t | 
 | 710 |             else: exc_type_name = t.__name__ | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 711 |             print('***', exc_type_name + ':', repr(v), file=self.stdout) | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 712 |             raise | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 713 |  | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 714 |     def do_p(self, arg): | 
 | 715 |         try: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 716 |             print(repr(self._getval(arg)), file=self.stdout) | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 717 |         except: | 
 | 718 |             pass | 
 | 719 |  | 
 | 720 |     def do_pp(self, arg): | 
 | 721 |         try: | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 722 |             pprint.pprint(self._getval(arg), self.stdout) | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 723 |         except: | 
 | 724 |             pass | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 725 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 726 |     def do_list(self, arg): | 
 | 727 |         self.lastcmd = 'list' | 
 | 728 |         last = None | 
 | 729 |         if arg: | 
 | 730 |             try: | 
 | 731 |                 x = eval(arg, {}, {}) | 
 | 732 |                 if type(x) == type(()): | 
 | 733 |                     first, last = x | 
 | 734 |                     first = int(first) | 
 | 735 |                     last = int(last) | 
 | 736 |                     if last < first: | 
 | 737 |                         # Assume it's a count | 
 | 738 |                         last = first + last | 
 | 739 |                 else: | 
 | 740 |                     first = max(1, int(x) - 5) | 
 | 741 |             except: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 742 |                 print('*** Error in argument:', repr(arg), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 743 |                 return | 
 | 744 |         elif self.lineno is None: | 
 | 745 |             first = max(1, self.curframe.f_lineno - 5) | 
 | 746 |         else: | 
 | 747 |             first = self.lineno + 1 | 
 | 748 |         if last is None: | 
 | 749 |             last = first + 10 | 
 | 750 |         filename = self.curframe.f_code.co_filename | 
 | 751 |         breaklist = self.get_file_breaks(filename) | 
 | 752 |         try: | 
 | 753 |             for lineno in range(first, last+1): | 
 | 754 |                 line = linecache.getline(filename, lineno) | 
 | 755 |                 if not line: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 756 |                     print('[EOF]', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 757 |                     break | 
 | 758 |                 else: | 
| Walter Dörwald | 70a6b49 | 2004-02-12 17:35:32 +0000 | [diff] [blame] | 759 |                     s = repr(lineno).rjust(3) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 760 |                     if len(s) < 4: s = s + ' ' | 
 | 761 |                     if lineno in breaklist: s = s + 'B' | 
 | 762 |                     else: s = s + ' ' | 
 | 763 |                     if lineno == self.curframe.f_lineno: | 
 | 764 |                         s = s + '->' | 
| Guido van Rossum | ceae375 | 2007-02-09 22:16:54 +0000 | [diff] [blame] | 765 |                     print(s + '\t' + line, end='', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 766 |                     self.lineno = lineno | 
 | 767 |         except KeyboardInterrupt: | 
 | 768 |             pass | 
 | 769 |     do_l = do_list | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 770 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 771 |     def do_whatis(self, arg): | 
 | 772 |         try: | 
 | 773 |             value = eval(arg, self.curframe.f_globals, | 
 | 774 |                             self.curframe.f_locals) | 
 | 775 |         except: | 
 | 776 |             t, v = sys.exc_info()[:2] | 
 | 777 |             if type(t) == type(''): | 
 | 778 |                 exc_type_name = t | 
 | 779 |             else: exc_type_name = t.__name__ | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 780 |             print('***', exc_type_name + ':', repr(v), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 781 |             return | 
 | 782 |         code = None | 
 | 783 |         # Is it a function? | 
| Neal Norwitz | 221085d | 2007-02-25 20:55:47 +0000 | [diff] [blame] | 784 |         try: code = value.__code__ | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 785 |         except: pass | 
 | 786 |         if code: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 787 |             print('Function', code.co_name, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 788 |             return | 
 | 789 |         # Is it an instance method? | 
| Neal Norwitz | 221085d | 2007-02-25 20:55:47 +0000 | [diff] [blame] | 790 |         try: code = value.im_func.__code__ | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 791 |         except: pass | 
 | 792 |         if code: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 793 |             print('Method', code.co_name, file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 794 |             return | 
 | 795 |         # None of the above... | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 796 |         print(type(value), file=self.stdout) | 
| Guido van Rossum | 8e2ec56 | 1993-07-29 09:37:38 +0000 | [diff] [blame] | 797 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 798 |     def do_alias(self, arg): | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 799 |         args = arg.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 800 |         if len(args) == 0: | 
 | 801 |             keys = self.aliases.keys() | 
 | 802 |             keys.sort() | 
 | 803 |             for alias in keys: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 804 |                 print("%s = %s" % (alias, self.aliases[alias]), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 805 |             return | 
| Guido van Rossum | 0845459 | 2002-07-12 13:10:53 +0000 | [diff] [blame] | 806 |         if args[0] in self.aliases and len(args) == 1: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 807 |             print("%s = %s" % (args[0], self.aliases[args[0]]), file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 808 |         else: | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 809 |             self.aliases[args[0]] = ' '.join(args[1:]) | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 810 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 811 |     def do_unalias(self, arg): | 
| Eric S. Raymond | 9b93c5f | 2001-02-09 07:58:53 +0000 | [diff] [blame] | 812 |         args = arg.split() | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 813 |         if len(args) == 0: return | 
| Raymond Hettinger | 54f0222 | 2002-06-01 14:18:47 +0000 | [diff] [blame] | 814 |         if args[0] in self.aliases: | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 815 |             del self.aliases[args[0]] | 
| Guido van Rossum | 0023078 | 1993-03-29 11:39:45 +0000 | [diff] [blame] | 816 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 817 |     #list of all the commands making the program resume execution. | 
| Thomas Wouters | 477c8d5 | 2006-05-27 19:21:47 +0000 | [diff] [blame] | 818 |     commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return', | 
 | 819 |                          'do_quit', 'do_jump'] | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 820 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 821 |     # Print a traceback starting at the top stack frame. | 
 | 822 |     # The most recently entered frame is printed last; | 
 | 823 |     # this is different from dbx and gdb, but consistent with | 
 | 824 |     # the Python interpreter's stack trace. | 
 | 825 |     # It is also consistent with the up/down commands (which are | 
 | 826 |     # compatible with dbx and gdb: up moves towards 'main()' | 
 | 827 |     # and down moves towards the most recent stack frame). | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 828 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 829 |     def print_stack_trace(self): | 
 | 830 |         try: | 
 | 831 |             for frame_lineno in self.stack: | 
 | 832 |                 self.print_stack_entry(frame_lineno) | 
 | 833 |         except KeyboardInterrupt: | 
 | 834 |             pass | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 835 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 836 |     def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix): | 
 | 837 |         frame, lineno = frame_lineno | 
 | 838 |         if frame is self.curframe: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 839 |             print('>', end=' ', file=self.stdout) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 840 |         else: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 841 |             print(' ', end=' ', file=self.stdout) | 
 | 842 |         print(self.format_stack_entry(frame_lineno, | 
 | 843 |                                                      prompt_prefix), file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 844 |  | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 845 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 846 |     # Help methods (derived from pdb.doc) | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 847 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 848 |     def help_help(self): | 
 | 849 |         self.help_h() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 850 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 851 |     def help_h(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 852 |         print("""h(elp) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 853 | Without argument, print the list of available commands. | 
 | 854 | With a command name as argument, print help about that command | 
 | 855 | "help pdb" pipes the full documentation file to the $PAGER | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 856 | "help exec" gives help on the ! command""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 857 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 858 |     def help_where(self): | 
 | 859 |         self.help_w() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 860 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 861 |     def help_w(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 862 |         print("""w(here) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 863 | Print a stack trace, with the most recent frame at the bottom. | 
 | 864 | An arrow indicates the "current frame", which determines the | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 865 | context of most commands.  'bt' is an alias for this command.""", file=self.stdout) | 
| Guido van Rossum | 6bd6835 | 2001-01-20 17:57:37 +0000 | [diff] [blame] | 866 |  | 
 | 867 |     help_bt = help_w | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 868 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 869 |     def help_down(self): | 
 | 870 |         self.help_d() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 871 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 872 |     def help_d(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 873 |         print("""d(own) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 874 | Move the current frame one level down in the stack trace | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 875 | (to a newer frame).""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 876 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 877 |     def help_up(self): | 
 | 878 |         self.help_u() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 879 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 880 |     def help_u(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 881 |         print("""u(p) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 882 | Move the current frame one level up in the stack trace | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 883 | (to an older frame).""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 884 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 885 |     def help_break(self): | 
 | 886 |         self.help_b() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 887 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 888 |     def help_b(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 889 |         print("""b(reak) ([file:]lineno | function) [, condition] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 890 | With a line number argument, set a break there in the current | 
 | 891 | file.  With a function name, set a break at first executable line | 
 | 892 | of that function.  Without argument, list all breaks.  If a second | 
 | 893 | argument is present, it is a string specifying an expression | 
 | 894 | which must evaluate to true before the breakpoint is honored. | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 895 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 896 | The line number may be prefixed with a filename and a colon, | 
 | 897 | to specify a breakpoint in another file (probably one that | 
 | 898 | hasn't been loaded yet).  The file is searched for on sys.path; | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 899 | the .py suffix may be omitted.""", file=self.stdout) | 
| Guido van Rossum | b5699c7 | 1998-07-20 23:13:54 +0000 | [diff] [blame] | 900 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 901 |     def help_clear(self): | 
 | 902 |         self.help_cl() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 903 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 904 |     def help_cl(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 905 |         print("cl(ear) filename:lineno", file=self.stdout) | 
 | 906 |         print("""cl(ear) [bpnumber [bpnumber...]] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 907 | With a space separated list of breakpoint numbers, clear | 
 | 908 | those breakpoints.  Without argument, clear all breaks (but | 
 | 909 | first ask confirmation).  With a filename:lineno argument, | 
 | 910 | clear all breaks at that line in that file. | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 911 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 912 | Note that the argument is different from previous versions of | 
 | 913 | the debugger (in python distributions 1.5.1 and before) where | 
 | 914 | a linenumber was used instead of either filename:lineno or | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 915 | breakpoint numbers.""", file=self.stdout) | 
| Guido van Rossum | b5699c7 | 1998-07-20 23:13:54 +0000 | [diff] [blame] | 916 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 917 |     def help_tbreak(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 918 |         print("""tbreak  same arguments as break, but breakpoint is | 
 | 919 | removed when first hit.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 920 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 921 |     def help_enable(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 922 |         print("""enable bpnumber [bpnumber ...] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 923 | Enables the breakpoints given as a space separated list of | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 924 | bp numbers.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 925 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 926 |     def help_disable(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 927 |         print("""disable bpnumber [bpnumber ...] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 928 | Disables the breakpoints given as a space separated list of | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 929 | bp numbers.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 930 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 931 |     def help_ignore(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 932 |         print("""ignore bpnumber count | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 933 | Sets the ignore count for the given breakpoint number.  A breakpoint | 
 | 934 | becomes active when the ignore count is zero.  When non-zero, the | 
 | 935 | count is decremented each time the breakpoint is reached and the | 
 | 936 | breakpoint is not disabled and any associated condition evaluates | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 937 | to true.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 938 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 939 |     def help_condition(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 940 |         print("""condition bpnumber str_condition | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 941 | str_condition is a string specifying an expression which | 
 | 942 | must evaluate to true before the breakpoint is honored. | 
 | 943 | If str_condition is absent, any existing condition is removed; | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 944 | i.e., the breakpoint is made unconditional.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 945 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 946 |     def help_step(self): | 
 | 947 |         self.help_s() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 948 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 949 |     def help_s(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 950 |         print("""s(tep) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 951 | Execute the current line, stop at the first possible occasion | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 952 | (either in a function that is called or in the current function).""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 953 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 954 |     def help_next(self): | 
 | 955 |         self.help_n() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 956 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 957 |     def help_n(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 958 |         print("""n(ext) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 959 | Continue execution until the next line in the current function | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 960 | is reached or it returns.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 961 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 962 |     def help_return(self): | 
 | 963 |         self.help_r() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 964 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 965 |     def help_r(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 966 |         print("""r(eturn) | 
 | 967 | Continue execution until the current function returns.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 968 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 969 |     def help_continue(self): | 
 | 970 |         self.help_c() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 971 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 972 |     def help_cont(self): | 
 | 973 |         self.help_c() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 974 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 975 |     def help_c(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 976 |         print("""c(ont(inue)) | 
 | 977 | Continue execution, only stop when a breakpoint is encountered.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 978 |  | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 979 |     def help_jump(self): | 
 | 980 |         self.help_j() | 
 | 981 |  | 
 | 982 |     def help_j(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 983 |         print("""j(ump) lineno | 
 | 984 | Set the next line that will be executed.""", file=self.stdout) | 
| Michael W. Hudson | cfd3884 | 2002-12-17 16:15:34 +0000 | [diff] [blame] | 985 |  | 
| Guido van Rossum | a12fe4e | 2003-04-09 19:06:21 +0000 | [diff] [blame] | 986 |     def help_debug(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 987 |         print("""debug code | 
| Guido van Rossum | a12fe4e | 2003-04-09 19:06:21 +0000 | [diff] [blame] | 988 | Enter a recursive debugger that steps through the code argument | 
 | 989 | (which is an arbitrary expression or statement to be executed | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 990 | in the current environment).""", file=self.stdout) | 
| Guido van Rossum | a12fe4e | 2003-04-09 19:06:21 +0000 | [diff] [blame] | 991 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 992 |     def help_list(self): | 
 | 993 |         self.help_l() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 994 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 995 |     def help_l(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 996 |         print("""l(ist) [first [,last]] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 997 | List source code for the current file. | 
 | 998 | Without arguments, list 11 lines around the current line | 
 | 999 | or continue the previous listing. | 
 | 1000 | With one argument, list 11 lines starting at that line. | 
 | 1001 | With two arguments, list the given range; | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1002 | if the second argument is less than the first, it is a count.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1003 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1004 |     def help_args(self): | 
 | 1005 |         self.help_a() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1006 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1007 |     def help_a(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1008 |         print("""a(rgs) | 
 | 1009 | Print the arguments of the current function.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1010 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1011 |     def help_p(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1012 |         print("""p expression | 
 | 1013 | Print the value of the expression.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1014 |  | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 1015 |     def help_pp(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1016 |         print("""pp expression | 
 | 1017 | Pretty-print the value of the expression.""", file=self.stdout) | 
| Barry Warsaw | 210bd20 | 2002-11-05 22:40:20 +0000 | [diff] [blame] | 1018 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1019 |     def help_exec(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1020 |         print("""(!) statement | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1021 | Execute the (one-line) statement in the context of | 
 | 1022 | the current stack frame. | 
 | 1023 | The exclamation point can be omitted unless the first word | 
 | 1024 | of the statement resembles a debugger command. | 
 | 1025 | To assign to a global variable you must always prefix the | 
 | 1026 | command with a 'global' command, e.g.: | 
 | 1027 | (Pdb) global list_options; list_options = ['-l'] | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1028 | (Pdb)""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1029 |  | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1030 |     def help_run(self): | 
 | 1031 |         print("""run [args...] | 
 | 1032 | Restart the debugged python program. If a string is supplied, it is | 
 | 1033 | splitted with "shlex" and the result is used as the new sys.argv. | 
 | 1034 | History, breakpoints, actions and debugger options are preserved. | 
 | 1035 | "restart" is an alias for "run".""") | 
 | 1036 |  | 
 | 1037 |     help_restart = help_run | 
 | 1038 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1039 |     def help_quit(self): | 
 | 1040 |         self.help_q() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1041 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1042 |     def help_q(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1043 |         print("""q(uit) or exit - Quit from the debugger. | 
 | 1044 | The program being executed is aborted.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1045 |  | 
| Guido van Rossum | d1c08f3 | 2002-04-15 00:48:24 +0000 | [diff] [blame] | 1046 |     help_exit = help_q | 
 | 1047 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1048 |     def help_whatis(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1049 |         print("""whatis arg | 
 | 1050 | Prints the type of the argument.""", file=self.stdout) | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1051 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1052 |     def help_EOF(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1053 |         print("""EOF | 
 | 1054 | Handles the receipt of EOF as a command.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1055 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1056 |     def help_alias(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1057 |         print("""alias [name [command [parameter parameter ...] ]] | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1058 | Creates an alias called 'name' the executes 'command'.  The command | 
 | 1059 | must *not* be enclosed in quotes.  Replaceable parameters are | 
 | 1060 | indicated by %1, %2, and so on, while %* is replaced by all the | 
 | 1061 | parameters.  If no command is given, the current alias for name | 
 | 1062 | is shown. If no name is given, all aliases are listed. | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1063 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1064 | Aliases may be nested and can contain anything that can be | 
 | 1065 | legally typed at the pdb prompt.  Note!  You *can* override | 
 | 1066 | internal pdb commands with aliases!  Those internal commands | 
 | 1067 | are then hidden until the alias is removed.  Aliasing is recursively | 
 | 1068 | applied to the first word of the command line; all other words | 
 | 1069 | in the line are left alone. | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1070 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1071 | Some useful aliases (especially when placed in the .pdbrc file) are: | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1072 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1073 | #Print instance variables (usage "pi classInst") | 
 | 1074 | alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1075 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1076 | #Print instance variables in self | 
 | 1077 | alias ps pi self | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1078 | """, file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1079 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1080 |     def help_unalias(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1081 |         print("""unalias name | 
 | 1082 | Deletes the specified alias.""", file=self.stdout) | 
| Guido van Rossum | 2424f85 | 1998-09-11 22:50:09 +0000 | [diff] [blame] | 1083 |  | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1084 |     def help_commands(self): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1085 |         print("""commands [bpnumber] | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1086 | (com) ... | 
 | 1087 | (com) end | 
 | 1088 | (Pdb) | 
 | 1089 |  | 
 | 1090 | Specify a list of commands for breakpoint number bpnumber.  The | 
 | 1091 | commands themselves appear on the following lines.  Type a line | 
 | 1092 | containing just 'end' to terminate the commands. | 
 | 1093 |  | 
 | 1094 | To remove all commands from a breakpoint, type commands and | 
 | 1095 | follow it immediately with  end; that is, give no commands. | 
 | 1096 |  | 
 | 1097 | With no bpnumber argument, commands refers to the last | 
 | 1098 | breakpoint set. | 
 | 1099 |  | 
 | 1100 | You can use breakpoint commands to start your program up again. | 
 | 1101 | Simply use the continue command, or step, or any other | 
 | 1102 | command that resumes execution. | 
 | 1103 |  | 
 | 1104 | Specifying any command resuming execution (currently continue, | 
 | 1105 | step, next, return, jump, quit and their abbreviations) terminates | 
 | 1106 | the command list (as if that command was immediately followed by end). | 
 | 1107 | This is because any time you resume execution | 
 | 1108 | (even with a simple next or step), you may encounter | 
 | 1109 | another breakpoint--which could have its own command list, leading to | 
 | 1110 | ambiguities about which list to execute. | 
 | 1111 |  | 
 | 1112 |    If you use the 'silent' command in the command list, the | 
 | 1113 | usual message about stopping at a breakpoint is not printed.  This may | 
 | 1114 | be desirable for breakpoints that are to print a specific message and | 
 | 1115 | then continue.  If none of the other commands print anything, you | 
 | 1116 | see no sign that the breakpoint was reached. | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1117 | """, file=self.stdout) | 
| Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1118 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1119 |     def help_pdb(self): | 
 | 1120 |         help() | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1121 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1122 |     def lookupmodule(self, filename): | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1123 |         """Helper function for break/clear parsing -- may be overridden. | 
 | 1124 |  | 
 | 1125 |         lookupmodule() translates (possibly incomplete) file or module name | 
 | 1126 |         into an absolute file name. | 
 | 1127 |         """ | 
 | 1128 |         if os.path.isabs(filename) and  os.path.exists(filename): | 
| Tim Peters | e718f61 | 2004-10-12 21:51:32 +0000 | [diff] [blame] | 1129 |             return filename | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1130 |         f = os.path.join(sys.path[0], filename) | 
 | 1131 |         if  os.path.exists(f) and self.canonic(f) == self.mainpyfile: | 
 | 1132 |             return f | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1133 |         root, ext = os.path.splitext(filename) | 
 | 1134 |         if ext == '': | 
 | 1135 |             filename = filename + '.py' | 
 | 1136 |         if os.path.isabs(filename): | 
 | 1137 |             return filename | 
 | 1138 |         for dirname in sys.path: | 
 | 1139 |             while os.path.islink(dirname): | 
 | 1140 |                 dirname = os.readlink(dirname) | 
 | 1141 |             fullname = os.path.join(dirname, filename) | 
 | 1142 |             if os.path.exists(fullname): | 
 | 1143 |                 return fullname | 
 | 1144 |         return None | 
| Guido van Rossum | b5699c7 | 1998-07-20 23:13:54 +0000 | [diff] [blame] | 1145 |  | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1146 |     def _runscript(self, filename): | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1147 |         # The script has to run in __main__ namespace (or imports from | 
 | 1148 |         # __main__ will break). | 
 | 1149 |         # | 
 | 1150 |         # So we clear up the __main__ and set several special variables | 
 | 1151 |         # (this gets rid of pdb's globals and cleans old variables on restarts). | 
 | 1152 |         import __main__ | 
 | 1153 |         __main__.__dict__.clear() | 
 | 1154 |         __main__.__dict__.update({"__name__"    : "__main__", | 
 | 1155 |                                   "__file__"    : filename, | 
 | 1156 |                                   "__builtins__": __builtins__, | 
 | 1157 |                                  }) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1158 |  | 
 | 1159 |         # When bdb sets tracing, a number of call and line events happens | 
 | 1160 |         # BEFORE debugger even reaches user's code (and the exact sequence of | 
 | 1161 |         # events depends on python version). So we take special measures to | 
 | 1162 |         # avoid stopping before we reach the main script (see user_line and | 
 | 1163 |         # user_call for details). | 
 | 1164 |         self._wait_for_mainpyfile = 1 | 
 | 1165 |         self.mainpyfile = self.canonic(filename) | 
 | 1166 |         self._user_requested_quit = 0 | 
| Neal Norwitz | 0168802 | 2007-08-12 00:43:29 +0000 | [diff] [blame] | 1167 |         fp = open(filename) | 
 | 1168 |         try: | 
 | 1169 |             script = fp.read() | 
 | 1170 |         finally: | 
 | 1171 |             fp.close() | 
 | 1172 |         statement = 'exec("%s")' % script | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1173 |         self.run(statement) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1174 |  | 
| Guido van Rossum | 3577113 | 1992-09-08 11:59:04 +0000 | [diff] [blame] | 1175 | # Simplified interface | 
 | 1176 |  | 
| Guido van Rossum | 5e38b6f | 1995-02-27 13:13:40 +0000 | [diff] [blame] | 1177 | def run(statement, globals=None, locals=None): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1178 |     Pdb().run(statement, globals, locals) | 
| Guido van Rossum | 5e38b6f | 1995-02-27 13:13:40 +0000 | [diff] [blame] | 1179 |  | 
 | 1180 | def runeval(expression, globals=None, locals=None): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1181 |     return Pdb().runeval(expression, globals, locals) | 
| Guido van Rossum | 6fe08b0 | 1992-01-16 13:50:21 +0000 | [diff] [blame] | 1182 |  | 
 | 1183 | def runctx(statement, globals, locals): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1184 |     # B/W compatibility | 
 | 1185 |     run(statement, globals, locals) | 
| Guido van Rossum | 6fe08b0 | 1992-01-16 13:50:21 +0000 | [diff] [blame] | 1186 |  | 
| Raymond Hettinger | 2ef7e6c | 2004-10-24 00:32:24 +0000 | [diff] [blame] | 1187 | def runcall(*args, **kwds): | 
 | 1188 |     return Pdb().runcall(*args, **kwds) | 
| Guido van Rossum | 4e16098 | 1992-09-02 20:43:20 +0000 | [diff] [blame] | 1189 |  | 
| Guido van Rossum | b6775db | 1994-08-01 11:34:53 +0000 | [diff] [blame] | 1190 | def set_trace(): | 
| Johannes Gijsbers | 84a6c20 | 2004-11-07 11:35:30 +0000 | [diff] [blame] | 1191 |     Pdb().set_trace(sys._getframe().f_back) | 
| Guido van Rossum | 3577113 | 1992-09-08 11:59:04 +0000 | [diff] [blame] | 1192 |  | 
 | 1193 | # Post-Mortem interface | 
 | 1194 |  | 
 | 1195 | def post_mortem(t): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1196 |     p = Pdb() | 
 | 1197 |     p.reset() | 
 | 1198 |     while t.tb_next is not None: | 
 | 1199 |         t = t.tb_next | 
 | 1200 |     p.interaction(t.tb_frame, t) | 
| Guido van Rossum | 3577113 | 1992-09-08 11:59:04 +0000 | [diff] [blame] | 1201 |  | 
 | 1202 | def pm(): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1203 |     post_mortem(sys.last_traceback) | 
| Guido van Rossum | 3577113 | 1992-09-08 11:59:04 +0000 | [diff] [blame] | 1204 |  | 
 | 1205 |  | 
 | 1206 | # Main program for testing | 
 | 1207 |  | 
| Guido van Rossum | 23efba4 | 1992-01-27 16:58:47 +0000 | [diff] [blame] | 1208 | TESTCMD = 'import x; x.main()' | 
| Guido van Rossum | 6fe08b0 | 1992-01-16 13:50:21 +0000 | [diff] [blame] | 1209 |  | 
| Guido van Rossum | 921c824 | 1992-01-10 14:54:42 +0000 | [diff] [blame] | 1210 | def test(): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1211 |     run(TESTCMD) | 
| Guido van Rossum | e61fa0a | 1993-10-22 13:56:35 +0000 | [diff] [blame] | 1212 |  | 
 | 1213 | # print help | 
 | 1214 | def help(): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1215 |     for dirname in sys.path: | 
 | 1216 |         fullname = os.path.join(dirname, 'pdb.doc') | 
 | 1217 |         if os.path.exists(fullname): | 
 | 1218 |             sts = os.system('${PAGER-more} '+fullname) | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1219 |             if sts: print('*** Pager exit status:', sts) | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1220 |             break | 
 | 1221 |     else: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1222 |         print('Sorry, can\'t find the help file "pdb.doc"', end=' ') | 
 | 1223 |         print('along the Python search path') | 
| Guido van Rossum | f17361d | 1996-07-30 16:28:13 +0000 | [diff] [blame] | 1224 |  | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1225 | def main(): | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1226 |     if not sys.argv[1:]: | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1227 |         print("usage: pdb.py scriptfile [arg] ...") | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1228 |         sys.exit(2) | 
| Guido van Rossum | f17361d | 1996-07-30 16:28:13 +0000 | [diff] [blame] | 1229 |  | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1230 |     mainpyfile =  sys.argv[1]     # Get script filename | 
 | 1231 |     if not os.path.exists(mainpyfile): | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1232 |         print('Error:', mainpyfile, 'does not exist') | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1233 |         sys.exit(1) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1234 |  | 
| Tim Peters | 2344fae | 2001-01-15 00:50:52 +0000 | [diff] [blame] | 1235 |     del sys.argv[0]         # Hide "pdb.py" from argument list | 
| Guido van Rossum | ec577d5 | 1996-09-10 17:39:34 +0000 | [diff] [blame] | 1236 |  | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1237 |     # Replace pdb's dir with script's dir in front of module search path. | 
 | 1238 |     sys.path[0] = os.path.dirname(mainpyfile) | 
| Guido van Rossum | f17361d | 1996-07-30 16:28:13 +0000 | [diff] [blame] | 1239 |  | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1240 |     # Note on saving/restoring sys.argv: it's a good idea when sys.argv was | 
 | 1241 |     # modified by the script being debugged. It's a bad idea when it was | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1242 |     # changed by the user from the command line. There is a "restart" command which | 
 | 1243 |     # allows explicit specification of command line arguments. | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1244 |     pdb = Pdb() | 
 | 1245 |     while 1: | 
 | 1246 |         try: | 
 | 1247 |             pdb._runscript(mainpyfile) | 
 | 1248 |             if pdb._user_requested_quit: | 
 | 1249 |                 break | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1250 |             print("The program finished and will be restarted") | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1251 |         except Restart: | 
 | 1252 |             print("Restarting", mainpyfile, "with arguments:") | 
 | 1253 |             print("\t" + " ".join(sys.argv[1:])) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1254 |         except SystemExit: | 
 | 1255 |             # In most cases SystemExit does not warrant a post-mortem session. | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1256 |             print("The program exited via sys.exit(). Exit status: ", end=' ') | 
 | 1257 |             print(sys.exc_info()[1]) | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1258 |         except: | 
 | 1259 |             traceback.print_exc() | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1260 |             print("Uncaught exception. Entering post mortem debugging") | 
 | 1261 |             print("Running 'cont' or 'step' will restart the program") | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1262 |             t = sys.exc_info()[2] | 
 | 1263 |             while t.tb_next is not None: | 
 | 1264 |                 t = t.tb_next | 
 | 1265 |             pdb.interaction(t.tb_frame,t) | 
| Guido van Rossum | be19ed7 | 2007-02-09 05:37:30 +0000 | [diff] [blame] | 1266 |             print("Post mortem debugger finished. The "+mainpyfile+" will be restarted") | 
| Johannes Gijsbers | 25b38c8 | 2004-10-12 18:12:09 +0000 | [diff] [blame] | 1267 |  | 
 | 1268 |  | 
 | 1269 | # When invoked as main program, invoke the debugger on a script | 
| Guido van Rossum | d8faa36 | 2007-04-27 19:54:29 +0000 | [diff] [blame] | 1270 | if __name__ == '__main__': | 
 | 1271 |     import pdb | 
 | 1272 |     pdb.main() |