pdb.py 44.6 KB
Newer Older
1
#! /usr/bin/env python
2

3
"""A Python debugger."""
4

5
# (See pdb.doc for documentation.)
Guido van Rossum's avatar
Guido van Rossum committed
6 7 8

import sys
import linecache
9 10
import cmd
import bdb
11
from repr import Repr
12
import os
13
import re
14
import pprint
15
import traceback
16 17 18 19 20 21


class Restart(Exception):
    """Causes a debugger to be restarted for the debugged python program."""
    pass

22 23 24 25 26 27
# Create a custom safe Repr instance and increase its maxstring.
# The default of 30 truncates error messages too easily.
_repr = Repr()
_repr.maxstring = 200
_saferepr = _repr.repr

28 29 30
__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
           "post_mortem", "help"]

31
def find_function(funcname, filename):
32
    cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters's avatar
Tim Peters committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
    try:
        fp = open(filename)
    except IOError:
        return None
    # consumer of this info expects the first line to be 1
    lineno = 1
    answer = None
    while 1:
        line = fp.readline()
        if line == '':
            break
        if cre.match(line):
            answer = funcname, filename, lineno
            break
        lineno = lineno + 1
    fp.close()
    return answer
Guido van Rossum's avatar
Guido van Rossum committed
50 51


52 53 54 55
# Interaction prompt line will separate file and call info from code
# text using value of line_prefix string.  A newline and arrow may
# be to your liking.  You can set it once pdb is imported using the
# command "pdb.line_prefix = '\n% '".
Tim Peters's avatar
Tim Peters committed
56 57
# line_prefix = ': '    # Use this to get the old situation back
line_prefix = '\n-> '   # Probably a better default
58

59
class Pdb(bdb.Bdb, cmd.Cmd):
Tim Peters's avatar
Tim Peters committed
60

61 62
    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None):
        bdb.Bdb.__init__(self, skip=skip)
63 64 65
        cmd.Cmd.__init__(self, completekey, stdin, stdout)
        if stdout:
            self.use_rawinput = 0
Tim Peters's avatar
Tim Peters committed
66 67
        self.prompt = '(Pdb) '
        self.aliases = {}
68 69
        self.mainpyfile = ''
        self._wait_for_mainpyfile = 0
Tim Peters's avatar
Tim Peters committed
70 71 72 73 74 75 76 77
        # Try to load readline if it exists
        try:
            import readline
        except ImportError:
            pass

        # Read $HOME/.pdbrc and ./.pdbrc
        self.rcLines = []
78
        if 'HOME' in os.environ:
Tim Peters's avatar
Tim Peters committed
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
            envHome = os.environ['HOME']
            try:
                rcFile = open(os.path.join(envHome, ".pdbrc"))
            except IOError:
                pass
            else:
                for line in rcFile.readlines():
                    self.rcLines.append(line)
                rcFile.close()
        try:
            rcFile = open(".pdbrc")
        except IOError:
            pass
        else:
            for line in rcFile.readlines():
                self.rcLines.append(line)
            rcFile.close()

97
        self.commands = {} # associates a command list to breakpoint numbers
98 99 100 101 102 103 104 105
        self.commands_doprompt = {} # for each bp num, tells if the prompt
                                    # must be disp. after execing the cmd list
        self.commands_silent = {} # for each bp num, tells if the stack trace
                                  # must be disp. after execing the cmd list
        self.commands_defining = False # True while in the process of defining
                                       # a command list
        self.commands_bnum = None # The breakpoint number for which we are
                                  # defining a list
106

Tim Peters's avatar
Tim Peters committed
107 108 109 110 111 112 113 114 115 116 117 118 119 120
    def reset(self):
        bdb.Bdb.reset(self)
        self.forget()

    def forget(self):
        self.lineno = None
        self.stack = []
        self.curindex = 0
        self.curframe = None

    def setup(self, f, t):
        self.forget()
        self.stack, self.curindex = self.get_stack(f, t)
        self.curframe = self.stack[self.curindex][0]
121 122 123 124
        # The f_locals dictionary is updated from the actual frame
        # locals whenever the .f_locals accessor is called, so we
        # cache it here to ensure that modifications are not overwritten.
        self.curframe_locals = self.curframe.f_locals
Tim Peters's avatar
Tim Peters committed
125 126 127 128 129 130 131 132 133 134 135
        self.execRcLines()

    # Can be executed earlier than 'setup' if desired
    def execRcLines(self):
        if self.rcLines:
            # Make local copy because of recursion
            rcLines = self.rcLines
            # executed only once
            self.rcLines = []
            for line in rcLines:
                line = line[:-1]
136 137
                if len(line) > 0 and line[0] != '#':
                    self.onecmd(line)
Tim Peters's avatar
Tim Peters committed
138

Tim Peters's avatar
Tim Peters committed
139
    # Override Bdb methods
Michael W. Hudson's avatar
Michael W. Hudson committed
140 141 142 143

    def user_call(self, frame, argument_list):
        """This method is called when there is the remote possibility
        that we ever need to stop in this function."""
144 145
        if self._wait_for_mainpyfile:
            return
Michael W. Hudson's avatar
Michael W. Hudson committed
146
        if self.stop_here(frame):
147
            print >>self.stdout, '--Call--'
Michael W. Hudson's avatar
Michael W. Hudson committed
148
            self.interaction(frame, None)
Tim Peters's avatar
Tim Peters committed
149 150 151

    def user_line(self, frame):
        """This function is called when we stop or break at this line."""
152 153 154 155 156
        if self._wait_for_mainpyfile:
            if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
                or frame.f_lineno<= 0):
                return
            self._wait_for_mainpyfile = 0
157 158
        if self.bp_commands(frame):
            self.interaction(frame, None)
Martin v. Löwis's avatar
Martin v. Löwis committed
159

160
    def bp_commands(self,frame):
Georg Brandl's avatar
Georg Brandl committed
161 162 163 164 165 166 167 168
        """Call every command that was set for the current active breakpoint
        (if there is one).

        Returns True if the normal interaction function must be called,
        False otherwise."""
        # self.currentbp is set in bdb in Bdb.break_here if a breakpoint was hit
        if getattr(self, "currentbp", False) and \
               self.currentbp in self.commands:
169 170 171 172 173 174 175 176 177 178 179 180
            currentbp = self.currentbp
            self.currentbp = 0
            lastcmd_back = self.lastcmd
            self.setup(frame, None)
            for line in self.commands[currentbp]:
                self.onecmd(line)
            self.lastcmd = lastcmd_back
            if not self.commands_silent[currentbp]:
                self.print_stack_entry(self.stack[self.curindex])
            if self.commands_doprompt[currentbp]:
                self.cmdloop()
            self.forget()
Martin v. Löwis's avatar
Martin v. Löwis committed
181
            return
182
        return 1
Tim Peters's avatar
Tim Peters committed
183 184 185 186

    def user_return(self, frame, return_value):
        """This function is called when a return trap is set here."""
        frame.f_locals['__return__'] = return_value
187
        print >>self.stdout, '--Return--'
Tim Peters's avatar
Tim Peters committed
188 189
        self.interaction(frame, None)

190 191
    def user_exception(self, frame, exc_info):
        exc_type, exc_value, exc_traceback = exc_info
Tim Peters's avatar
Tim Peters committed
192 193 194 195 196 197
        """This function is called if an exception occurs,
        but only if we are to stop at or just below this level."""
        frame.f_locals['__exception__'] = exc_type, exc_value
        if type(exc_type) == type(''):
            exc_type_name = exc_type
        else: exc_type_name = exc_type.__name__
198
        print >>self.stdout, exc_type_name + ':', _saferepr(exc_value)
Tim Peters's avatar
Tim Peters committed
199 200 201 202 203 204 205 206 207 208
        self.interaction(frame, exc_traceback)

    # General interaction function

    def interaction(self, frame, traceback):
        self.setup(frame, traceback)
        self.print_stack_entry(self.stack[self.curindex])
        self.cmdloop()
        self.forget()

209 210 211 212
    def displayhook(self, obj):
        """Custom displayhook for the exec in default(), which prevents
        assignment of the _ variable in the builtins.
        """
213 214 215
        # reproduce the behavior of the standard displayhook, not printing None
        if obj is not None:
            print repr(obj)
216

Tim Peters's avatar
Tim Peters committed
217 218
    def default(self, line):
        if line[:1] == '!': line = line[1:]
219
        locals = self.curframe_locals
Tim Peters's avatar
Tim Peters committed
220 221 222
        globals = self.curframe.f_globals
        try:
            code = compile(line + '\n', '<stdin>', 'single')
223 224
            save_stdout = sys.stdout
            save_stdin = sys.stdin
225
            save_displayhook = sys.displayhook
226 227 228
            try:
                sys.stdin = self.stdin
                sys.stdout = self.stdout
229
                sys.displayhook = self.displayhook
230 231 232 233
                exec code in globals, locals
            finally:
                sys.stdout = save_stdout
                sys.stdin = save_stdin
234
                sys.displayhook = save_displayhook
Tim Peters's avatar
Tim Peters committed
235 236 237 238 239
        except:
            t, v = sys.exc_info()[:2]
            if type(t) == type(''):
                exc_type_name = t
            else: exc_type_name = t.__name__
240
            print >>self.stdout, '***', exc_type_name + ':', v
Tim Peters's avatar
Tim Peters committed
241 242 243

    def precmd(self, line):
        """Handle alias expansion and ';;' separator."""
244
        if not line.strip():
Tim Peters's avatar
Tim Peters committed
245
            return line
246
        args = line.split()
247
        while args[0] in self.aliases:
Tim Peters's avatar
Tim Peters committed
248 249 250
            line = self.aliases[args[0]]
            ii = 1
            for tmpArg in args[1:]:
251
                line = line.replace("%" + str(ii),
Tim Peters's avatar
Tim Peters committed
252 253
                                      tmpArg)
                ii = ii + 1
254 255
            line = line.replace("%*", ' '.join(args[1:]))
            args = line.split()
Tim Peters's avatar
Tim Peters committed
256 257 258
        # split into ';;' separated commands
        # unless it's an alias command
        if args[0] != 'alias':
259
            marker = line.find(';;')
Tim Peters's avatar
Tim Peters committed
260 261
            if marker >= 0:
                # queue up everything after marker
262
                next = line[marker+2:].lstrip()
Tim Peters's avatar
Tim Peters committed
263
                self.cmdqueue.append(next)
264
                line = line[:marker].rstrip()
Tim Peters's avatar
Tim Peters committed
265 266
        return line

267 268
    def onecmd(self, line):
        """Interpret the argument as though it had been typed in response
Martin v. Löwis's avatar
Martin v. Löwis committed
269 270
        to the prompt.

271
        Checks whether this line is typed at the normal prompt or in
Tim Peters's avatar
Tim Peters committed
272
        a breakpoint command list definition.
273 274 275 276 277 278
        """
        if not self.commands_defining:
            return cmd.Cmd.onecmd(self, line)
        else:
            return self.handle_command_def(line)

Martin v. Löwis's avatar
Martin v. Löwis committed
279
    def handle_command_def(self,line):
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
        """ Handles one command line during command list definition. """
        cmd, arg, line = self.parseline(line)
        if cmd == 'silent':
            self.commands_silent[self.commands_bnum] = True
            return # continue to handle other cmd def in the cmd list
        elif cmd == 'end':
            self.cmdqueue = []
            return 1 # end of cmd list
        cmdlist = self.commands[self.commands_bnum]
        if (arg):
            cmdlist.append(cmd+' '+arg)
        else:
            cmdlist.append(cmd)
        # Determine if we must stop
        try:
            func = getattr(self, 'do_' + cmd)
        except AttributeError:
            func = self.default
Georg Brandl's avatar
Georg Brandl committed
298 299
        # one of the resuming commands
        if func.func_name in self.commands_resuming:
300 301 302
            self.commands_doprompt[self.commands_bnum] = False
            self.cmdqueue = []
            return 1
Martin v. Löwis's avatar
Martin v. Löwis committed
303
        return
304

Tim Peters's avatar
Tim Peters committed
305 306 307 308 309 310
    # Command definitions, called by cmdloop()
    # The argument is the remaining string on the command line
    # Return true to exit from the command loop

    do_h = cmd.Cmd.do_help

311
    def do_commands(self, arg):
Georg Brandl's avatar
Georg Brandl committed
312 313 314 315
        """Defines a list of commands associated to a breakpoint.

        Those commands will be executed whenever the breakpoint causes
        the program to stop execution."""
316 317 318 319 320 321
        if not arg:
            bnum = len(bdb.Breakpoint.bpbynumber)-1
        else:
            try:
                bnum = int(arg)
            except:
Georg Brandl's avatar
Georg Brandl committed
322 323
                print >>self.stdout, "Usage : commands [bnum]\n        ..." \
                                     "\n        end"
324 325 326 327 328 329 330 331 332 333 334 335
                return
        self.commands_bnum = bnum
        self.commands[bnum] = []
        self.commands_doprompt[bnum] = True
        self.commands_silent[bnum] = False
        prompt_back = self.prompt
        self.prompt = '(com) '
        self.commands_defining = True
        self.cmdloop()
        self.commands_defining = False
        self.prompt = prompt_back

Tim Peters's avatar
Tim Peters committed
336 337 338 339
    def do_break(self, arg, temporary = 0):
        # break [ ([filename:]lineno | function) [, "condition"] ]
        if not arg:
            if self.breaks:  # There's at least one
340
                print >>self.stdout, "Num Type         Disp Enb   Where"
Tim Peters's avatar
Tim Peters committed
341 342
                for bp in bdb.Breakpoint.bpbynumber:
                    if bp:
343
                        bp.bpprint(self.stdout)
Tim Peters's avatar
Tim Peters committed
344 345 346 347 348 349
            return
        # parse arguments; comma has lowest precedence
        # and cannot occur in filename
        filename = None
        lineno = None
        cond = None
350
        comma = arg.find(',')
Tim Peters's avatar
Tim Peters committed
351 352
        if comma > 0:
            # parse stuff after comma: "condition"
353 354
            cond = arg[comma+1:].lstrip()
            arg = arg[:comma].rstrip()
Tim Peters's avatar
Tim Peters committed
355
        # parse stuff before comma: [filename:]lineno | function
356
        colon = arg.rfind(':')
357
        funcname = None
Tim Peters's avatar
Tim Peters committed
358
        if colon >= 0:
359
            filename = arg[:colon].rstrip()
Tim Peters's avatar
Tim Peters committed
360 361
            f = self.lookupmodule(filename)
            if not f:
362 363
                print >>self.stdout, '*** ', repr(filename),
                print >>self.stdout, 'not found from sys.path'
Tim Peters's avatar
Tim Peters committed
364 365 366
                return
            else:
                filename = f
367
            arg = arg[colon+1:].lstrip()
Tim Peters's avatar
Tim Peters committed
368 369 370
            try:
                lineno = int(arg)
            except ValueError, msg:
371
                print >>self.stdout, '*** Bad lineno:', arg
Tim Peters's avatar
Tim Peters committed
372 373 374 375 376 377 378 379 380
                return
        else:
            # no colon; can be lineno or function
            try:
                lineno = int(arg)
            except ValueError:
                try:
                    func = eval(arg,
                                self.curframe.f_globals,
381
                                self.curframe_locals)
Tim Peters's avatar
Tim Peters committed
382 383 384 385 386 387
                except:
                    func = arg
                try:
                    if hasattr(func, 'im_func'):
                        func = func.im_func
                    code = func.func_code
388 389 390
                    #use co_name to identify the bkpt (function names
                    #could be aliased, but co_name is invariant)
                    funcname = code.co_name
Tim Peters's avatar
Tim Peters committed
391 392 393 394 395 396
                    lineno = code.co_firstlineno
                    filename = code.co_filename
                except:
                    # last thing to try
                    (ok, filename, ln) = self.lineinfo(arg)
                    if not ok:
397 398 399 400
                        print >>self.stdout, '*** The specified object',
                        print >>self.stdout, repr(arg),
                        print >>self.stdout, 'is not a function'
                        print >>self.stdout, 'or was not found along sys.path.'
Tim Peters's avatar
Tim Peters committed
401
                        return
402
                    funcname = ok # ok contains a function name
Tim Peters's avatar
Tim Peters committed
403 404 405 406 407 408 409
                    lineno = int(ln)
        if not filename:
            filename = self.defaultFile()
        # Check for reasonable breakpoint
        line = self.checkline(filename, lineno)
        if line:
            # now set the break point
410
            err = self.set_break(filename, line, temporary, cond, funcname)
411
            if err: print >>self.stdout, '***', err
Tim Peters's avatar
Tim Peters committed
412 413
            else:
                bp = self.get_breaks(filename, line)[-1]
414 415 416
                print >>self.stdout, "Breakpoint %d at %s:%d" % (bp.number,
                                                                 bp.file,
                                                                 bp.line)
Tim Peters's avatar
Tim Peters committed
417 418 419 420 421

    # To be overridden in derived debuggers
    def defaultFile(self):
        """Produce a reasonable default."""
        filename = self.curframe.f_code.co_filename
422 423
        if filename == '<string>' and self.mainpyfile:
            filename = self.mainpyfile
Tim Peters's avatar
Tim Peters committed
424 425 426 427 428 429 430 431 432 433
        return filename

    do_b = do_break

    def do_tbreak(self, arg):
        self.do_break(arg, 1)

    def lineinfo(self, identifier):
        failed = (None, None, None)
        # Input is identifier, may be in single quotes
434
        idstring = identifier.split("'")
Tim Peters's avatar
Tim Peters committed
435 436
        if len(idstring) == 1:
            # not in single quotes
437
            id = idstring[0].strip()
Tim Peters's avatar
Tim Peters committed
438 439
        elif len(idstring) == 3:
            # quoted
440
            id = idstring[1].strip()
Tim Peters's avatar
Tim Peters committed
441 442 443
        else:
            return failed
        if id == '': return failed
444
        parts = id.split('.')
Tim Peters's avatar
Tim Peters committed
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
        # Protection for derived debuggers
        if parts[0] == 'self':
            del parts[0]
            if len(parts) == 0:
                return failed
        # Best first guess at file to look at
        fname = self.defaultFile()
        if len(parts) == 1:
            item = parts[0]
        else:
            # More than one part.
            # First is module, second is method/class
            f = self.lookupmodule(parts[0])
            if f:
                fname = f
            item = parts[1]
        answer = find_function(item, fname)
        return answer or failed

    def checkline(self, filename, lineno):
465
        """Check whether specified line seems to be executable.
Tim Peters's avatar
Tim Peters committed
466

467 468 469
        Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
        line or EOF). Warning: testing is not comprehensive.
        """
470
        line = linecache.getline(filename, lineno, self.curframe.f_globals)
Tim Peters's avatar
Tim Peters committed
471
        if not line:
472
            print >>self.stdout, 'End of file'
Tim Peters's avatar
Tim Peters committed
473
            return 0
474
        line = line.strip()
Tim Peters's avatar
Tim Peters committed
475
        # Don't allow setting breakpoint at a blank line
476 477
        if (not line or (line[0] == '#') or
             (line[:3] == '"""') or line[:3] == "'''"):
478
            print >>self.stdout, '*** Blank or comment'
Tim Peters's avatar
Tim Peters committed
479 480 481 482
            return 0
        return lineno

    def do_enable(self, arg):
483
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
484
        for i in args:
485 486 487
            try:
                i = int(i)
            except ValueError:
488
                print >>self.stdout, 'Breakpoint index %r is not a number' % i
489 490 491
                continue

            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
492
                print >>self.stdout, 'No breakpoint numbered', i
493 494 495
                continue

            bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters's avatar
Tim Peters committed
496 497 498 499
            if bp:
                bp.enable()

    def do_disable(self, arg):
500
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
501
        for i in args:
502 503 504
            try:
                i = int(i)
            except ValueError:
505
                print >>self.stdout, 'Breakpoint index %r is not a number' % i
506
                continue
Tim Peters's avatar
Tim Peters committed
507

508
            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
509
                print >>self.stdout, 'No breakpoint numbered', i
510 511 512
                continue

            bp = bdb.Breakpoint.bpbynumber[i]
Tim Peters's avatar
Tim Peters committed
513 514 515 516 517
            if bp:
                bp.disable()

    def do_condition(self, arg):
        # arg is breakpoint number and condition
518
        args = arg.split(' ', 1)
519 520 521 522 523 524
        try:
            bpnum = int(args[0].strip())
        except ValueError:
            # something went wrong
            print >>self.stdout, \
                'Breakpoint index %r is not a number' % args[0]
525
            return
Tim Peters's avatar
Tim Peters committed
526 527 528 529
        try:
            cond = args[1]
        except:
            cond = None
530 531 532 533 534
        try:
            bp = bdb.Breakpoint.bpbynumber[bpnum]
        except IndexError:
            print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
            return
Tim Peters's avatar
Tim Peters committed
535 536 537
        if bp:
            bp.cond = cond
            if not cond:
538 539
                print >>self.stdout, 'Breakpoint', bpnum,
                print >>self.stdout, 'is now unconditional.'
Tim Peters's avatar
Tim Peters committed
540 541 542

    def do_ignore(self,arg):
        """arg is bp number followed by ignore count."""
543
        args = arg.split()
544 545 546 547 548 549
        try:
            bpnum = int(args[0].strip())
        except ValueError:
            # something went wrong
            print >>self.stdout, \
                'Breakpoint index %r is not a number' % args[0]
550
            return
Tim Peters's avatar
Tim Peters committed
551
        try:
552
            count = int(args[1].strip())
Tim Peters's avatar
Tim Peters committed
553 554
        except:
            count = 0
555 556 557 558 559
        try:
            bp = bdb.Breakpoint.bpbynumber[bpnum]
        except IndexError:
            print >>self.stdout, 'Breakpoint index %r is not valid' % args[0]
            return
Tim Peters's avatar
Tim Peters committed
560 561
        if bp:
            bp.ignore = count
562
            if count > 0:
Tim Peters's avatar
Tim Peters committed
563
                reply = 'Will ignore next '
564
                if count > 1:
Tim Peters's avatar
Tim Peters committed
565 566 567
                    reply = reply + '%d crossings' % count
                else:
                    reply = reply + '1 crossing'
568
                print >>self.stdout, reply + ' of breakpoint %d.' % bpnum
Tim Peters's avatar
Tim Peters committed
569
            else:
570 571
                print >>self.stdout, 'Will stop next time breakpoint',
                print >>self.stdout, bpnum, 'is reached.'
Tim Peters's avatar
Tim Peters committed
572 573 574 575 576 577 578 579 580 581 582

    def do_clear(self, arg):
        """Three possibilities, tried in this order:
        clear -> clear all breaks, ask for confirmation
        clear file:lineno -> clear all breaks at file:lineno
        clear bpno bpno ... -> clear breakpoints by number"""
        if not arg:
            try:
                reply = raw_input('Clear all breaks? ')
            except EOFError:
                reply = 'no'
583
            reply = reply.strip().lower()
Tim Peters's avatar
Tim Peters committed
584 585 586 587 588
            if reply in ('y', 'yes'):
                self.clear_all_breaks()
            return
        if ':' in arg:
            # Make sure it works for "clear C:\foo\bar.py:12"
589
            i = arg.rfind(':')
Tim Peters's avatar
Tim Peters committed
590 591 592 593
            filename = arg[:i]
            arg = arg[i+1:]
            try:
                lineno = int(arg)
594
            except ValueError:
Tim Peters's avatar
Tim Peters committed
595 596 597
                err = "Invalid line number (%s)" % arg
            else:
                err = self.clear_break(filename, lineno)
598
            if err: print >>self.stdout, '***', err
Tim Peters's avatar
Tim Peters committed
599
            return
600
        numberlist = arg.split()
Tim Peters's avatar
Tim Peters committed
601
        for i in numberlist:
602 603 604
            try:
                i = int(i)
            except ValueError:
605
                print >>self.stdout, 'Breakpoint index %r is not a number' % i
606 607
                continue

608
            if not (0 <= i < len(bdb.Breakpoint.bpbynumber)):
609
                print >>self.stdout, 'No breakpoint numbered', i
610
                continue
Tim Peters's avatar
Tim Peters committed
611 612
            err = self.clear_bpbynumber(i)
            if err:
613
                print >>self.stdout, '***', err
Tim Peters's avatar
Tim Peters committed
614
            else:
615
                print >>self.stdout, 'Deleted breakpoint', i
Tim Peters's avatar
Tim Peters committed
616 617 618 619 620
    do_cl = do_clear # 'c' is already an abbreviation for 'continue'

    def do_where(self, arg):
        self.print_stack_trace()
    do_w = do_where
621
    do_bt = do_where
Tim Peters's avatar
Tim Peters committed
622 623 624

    def do_up(self, arg):
        if self.curindex == 0:
625
            print >>self.stdout, '*** Oldest frame'
Tim Peters's avatar
Tim Peters committed
626 627 628
        else:
            self.curindex = self.curindex - 1
            self.curframe = self.stack[self.curindex][0]
629
            self.curframe_locals = self.curframe.f_locals
Tim Peters's avatar
Tim Peters committed
630 631 632 633 634 635
            self.print_stack_entry(self.stack[self.curindex])
            self.lineno = None
    do_u = do_up

    def do_down(self, arg):
        if self.curindex + 1 == len(self.stack):
636
            print >>self.stdout, '*** Newest frame'
Tim Peters's avatar
Tim Peters committed
637 638 639
        else:
            self.curindex = self.curindex + 1
            self.curframe = self.stack[self.curindex][0]
640
            self.curframe_locals = self.curframe.f_locals
Tim Peters's avatar
Tim Peters committed
641 642 643 644
            self.print_stack_entry(self.stack[self.curindex])
            self.lineno = None
    do_d = do_down

645 646 647 648 649
    def do_until(self, arg):
        self.set_until(self.curframe)
        return 1
    do_unt = do_until

Tim Peters's avatar
Tim Peters committed
650 651 652 653 654 655 656 657 658 659
    def do_step(self, arg):
        self.set_step()
        return 1
    do_s = do_step

    def do_next(self, arg):
        self.set_next(self.curframe)
        return 1
    do_n = do_next

660
    def do_run(self, arg):
Georg Brandl's avatar
Georg Brandl committed
661 662
        """Restart program by raising an exception to be caught in the main
        debugger loop.  If arguments were given, set them in sys.argv."""
663 664 665 666 667 668 669 670 671
        if arg:
            import shlex
            argv0 = sys.argv[0:1]
            sys.argv = shlex.split(arg)
            sys.argv[:0] = argv0
        raise Restart

    do_restart = do_run

Tim Peters's avatar
Tim Peters committed
672 673 674 675 676 677 678 679 680 681
    def do_return(self, arg):
        self.set_return(self.curframe)
        return 1
    do_r = do_return

    def do_continue(self, arg):
        self.set_continue()
        return 1
    do_c = do_cont = do_continue

682 683
    def do_jump(self, arg):
        if self.curindex + 1 != len(self.stack):
684
            print >>self.stdout, "*** You can only jump within the bottom frame"
685 686 687 688
            return
        try:
            arg = int(arg)
        except ValueError:
689
            print >>self.stdout, "*** The 'jump' command requires a line number."
690 691 692 693 694 695 696 697
        else:
            try:
                # Do the jump, fix up our copy of the stack, and display the
                # new position
                self.curframe.f_lineno = arg
                self.stack[self.curindex] = self.stack[self.curindex][0], arg
                self.print_stack_entry(self.stack[self.curindex])
            except ValueError, e:
698
                print >>self.stdout, '*** Jump failed:', e
699 700
    do_j = do_jump

701 702 703
    def do_debug(self, arg):
        sys.settrace(None)
        globals = self.curframe.f_globals
704
        locals = self.curframe_locals
705
        p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossum's avatar
Guido van Rossum committed
706
        p.prompt = "(%s) " % self.prompt.strip()
707
        print >>self.stdout, "ENTERING RECURSIVE DEBUGGER"
Guido van Rossum's avatar
Guido van Rossum committed
708
        sys.call_tracing(p.run, (arg, globals, locals))
709
        print >>self.stdout, "LEAVING RECURSIVE DEBUGGER"
710 711 712
        sys.settrace(self.trace_dispatch)
        self.lastcmd = p.lastcmd

Tim Peters's avatar
Tim Peters committed
713
    def do_quit(self, arg):
714
        self._user_requested_quit = 1
Tim Peters's avatar
Tim Peters committed
715 716
        self.set_quit()
        return 1
717

Tim Peters's avatar
Tim Peters committed
718
    do_q = do_quit
719
    do_exit = do_quit
Tim Peters's avatar
Tim Peters committed
720

721
    def do_EOF(self, arg):
722
        print >>self.stdout
723
        self._user_requested_quit = 1
724 725 726
        self.set_quit()
        return 1

Tim Peters's avatar
Tim Peters committed
727
    def do_args(self, arg):
728 729
        co = self.curframe.f_code
        dict = self.curframe_locals
Tim Peters's avatar
Tim Peters committed
730 731 732 733 734
        n = co.co_argcount
        if co.co_flags & 4: n = n+1
        if co.co_flags & 8: n = n+1
        for i in range(n):
            name = co.co_varnames[i]
735 736 737
            print >>self.stdout, name, '=',
            if name in dict: print >>self.stdout, dict[name]
            else: print >>self.stdout, "*** undefined ***"
Tim Peters's avatar
Tim Peters committed
738 739 740
    do_a = do_args

    def do_retval(self, arg):
741 742
        if '__return__' in self.curframe_locals:
            print >>self.stdout, self.curframe_locals['__return__']
Tim Peters's avatar
Tim Peters committed
743
        else:
744
            print >>self.stdout, '*** Not yet returned!'
Tim Peters's avatar
Tim Peters committed
745 746
    do_rv = do_retval

747
    def _getval(self, arg):
Tim Peters's avatar
Tim Peters committed
748
        try:
749
            return eval(arg, self.curframe.f_globals,
750
                        self.curframe_locals)
Tim Peters's avatar
Tim Peters committed
751 752
        except:
            t, v = sys.exc_info()[:2]
753
            if isinstance(t, str):
Tim Peters's avatar
Tim Peters committed
754 755
                exc_type_name = t
            else: exc_type_name = t.__name__
756
            print >>self.stdout, '***', exc_type_name + ':', repr(v)
757 758 759 760
            raise

    def do_p(self, arg):
        try:
761
            print >>self.stdout, repr(self._getval(arg))
762 763
        except:
            pass
Tim Peters's avatar
Tim Peters committed
764

765 766
    def do_pp(self, arg):
        try:
767
            pprint.pprint(self._getval(arg), self.stdout)
768 769
        except:
            pass
Tim Peters's avatar
Tim Peters committed
770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786

    def do_list(self, arg):
        self.lastcmd = 'list'
        last = None
        if arg:
            try:
                x = eval(arg, {}, {})
                if type(x) == type(()):
                    first, last = x
                    first = int(first)
                    last = int(last)
                    if last < first:
                        # Assume it's a count
                        last = first + last
                else:
                    first = max(1, int(x) - 5)
            except:
787
                print >>self.stdout, '*** Error in argument:', repr(arg)
Tim Peters's avatar
Tim Peters committed
788 789 790 791 792 793 794 795 796 797 798
                return
        elif self.lineno is None:
            first = max(1, self.curframe.f_lineno - 5)
        else:
            first = self.lineno + 1
        if last is None:
            last = first + 10
        filename = self.curframe.f_code.co_filename
        breaklist = self.get_file_breaks(filename)
        try:
            for lineno in range(first, last+1):
Georg Brandl's avatar
Georg Brandl committed
799 800
                line = linecache.getline(filename, lineno,
                                         self.curframe.f_globals)
Tim Peters's avatar
Tim Peters committed
801
                if not line:
802
                    print >>self.stdout, '[EOF]'
Tim Peters's avatar
Tim Peters committed
803 804
                    break
                else:
805
                    s = repr(lineno).rjust(3)
Tim Peters's avatar
Tim Peters committed
806 807 808 809 810
                    if len(s) < 4: s = s + ' '
                    if lineno in breaklist: s = s + 'B'
                    else: s = s + ' '
                    if lineno == self.curframe.f_lineno:
                        s = s + '->'
811
                    print >>self.stdout, s + '\t' + line,
Tim Peters's avatar
Tim Peters committed
812 813 814 815 816 817 818 819
                    self.lineno = lineno
        except KeyboardInterrupt:
            pass
    do_l = do_list

    def do_whatis(self, arg):
        try:
            value = eval(arg, self.curframe.f_globals,
820
                            self.curframe_locals)
Tim Peters's avatar
Tim Peters committed
821 822 823 824 825
        except:
            t, v = sys.exc_info()[:2]
            if type(t) == type(''):
                exc_type_name = t
            else: exc_type_name = t.__name__
826
            print >>self.stdout, '***', exc_type_name + ':', repr(v)
Tim Peters's avatar
Tim Peters committed
827 828 829 830 831 832
            return
        code = None
        # Is it a function?
        try: code = value.func_code
        except: pass
        if code:
833
            print >>self.stdout, 'Function', code.co_name
Tim Peters's avatar
Tim Peters committed
834 835 836 837 838
            return
        # Is it an instance method?
        try: code = value.im_func.func_code
        except: pass
        if code:
839
            print >>self.stdout, 'Method', code.co_name
Tim Peters's avatar
Tim Peters committed
840 841
            return
        # None of the above...
842
        print >>self.stdout, type(value)
Tim Peters's avatar
Tim Peters committed
843 844

    def do_alias(self, arg):
845
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
846 847 848 849
        if len(args) == 0:
            keys = self.aliases.keys()
            keys.sort()
            for alias in keys:
850
                print >>self.stdout, "%s = %s" % (alias, self.aliases[alias])
Tim Peters's avatar
Tim Peters committed
851
            return
852
        if args[0] in self.aliases and len(args) == 1:
853
            print >>self.stdout, "%s = %s" % (args[0], self.aliases[args[0]])
Tim Peters's avatar
Tim Peters committed
854
        else:
855
            self.aliases[args[0]] = ' '.join(args[1:])
Tim Peters's avatar
Tim Peters committed
856 857

    def do_unalias(self, arg):
858
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
859
        if len(args) == 0: return
860
        if args[0] in self.aliases:
Tim Peters's avatar
Tim Peters committed
861 862
            del self.aliases[args[0]]

863
    #list of all the commands making the program resume execution.
864 865
    commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
                         'do_quit', 'do_jump']
866

Tim Peters's avatar
Tim Peters committed
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884
    # Print a traceback starting at the top stack frame.
    # The most recently entered frame is printed last;
    # this is different from dbx and gdb, but consistent with
    # the Python interpreter's stack trace.
    # It is also consistent with the up/down commands (which are
    # compatible with dbx and gdb: up moves towards 'main()'
    # and down moves towards the most recent stack frame).

    def print_stack_trace(self):
        try:
            for frame_lineno in self.stack:
                self.print_stack_entry(frame_lineno)
        except KeyboardInterrupt:
            pass

    def print_stack_entry(self, frame_lineno, prompt_prefix=line_prefix):
        frame, lineno = frame_lineno
        if frame is self.curframe:
885
            print >>self.stdout, '>',
Tim Peters's avatar
Tim Peters committed
886
        else:
887 888 889
            print >>self.stdout, ' ',
        print >>self.stdout, self.format_stack_entry(frame_lineno,
                                                     prompt_prefix)
Tim Peters's avatar
Tim Peters committed
890 891 892 893 894 895 896 897


    # Help methods (derived from pdb.doc)

    def help_help(self):
        self.help_h()

    def help_h(self):
898
        print >>self.stdout, """h(elp)
Tim Peters's avatar
Tim Peters committed
899 900 901 902 903 904 905 906 907
Without argument, print the list of available commands.
With a command name as argument, print help about that command
"help pdb" pipes the full documentation file to the $PAGER
"help exec" gives help on the ! command"""

    def help_where(self):
        self.help_w()

    def help_w(self):
908
        print >>self.stdout, """w(here)
Tim Peters's avatar
Tim Peters committed
909 910
Print a stack trace, with the most recent frame at the bottom.
An arrow indicates the "current frame", which determines the
911 912 913
context of most commands.  'bt' is an alias for this command."""

    help_bt = help_w
Tim Peters's avatar
Tim Peters committed
914 915 916 917 918

    def help_down(self):
        self.help_d()

    def help_d(self):
919
        print >>self.stdout, """d(own)
Tim Peters's avatar
Tim Peters committed
920
Move the current frame one level down in the stack trace
921
(to a newer frame)."""
Tim Peters's avatar
Tim Peters committed
922 923 924 925 926

    def help_up(self):
        self.help_u()

    def help_u(self):
927
        print >>self.stdout, """u(p)
Tim Peters's avatar
Tim Peters committed
928
Move the current frame one level up in the stack trace
929
(to an older frame)."""
Tim Peters's avatar
Tim Peters committed
930 931 932 933 934

    def help_break(self):
        self.help_b()

    def help_b(self):
935
        print >>self.stdout, """b(reak) ([file:]lineno | function) [, condition]
Tim Peters's avatar
Tim Peters committed
936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
With a line number argument, set a break there in the current
file.  With a function name, set a break at first executable line
of that function.  Without argument, list all breaks.  If a second
argument is present, it is a string specifying an expression
which must evaluate to true before the breakpoint is honored.

The line number may be prefixed with a filename and a colon,
to specify a breakpoint in another file (probably one that
hasn't been loaded yet).  The file is searched for on sys.path;
the .py suffix may be omitted."""

    def help_clear(self):
        self.help_cl()

    def help_cl(self):
951 952
        print >>self.stdout, "cl(ear) filename:lineno"
        print >>self.stdout, """cl(ear) [bpnumber [bpnumber...]]
Tim Peters's avatar
Tim Peters committed
953 954 955 956 957 958 959 960 961 962 963
With a space separated list of breakpoint numbers, clear
those breakpoints.  Without argument, clear all breaks (but
first ask confirmation).  With a filename:lineno argument,
clear all breaks at that line in that file.

Note that the argument is different from previous versions of
the debugger (in python distributions 1.5.1 and before) where
a linenumber was used instead of either filename:lineno or
breakpoint numbers."""

    def help_tbreak(self):
Georg Brandl's avatar
Georg Brandl committed
964 965
        print >>self.stdout, """tbreak  same arguments as break, but breakpoint
is removed when first hit."""
Tim Peters's avatar
Tim Peters committed
966 967

    def help_enable(self):
968
        print >>self.stdout, """enable bpnumber [bpnumber ...]
Tim Peters's avatar
Tim Peters committed
969 970 971 972
Enables the breakpoints given as a space separated list of
bp numbers."""

    def help_disable(self):
973
        print >>self.stdout, """disable bpnumber [bpnumber ...]
Tim Peters's avatar
Tim Peters committed
974 975 976 977
Disables the breakpoints given as a space separated list of
bp numbers."""

    def help_ignore(self):
978
        print >>self.stdout, """ignore bpnumber count
Tim Peters's avatar
Tim Peters committed
979 980 981 982 983 984 985
Sets the ignore count for the given breakpoint number.  A breakpoint
becomes active when the ignore count is zero.  When non-zero, the
count is decremented each time the breakpoint is reached and the
breakpoint is not disabled and any associated condition evaluates
to true."""

    def help_condition(self):
986
        print >>self.stdout, """condition bpnumber str_condition
Tim Peters's avatar
Tim Peters committed
987 988 989 990 991 992 993 994 995
str_condition is a string specifying an expression which
must evaluate to true before the breakpoint is honored.
If str_condition is absent, any existing condition is removed;
i.e., the breakpoint is made unconditional."""

    def help_step(self):
        self.help_s()

    def help_s(self):
996
        print >>self.stdout, """s(tep)
Tim Peters's avatar
Tim Peters committed
997 998 999
Execute the current line, stop at the first possible occasion
(either in a function that is called or in the current function)."""

1000 1001 1002 1003 1004 1005 1006 1007
    def help_until(self):
        self.help_unt()

    def help_unt(self):
        print """unt(il)
Continue execution until the line with a number greater than the current
one is reached or until the current frame returns"""

Tim Peters's avatar
Tim Peters committed
1008 1009 1010 1011
    def help_next(self):
        self.help_n()

    def help_n(self):
1012
        print >>self.stdout, """n(ext)
Tim Peters's avatar
Tim Peters committed
1013 1014 1015 1016 1017 1018 1019
Continue execution until the next line in the current function
is reached or it returns."""

    def help_return(self):
        self.help_r()

    def help_r(self):
1020
        print >>self.stdout, """r(eturn)
Tim Peters's avatar
Tim Peters committed
1021 1022 1023 1024 1025 1026 1027 1028 1029
Continue execution until the current function returns."""

    def help_continue(self):
        self.help_c()

    def help_cont(self):
        self.help_c()

    def help_c(self):
1030
        print >>self.stdout, """c(ont(inue))
Tim Peters's avatar
Tim Peters committed
1031 1032
Continue execution, only stop when a breakpoint is encountered."""

1033 1034 1035 1036
    def help_jump(self):
        self.help_j()

    def help_j(self):
1037
        print >>self.stdout, """j(ump) lineno
1038 1039
Set the next line that will be executed."""

1040
    def help_debug(self):
1041
        print >>self.stdout, """debug code
1042 1043 1044 1045
Enter a recursive debugger that steps through the code argument
(which is an arbitrary expression or statement to be executed
in the current environment)."""

Tim Peters's avatar
Tim Peters committed
1046 1047 1048 1049
    def help_list(self):
        self.help_l()

    def help_l(self):
1050
        print >>self.stdout, """l(ist) [first [,last]]
Tim Peters's avatar
Tim Peters committed
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
List source code for the current file.
Without arguments, list 11 lines around the current line
or continue the previous listing.
With one argument, list 11 lines starting at that line.
With two arguments, list the given range;
if the second argument is less than the first, it is a count."""

    def help_args(self):
        self.help_a()

    def help_a(self):
1062
        print >>self.stdout, """a(rgs)
Tim Peters's avatar
Tim Peters committed
1063 1064 1065
Print the arguments of the current function."""

    def help_p(self):
1066
        print >>self.stdout, """p expression
Tim Peters's avatar
Tim Peters committed
1067 1068
Print the value of the expression."""

1069
    def help_pp(self):
1070
        print >>self.stdout, """pp expression
1071 1072
Pretty-print the value of the expression."""

Tim Peters's avatar
Tim Peters committed
1073
    def help_exec(self):
1074
        print >>self.stdout, """(!) statement
Tim Peters's avatar
Tim Peters committed
1075 1076 1077 1078 1079 1080 1081 1082 1083
Execute the (one-line) statement in the context of
the current stack frame.
The exclamation point can be omitted unless the first word
of the statement resembles a debugger command.
To assign to a global variable you must always prefix the
command with a 'global' command, e.g.:
(Pdb) global list_options; list_options = ['-l']
(Pdb)"""

1084 1085 1086 1087 1088 1089 1090 1091 1092
    def help_run(self):
        print """run [args...]
Restart the debugged python program. If a string is supplied, it is
splitted with "shlex" and the result is used as the new sys.argv.
History, breakpoints, actions and debugger options are preserved.
"restart" is an alias for "run"."""

    help_restart = help_run

Tim Peters's avatar
Tim Peters committed
1093 1094 1095 1096
    def help_quit(self):
        self.help_q()

    def help_q(self):
1097
        print >>self.stdout, """q(uit) or exit - Quit from the debugger.
Tim Peters's avatar
Tim Peters committed
1098 1099
The program being executed is aborted."""

1100 1101
    help_exit = help_q

Tim Peters's avatar
Tim Peters committed
1102
    def help_whatis(self):
1103
        print >>self.stdout, """whatis arg
Tim Peters's avatar
Tim Peters committed
1104 1105 1106
Prints the type of the argument."""

    def help_EOF(self):
1107
        print >>self.stdout, """EOF
Tim Peters's avatar
Tim Peters committed
1108 1109 1110
Handles the receipt of EOF as a command."""

    def help_alias(self):
Georg Brandl's avatar
Georg Brandl committed
1111
        print >>self.stdout, """alias [name [command [parameter parameter ...]]]
Tim Peters's avatar
Tim Peters committed
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134
Creates an alias called 'name' the executes 'command'.  The command
must *not* be enclosed in quotes.  Replaceable parameters are
indicated by %1, %2, and so on, while %* is replaced by all the
parameters.  If no command is given, the current alias for name
is shown. If no name is given, all aliases are listed.

Aliases may be nested and can contain anything that can be
legally typed at the pdb prompt.  Note!  You *can* override
internal pdb commands with aliases!  Those internal commands
are then hidden until the alias is removed.  Aliasing is recursively
applied to the first word of the command line; all other words
in the line are left alone.

Some useful aliases (especially when placed in the .pdbrc file) are:

#Print instance variables (usage "pi classInst")
alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k]

#Print instance variables in self
alias ps pi self
"""

    def help_unalias(self):
1135
        print >>self.stdout, """unalias name
Tim Peters's avatar
Tim Peters committed
1136 1137
Deletes the specified alias."""

1138
    def help_commands(self):
1139
        print >>self.stdout, """commands [bpnumber]
1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161
(com) ...
(com) end
(Pdb)

Specify a list of commands for breakpoint number bpnumber.  The
commands themselves appear on the following lines.  Type a line
containing just 'end' to terminate the commands.

To remove all commands from a breakpoint, type commands and
follow it immediately with  end; that is, give no commands.

With no bpnumber argument, commands refers to the last
breakpoint set.

You can use breakpoint commands to start your program up again.
Simply use the continue command, or step, or any other
command that resumes execution.

Specifying any command resuming execution (currently continue,
step, next, return, jump, quit and their abbreviations) terminates
the command list (as if that command was immediately followed by end).
This is because any time you resume execution
1162
(even with a simple next or step), you may encounter
1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
another breakpoint--which could have its own command list, leading to
ambiguities about which list to execute.

   If you use the 'silent' command in the command list, the
usual message about stopping at a breakpoint is not printed.  This may
be desirable for breakpoints that are to print a specific message and
then continue.  If none of the other commands print anything, you
see no sign that the breakpoint was reached.
"""

Tim Peters's avatar
Tim Peters committed
1173 1174 1175 1176
    def help_pdb(self):
        help()

    def lookupmodule(self, filename):
1177 1178 1179 1180 1181 1182
        """Helper function for break/clear parsing -- may be overridden.

        lookupmodule() translates (possibly incomplete) file or module name
        into an absolute file name.
        """
        if os.path.isabs(filename) and  os.path.exists(filename):
Tim Peters's avatar
Tim Peters committed
1183
            return filename
1184 1185 1186
        f = os.path.join(sys.path[0], filename)
        if  os.path.exists(f) and self.canonic(f) == self.mainpyfile:
            return f
Tim Peters's avatar
Tim Peters committed
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
        root, ext = os.path.splitext(filename)
        if ext == '':
            filename = filename + '.py'
        if os.path.isabs(filename):
            return filename
        for dirname in sys.path:
            while os.path.islink(dirname):
                dirname = os.readlink(dirname)
            fullname = os.path.join(dirname, filename)
            if os.path.exists(fullname):
                return fullname
        return None
1199

1200
    def _runscript(self, filename):
1201 1202
        # The script has to run in __main__ namespace (or imports from
        # __main__ will break).
1203
        #
1204 1205 1206 1207 1208 1209 1210 1211
        # So we clear up the __main__ and set several special variables
        # (this gets rid of pdb's globals and cleans old variables on restarts).
        import __main__
        __main__.__dict__.clear()
        __main__.__dict__.update({"__name__"    : "__main__",
                                  "__file__"    : filename,
                                  "__builtins__": __builtins__,
                                 })
1212

1213 1214 1215 1216 1217 1218 1219 1220 1221
        # When bdb sets tracing, a number of call and line events happens
        # BEFORE debugger even reaches user's code (and the exact sequence of
        # events depends on python version). So we take special measures to
        # avoid stopping before we reach the main script (see user_line and
        # user_call for details).
        self._wait_for_mainpyfile = 1
        self.mainpyfile = self.canonic(filename)
        self._user_requested_quit = 0
        statement = 'execfile( "%s")' % filename
1222
        self.run(statement)
1223

1224 1225
# Simplified interface

1226
def run(statement, globals=None, locals=None):
Tim Peters's avatar
Tim Peters committed
1227
    Pdb().run(statement, globals, locals)
1228 1229

def runeval(expression, globals=None, locals=None):
Tim Peters's avatar
Tim Peters committed
1230
    return Pdb().runeval(expression, globals, locals)
1231 1232

def runctx(statement, globals, locals):
Tim Peters's avatar
Tim Peters committed
1233 1234
    # B/W compatibility
    run(statement, globals, locals)
1235

1236 1237
def runcall(*args, **kwds):
    return Pdb().runcall(*args, **kwds)
1238

1239
def set_trace():
1240
    Pdb().set_trace(sys._getframe().f_back)
1241 1242 1243

# Post-Mortem interface

1244 1245 1246 1247 1248 1249 1250 1251 1252 1253
def post_mortem(t=None):
    # handling the default
    if t is None:
        # sys.exc_info() returns (type, value, traceback) if an exception is
        # being handled, otherwise it returns None
        t = sys.exc_info()[2]
        if t is None:
            raise ValueError("A valid traceback must be passed if no "
                                               "exception is being handled")

Tim Peters's avatar
Tim Peters committed
1254 1255
    p = Pdb()
    p.reset()
1256
    p.interaction(None, t)
1257 1258

def pm():
Tim Peters's avatar
Tim Peters committed
1259
    post_mortem(sys.last_traceback)
1260 1261 1262 1263


# Main program for testing

1264
TESTCMD = 'import x; x.main()'
1265

Guido van Rossum's avatar
Guido van Rossum committed
1266
def test():
Tim Peters's avatar
Tim Peters committed
1267
    run(TESTCMD)
1268 1269 1270

# print help
def help():
Tim Peters's avatar
Tim Peters committed
1271 1272 1273 1274 1275 1276 1277 1278 1279
    for dirname in sys.path:
        fullname = os.path.join(dirname, 'pdb.doc')
        if os.path.exists(fullname):
            sts = os.system('${PAGER-more} '+fullname)
            if sts: print '*** Pager exit status:', sts
            break
    else:
        print 'Sorry, can\'t find the help file "pdb.doc"',
        print 'along the Python search path'
1280

1281
def main():
1282
    if not sys.argv[1:] or sys.argv[1] in ("--help", "-h"):
Tim Peters's avatar
Tim Peters committed
1283 1284
        print "usage: pdb.py scriptfile [arg] ..."
        sys.exit(2)
1285

1286 1287 1288
    mainpyfile =  sys.argv[1]     # Get script filename
    if not os.path.exists(mainpyfile):
        print 'Error:', mainpyfile, 'does not exist'
Tim Peters's avatar
Tim Peters committed
1289
        sys.exit(1)
1290

Tim Peters's avatar
Tim Peters committed
1291
    del sys.argv[0]         # Hide "pdb.py" from argument list
1292

1293 1294
    # Replace pdb's dir with script's dir in front of module search path.
    sys.path[0] = os.path.dirname(mainpyfile)
1295

1296 1297
    # Note on saving/restoring sys.argv: it's a good idea when sys.argv was
    # modified by the script being debugged. It's a bad idea when it was
Georg Brandl's avatar
Georg Brandl committed
1298 1299
    # changed by the user from the command line. There is a "restart" command
    # which allows explicit specification of command line arguments.
1300 1301 1302 1303 1304 1305
    pdb = Pdb()
    while 1:
        try:
            pdb._runscript(mainpyfile)
            if pdb._user_requested_quit:
                break
Tim Peters's avatar
Tim Peters committed
1306
            print "The program finished and will be restarted"
1307 1308 1309
        except Restart:
            print "Restarting", mainpyfile, "with arguments:"
            print "\t" + " ".join(sys.argv[1:])
1310 1311 1312 1313 1314 1315 1316 1317 1318
        except SystemExit:
            # In most cases SystemExit does not warrant a post-mortem session.
            print "The program exited via sys.exit(). Exit status: ",
            print sys.exc_info()[1]
        except:
            traceback.print_exc()
            print "Uncaught exception. Entering post mortem debugging"
            print "Running 'cont' or 'step' will restart the program"
            t = sys.exc_info()[2]
1319
            pdb.interaction(None, t)
Georg Brandl's avatar
Georg Brandl committed
1320 1321
            print "Post mortem debugger finished. The " + mainpyfile + \
                  " will be restarted"
1322 1323 1324


# When invoked as main program, invoke the debugger on a script
1325 1326 1327
if __name__ == '__main__':
    import pdb
    pdb.main()