pdb.py 61 KB
Newer Older
1
#! /usr/bin/env python3
2

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
"""
The Python Debugger Pdb
=======================

To use the debugger in its simplest form:

        >>> import pdb
        >>> pdb.run('<a statement>')

The debugger's prompt is '(Pdb) '.  This will stop in the first
function call in <a statement>.

Alternatively, if a statement terminated with an unhandled exception,
you can use pdb's post-mortem facility to inspect the contents of the
traceback:

        >>> <a statement>
        <exception traceback>
        >>> import pdb
        >>> pdb.pm()

The commands recognized by the debugger are listed in the next
section.  Most can be abbreviated as indicated; e.g., h(elp) means
that 'help' can be typed as 'h' or 'help' (but not as 'he' or 'hel',
nor as 'H' or 'Help' or 'HELP').  Optional arguments are enclosed in
square brackets.  Alternatives in the command syntax are separated
by a vertical bar (|).

A blank line repeats the previous command literally, except for
'list', where it lists the next 11 lines.

Commands that the debugger doesn't recognize are assumed to be Python
statements and are executed in the context of the program being
debugged.  Python statements can also be prefixed with an exclamation
point ('!').  This is a powerful way to inspect the program being
debugged; it is even possible to change variables or call functions.
When an exception occurs in such a statement, the exception name is
printed but the debugger's state is not changed.

The debugger supports aliases, which can save typing.  And aliases can
have parameters (see the alias help entry) which allows one a certain
level of adaptability to the context under examination.

Multiple commands may be entered on a single line, separated by the
pair ';;'.  No intelligence is applied to separating the commands; the
input is split at the first ';;', even if it is in the middle of a
quoted string.

If a file ".pdbrc" exists in your home directory or in the current
directory, it is read in and executed as if it had been typed at the
debugger prompt.  This is particularly useful for aliases.  If both
files exist, the one in the home directory is read first and aliases
55 56
defined there can be overridden by the local file.  This behavior can be
disabled by passing the "readrc=False" argument to the Pdb constructor.
57 58 59 60 61 62 63 64 65 66

Aside from aliases, the debugger is not directly programmable; but it
is implemented as a class from which you can derive your own debugger
class, which you can make as fancy as you like.


Debugger commands
=================

"""
67 68
# NOTE: the actual command documentation is collected from docstrings of the
# commands and is appended to __doc__ after the class has been defined.
Guido van Rossum's avatar
Guido van Rossum committed
69

70 71
import os
import re
Guido van Rossum's avatar
Guido van Rossum committed
72
import sys
73 74
import cmd
import bdb
75
import dis
76
import code
77
import glob
78
import pprint
79
import signal
80
import inspect
81 82
import traceback
import linecache
83 84 85 86 87 88


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

Skip Montanaro's avatar
Skip Montanaro committed
89 90 91
__all__ = ["run", "pm", "Pdb", "runeval", "runctx", "runcall", "set_trace",
           "post_mortem", "help"]

92
def find_function(funcname, filename):
93
    cre = re.compile(r'def\s+%s\s*[(]' % re.escape(funcname))
Tim Peters's avatar
Tim Peters committed
94 95
    try:
        fp = open(filename)
96
    except OSError:
Tim Peters's avatar
Tim Peters committed
97 98
        return None
    # consumer of this info expects the first line to be 1
99 100 101 102 103
    with fp:
        for lineno, line in enumerate(fp, start=1):
            if cre.match(line):
                return funcname, filename, lineno
    return None
Guido van Rossum's avatar
Guido van Rossum committed
104

105 106
def getsourcelines(obj):
    lines, lineno = inspect.findsource(obj)
107
    if inspect.isframe(obj) and obj.f_globals is obj.f_locals:
108
        # must be a module frame: do not try to cut a block out of it
109
        return lines, 1
110
    elif inspect.ismodule(obj):
111
        return lines, 1
112
    return inspect.getblock(lines[lineno:]), lineno+1
Guido van Rossum's avatar
Guido van Rossum committed
113

114 115 116 117 118 119 120 121 122
def lasti2lineno(code, lasti):
    linestarts = list(dis.findlinestarts(code))
    linestarts.reverse()
    for i, lineno in linestarts:
        if lasti >= i:
            return lineno
    return 0


123 124 125 126 127 128
class _rstr(str):
    """String that doesn't quote its repr."""
    def __repr__(self):
        return self


Guido van Rossum's avatar
Guido van Rossum committed
129 130 131 132
# 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
133 134
# line_prefix = ': '    # Use this to get the old situation back
line_prefix = '\n-> '   # Probably a better default
Guido van Rossum's avatar
Guido van Rossum committed
135

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

138 139
    _previous_sigint_handler = None

140
    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
141
                 nosigint=False, readrc=True):
142
        bdb.Bdb.__init__(self, skip=skip)
143 144 145
        cmd.Cmd.__init__(self, completekey, stdin, stdout)
        if stdout:
            self.use_rawinput = 0
Tim Peters's avatar
Tim Peters committed
146 147
        self.prompt = '(Pdb) '
        self.aliases = {}
148
        self.displaying = {}
149
        self.mainpyfile = ''
150
        self._wait_for_mainpyfile = False
151
        self.tb_lineno = {}
Tim Peters's avatar
Tim Peters committed
152 153 154
        # Try to load readline if it exists
        try:
            import readline
155 156
            # remove some common file name delimiters
            readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
157
        except ImportError:
Tim Peters's avatar
Tim Peters committed
158
            pass
159 160
        self.allow_kbdint = False
        self.nosigint = nosigint
Tim Peters's avatar
Tim Peters committed
161 162 163

        # Read $HOME/.pdbrc and ./.pdbrc
        self.rcLines = []
164 165 166 167 168 169 170 171
        if readrc:
            if 'HOME' in os.environ:
                envHome = os.environ['HOME']
                try:
                    with open(os.path.join(envHome, ".pdbrc")) as rcFile:
                        self.rcLines.extend(rcFile)
                except OSError:
                    pass
Tim Peters's avatar
Tim Peters committed
172
            try:
173
                with open(".pdbrc") as rcFile:
174
                    self.rcLines.extend(rcFile)
175
            except OSError:
Tim Peters's avatar
Tim Peters committed
176 177
                pass

178
        self.commands = {} # associates a command list to breakpoint numbers
Benjamin Peterson's avatar
Benjamin Peterson committed
179 180 181 182 183 184 185 186
        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
187

188 189 190 191 192 193 194
    def sigint_handler(self, signum, frame):
        if self.allow_kbdint:
            raise KeyboardInterrupt
        self.message("\nProgram interrupted. (Use 'cont' to resume).")
        self.set_step()
        self.set_trace(frame)

Tim Peters's avatar
Tim Peters committed
195 196 197 198 199 200 201 202 203
    def reset(self):
        bdb.Bdb.reset(self)
        self.forget()

    def forget(self):
        self.lineno = None
        self.stack = []
        self.curindex = 0
        self.curframe = None
204
        self.tb_lineno.clear()
Tim Peters's avatar
Tim Peters committed
205

206
    def setup(self, f, tb):
Tim Peters's avatar
Tim Peters committed
207
        self.forget()
208 209 210 211 212 213 214 215
        self.stack, self.curindex = self.get_stack(f, tb)
        while tb:
            # when setting up post-mortem debugging with a traceback, save all
            # the original line numbers to be displayed along the current line
            # numbers (which can be different, e.g. due to finally clauses)
            lineno = lasti2lineno(tb.tb_frame.f_code, tb.tb_lasti)
            self.tb_lineno[tb.tb_frame] = lineno
            tb = tb.tb_next
Tim Peters's avatar
Tim Peters committed
216
        self.curframe = self.stack[self.curindex][0]
Benjamin Peterson's avatar
Benjamin Peterson committed
217 218 219 220
        # 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
221
        return self.execRcLines()
Tim Peters's avatar
Tim Peters committed
222 223 224

    # Can be executed earlier than 'setup' if desired
    def execRcLines(self):
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
        if not self.rcLines:
            return
        # local copy because of recursion
        rcLines = self.rcLines
        rcLines.reverse()
        # execute every line only once
        self.rcLines = []
        while rcLines:
            line = rcLines.pop().strip()
            if line and line[0] != '#':
                if self.onecmd(line):
                    # if onecmd returns True, the command wants to exit
                    # from the interaction, save leftover rc lines
                    # to execute before next interaction
                    self.rcLines += reversed(rcLines)
                    return True
Tim Peters's avatar
Tim Peters committed
241

Tim Peters's avatar
Tim Peters committed
242
    # Override Bdb methods
Michael W. Hudson's avatar
Michael W. Hudson committed
243 244 245 246

    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."""
247 248
        if self._wait_for_mainpyfile:
            return
Michael W. Hudson's avatar
Michael W. Hudson committed
249
        if self.stop_here(frame):
250
            self.message('--Call--')
Michael W. Hudson's avatar
Michael W. Hudson committed
251
            self.interaction(frame, None)
Tim Peters's avatar
Tim Peters committed
252 253 254

    def user_line(self, frame):
        """This function is called when we stop or break at this line."""
255 256
        if self._wait_for_mainpyfile:
            if (self.mainpyfile != self.canonic(frame.f_code.co_filename)
257
                or frame.f_lineno <= 0):
258
                return
259
            self._wait_for_mainpyfile = False
260 261 262
        if self.bp_commands(frame):
            self.interaction(frame, None)

263
    def bp_commands(self, frame):
264 265 266 267 268 269 270 271
        """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:
272 273 274 275 276 277 278 279 280 281
            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]:
282
                self._cmdloop()
283 284 285
            self.forget()
            return
        return 1
Tim Peters's avatar
Tim Peters committed
286 287 288

    def user_return(self, frame, return_value):
        """This function is called when a return trap is set here."""
289 290
        if self._wait_for_mainpyfile:
            return
Tim Peters's avatar
Tim Peters committed
291
        frame.f_locals['__return__'] = return_value
292
        self.message('--Return--')
Tim Peters's avatar
Tim Peters committed
293 294
        self.interaction(frame, None)

295
    def user_exception(self, frame, exc_info):
Tim Peters's avatar
Tim Peters committed
296 297
        """This function is called if an exception occurs,
        but only if we are to stop at or just below this level."""
298 299
        if self._wait_for_mainpyfile:
            return
300
        exc_type, exc_value, exc_traceback = exc_info
Tim Peters's avatar
Tim Peters committed
301
        frame.f_locals['__exception__'] = exc_type, exc_value
302 303 304

        # An 'Internal StopIteration' exception is an exception debug event
        # issued by the interpreter when handling a subgenerator run with
305
        # 'yield from' or a generator controlled by a for loop. No exception has
306
        # actually occurred in this case. The debugger uses this debug event to
307 308 309 310 311
        # stop when the debuggee is returning from such generators.
        prefix = 'Internal ' if (not exc_traceback
                                    and exc_type is StopIteration) else ''
        self.message('%s%s' % (prefix,
            traceback.format_exception_only(exc_type, exc_value)[-1].strip()))
Tim Peters's avatar
Tim Peters committed
312 313 314
        self.interaction(frame, exc_traceback)

    # General interaction function
315 316 317 318 319 320 321 322 323 324 325
    def _cmdloop(self):
        while True:
            try:
                # keyboard interrupts allow for an easy way to cancel
                # the current command, so allow them during interactive input
                self.allow_kbdint = True
                self.cmdloop()
                self.allow_kbdint = False
                break
            except KeyboardInterrupt:
                self.message('--KeyboardInterrupt--')
Tim Peters's avatar
Tim Peters committed
326

327 328 329 330 331 332 333 334 335 336 337 338 339 340
    # Called before loop, handles display expressions
    def preloop(self):
        displaying = self.displaying.get(self.curframe)
        if displaying:
            for expr, oldvalue in displaying.items():
                newvalue = self._getval_except(expr)
                # check for identity first; this prevents custom __eq__ to
                # be called at every loop, and also prevents instances whose
                # fields are changed to be displayed
                if newvalue is not oldvalue and newvalue != oldvalue:
                    displaying[expr] = newvalue
                    self.message('display %s: %r  [old: %r]' %
                                 (expr, newvalue, oldvalue))

Tim Peters's avatar
Tim Peters committed
341
    def interaction(self, frame, traceback):
342 343 344 345
        # Restore the previous signal handler at the Pdb prompt.
        if Pdb._previous_sigint_handler:
            signal.signal(signal.SIGINT, Pdb._previous_sigint_handler)
            Pdb._previous_sigint_handler = None
346 347 348 349 350
        if self.setup(frame, traceback):
            # no interaction desired at this time (happens if .pdbrc contains
            # a command like "continue")
            self.forget()
            return
Tim Peters's avatar
Tim Peters committed
351
        self.print_stack_entry(self.stack[self.curindex])
352
        self._cmdloop()
Tim Peters's avatar
Tim Peters committed
353 354
        self.forget()

Benjamin Peterson's avatar
Benjamin Peterson committed
355 356 357 358
    def displayhook(self, obj):
        """Custom displayhook for the exec in default(), which prevents
        assignment of the _ variable in the builtins.
        """
359 360
        # reproduce the behavior of the standard displayhook, not printing None
        if obj is not None:
361
            self.message(repr(obj))
Benjamin Peterson's avatar
Benjamin Peterson committed
362

Tim Peters's avatar
Tim Peters committed
363 364
    def default(self, line):
        if line[:1] == '!': line = line[1:]
Benjamin Peterson's avatar
Benjamin Peterson committed
365
        locals = self.curframe_locals
Tim Peters's avatar
Tim Peters committed
366 367 368
        globals = self.curframe.f_globals
        try:
            code = compile(line + '\n', '<stdin>', 'single')
369 370
            save_stdout = sys.stdout
            save_stdin = sys.stdin
Benjamin Peterson's avatar
Benjamin Peterson committed
371
            save_displayhook = sys.displayhook
372 373 374
            try:
                sys.stdin = self.stdin
                sys.stdout = self.stdout
Benjamin Peterson's avatar
Benjamin Peterson committed
375
                sys.displayhook = self.displayhook
376 377 378 379
                exec(code, globals, locals)
            finally:
                sys.stdout = save_stdout
                sys.stdin = save_stdin
Benjamin Peterson's avatar
Benjamin Peterson committed
380
                sys.displayhook = save_displayhook
Tim Peters's avatar
Tim Peters committed
381
        except:
382 383
            exc_info = sys.exc_info()[:2]
            self.error(traceback.format_exception_only(*exc_info)[-1].strip())
Tim Peters's avatar
Tim Peters committed
384 385 386

    def precmd(self, line):
        """Handle alias expansion and ';;' separator."""
387
        if not line.strip():
Tim Peters's avatar
Tim Peters committed
388
            return line
Eric S. Raymond's avatar
Eric S. Raymond committed
389
        args = line.split()
390
        while args[0] in self.aliases:
Tim Peters's avatar
Tim Peters committed
391 392 393
            line = self.aliases[args[0]]
            ii = 1
            for tmpArg in args[1:]:
Eric S. Raymond's avatar
Eric S. Raymond committed
394
                line = line.replace("%" + str(ii),
Tim Peters's avatar
Tim Peters committed
395
                                      tmpArg)
396
                ii += 1
Eric S. Raymond's avatar
Eric S. Raymond committed
397 398
            line = line.replace("%*", ' '.join(args[1:]))
            args = line.split()
Tim Peters's avatar
Tim Peters committed
399 400 401
        # split into ';;' separated commands
        # unless it's an alias command
        if args[0] != 'alias':
Eric S. Raymond's avatar
Eric S. Raymond committed
402
            marker = line.find(';;')
Tim Peters's avatar
Tim Peters committed
403 404
            if marker >= 0:
                # queue up everything after marker
Eric S. Raymond's avatar
Eric S. Raymond committed
405
                next = line[marker+2:].lstrip()
Tim Peters's avatar
Tim Peters committed
406
                self.cmdqueue.append(next)
Eric S. Raymond's avatar
Eric S. Raymond committed
407
                line = line[:marker].rstrip()
Tim Peters's avatar
Tim Peters committed
408 409
        return line

410 411 412 413
    def onecmd(self, line):
        """Interpret the argument as though it had been typed in response
        to the prompt.

414 415
        Checks whether this line is typed at the normal prompt or in
        a breakpoint command list definition.
416 417 418 419 420 421
        """
        if not self.commands_defining:
            return cmd.Cmd.onecmd(self, line)
        else:
            return self.handle_command_def(line)

422
    def handle_command_def(self, line):
423
        """Handles one command line during command list definition."""
424
        cmd, arg, line = self.parseline(line)
425 426
        if not cmd:
            return
427 428 429 430 431 432 433
        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]
434
        if arg:
435 436 437 438 439 440 441 442
            cmdlist.append(cmd+' '+arg)
        else:
            cmdlist.append(cmd)
        # Determine if we must stop
        try:
            func = getattr(self, 'do_' + cmd)
        except AttributeError:
            func = self.default
443 444
        # one of the resuming commands
        if func.__name__ in self.commands_resuming:
445 446 447 448 449
            self.commands_doprompt[self.commands_bnum] = False
            self.cmdqueue = []
            return 1
        return

450 451 452 453 454 455 456 457
    # interface abstraction functions

    def message(self, msg):
        print(msg, file=self.stdout)

    def error(self, msg):
        print('***', msg, file=self.stdout)

458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
    # Generic completion functions.  Individual complete_foo methods can be
    # assigned below to one of these functions.

    def _complete_location(self, text, line, begidx, endidx):
        # Complete a file/module/function location for break/tbreak/clear.
        if line.strip().endswith((':', ',')):
            # Here comes a line number or a condition which we can't complete.
            return []
        # First, try to find matching functions (i.e. expressions).
        try:
            ret = self._complete_expression(text, line, begidx, endidx)
        except Exception:
            ret = []
        # Then, try to complete file names as well.
        globs = glob.glob(text + '*')
        for fn in globs:
            if os.path.isdir(fn):
                ret.append(fn + '/')
            elif os.path.isfile(fn) and fn.lower().endswith(('.py', '.pyw')):
                ret.append(fn + ':')
        return ret

    def _complete_bpnumber(self, text, line, begidx, endidx):
        # Complete a breakpoint number.  (This would be more helpful if we could
        # display additional info along with the completions, such as file/line
        # of the breakpoint.)
        return [str(i) for i, bp in enumerate(bdb.Breakpoint.bpbynumber)
                if bp is not None and str(i).startswith(text)]

    def _complete_expression(self, text, line, begidx, endidx):
        # Complete an arbitrary expression.
        if not self.curframe:
            return []
        # Collect globals and locals.  It is usually not really sensible to also
        # complete builtins, and they clutter the namespace quite heavily, so we
        # leave them out.
494
        ns = {**self.curframe.f_globals, **self.curframe_locals}
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511
        if '.' in text:
            # Walk an attribute chain up to the last part, similar to what
            # rlcompleter does.  This will bail if any of the parts are not
            # simple attribute access, which is what we want.
            dotted = text.split('.')
            try:
                obj = ns[dotted[0]]
                for part in dotted[1:-1]:
                    obj = getattr(obj, part)
            except (KeyError, AttributeError):
                return []
            prefix = '.'.join(dotted[:-1]) + '.'
            return [prefix + n for n in dir(obj) if n.startswith(dotted[-1])]
        else:
            # Complete a simple name.
            return [n for n in ns.keys() if n.startswith(text)]

Tim Peters's avatar
Tim Peters committed
512 513 514 515
    # Command definitions, called by cmdloop()
    # The argument is the remaining string on the command line
    # Return true to exit from the command loop

516
    def do_commands(self, arg):
517 518 519 520 521 522 523 524 525 526 527 528
        """commands [bpnumber]
        (com) ...
        (com) end
        (Pdb)

        Specify a list of commands for breakpoint number bpnumber.
        The commands themselves are entered on the following lines.
        Type a line containing just 'end' to terminate the commands.
        The commands are executed when the breakpoint is hit.

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

530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552
        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 (even with a simple next or step), you may
        encounter 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 will see no sign that the breakpoint was
        reached.
        """
553
        if not arg:
554
            bnum = len(bdb.Breakpoint.bpbynumber) - 1
555 556 557 558
        else:
            try:
                bnum = int(arg)
            except:
559
                self.error("Usage: commands [bnum]\n        ...\n        end")
560 561
                return
        self.commands_bnum = bnum
562 563 564 565 566 567 568
        # Save old definitions for the case of a keyboard interrupt.
        if bnum in self.commands:
            old_command_defs = (self.commands[bnum],
                                self.commands_doprompt[bnum],
                                self.commands_silent[bnum])
        else:
            old_command_defs = None
569 570 571
        self.commands[bnum] = []
        self.commands_doprompt[bnum] = True
        self.commands_silent[bnum] = False
572

573 574 575
        prompt_back = self.prompt
        self.prompt = '(com) '
        self.commands_defining = True
576 577
        try:
            self.cmdloop()
578 579 580 581 582 583 584 585 586 587 588
        except KeyboardInterrupt:
            # Restore old definitions.
            if old_command_defs:
                self.commands[bnum] = old_command_defs[0]
                self.commands_doprompt[bnum] = old_command_defs[1]
                self.commands_silent[bnum] = old_command_defs[2]
            else:
                del self.commands[bnum]
                del self.commands_doprompt[bnum]
                del self.commands_silent[bnum]
            self.error('command definition aborted, old commands restored')
589 590 591
        finally:
            self.commands_defining = False
            self.prompt = prompt_back
592

593 594
    complete_commands = _complete_bpnumber

Tim Peters's avatar
Tim Peters committed
595
    def do_break(self, arg, temporary = 0):
596 597 598 599 600 601 602 603 604 605 606 607 608 609
        """b(reak) [ ([filename:]lineno | function) [, condition] ]
        Without argument, list all breaks.

        With a line number argument, set a break at this line in the
        current file.  With a function name, set a break at the first
        executable line of that function.  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.
        """
Tim Peters's avatar
Tim Peters committed
610 611
        if not arg:
            if self.breaks:  # There's at least one
612
                self.message("Num Type         Disp Enb   Where")
Tim Peters's avatar
Tim Peters committed
613 614
                for bp in bdb.Breakpoint.bpbynumber:
                    if bp:
615
                        self.message(bp.bpformat())
Tim Peters's avatar
Tim Peters committed
616 617 618 619 620 621
            return
        # parse arguments; comma has lowest precedence
        # and cannot occur in filename
        filename = None
        lineno = None
        cond = None
Eric S. Raymond's avatar
Eric S. Raymond committed
622
        comma = arg.find(',')
Tim Peters's avatar
Tim Peters committed
623 624
        if comma > 0:
            # parse stuff after comma: "condition"
Eric S. Raymond's avatar
Eric S. Raymond committed
625 626
            cond = arg[comma+1:].lstrip()
            arg = arg[:comma].rstrip()
Tim Peters's avatar
Tim Peters committed
627
        # parse stuff before comma: [filename:]lineno | function
Eric S. Raymond's avatar
Eric S. Raymond committed
628
        colon = arg.rfind(':')
629
        funcname = None
Tim Peters's avatar
Tim Peters committed
630
        if colon >= 0:
Eric S. Raymond's avatar
Eric S. Raymond committed
631
            filename = arg[:colon].rstrip()
Tim Peters's avatar
Tim Peters committed
632 633
            f = self.lookupmodule(filename)
            if not f:
634
                self.error('%r not found from sys.path' % filename)
Tim Peters's avatar
Tim Peters committed
635 636 637
                return
            else:
                filename = f
Eric S. Raymond's avatar
Eric S. Raymond committed
638
            arg = arg[colon+1:].lstrip()
Tim Peters's avatar
Tim Peters committed
639 640
            try:
                lineno = int(arg)
Georg Brandl's avatar
Georg Brandl committed
641
            except ValueError:
642
                self.error('Bad lineno: %s' % arg)
Tim Peters's avatar
Tim Peters committed
643 644 645 646 647 648 649 650 651
                return
        else:
            # no colon; can be lineno or function
            try:
                lineno = int(arg)
            except ValueError:
                try:
                    func = eval(arg,
                                self.curframe.f_globals,
Benjamin Peterson's avatar
Benjamin Peterson committed
652
                                self.curframe_locals)
Tim Peters's avatar
Tim Peters committed
653 654 655
                except:
                    func = arg
                try:
656 657
                    if hasattr(func, '__func__'):
                        func = func.__func__
658
                    code = func.__code__
659 660 661
                    #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
662 663 664 665 666 667
                    lineno = code.co_firstlineno
                    filename = code.co_filename
                except:
                    # last thing to try
                    (ok, filename, ln) = self.lineinfo(arg)
                    if not ok:
668 669
                        self.error('The specified object %r is not a function '
                                   'or was not found along sys.path.' % arg)
Tim Peters's avatar
Tim Peters committed
670
                        return
671
                    funcname = ok # ok contains a function name
Tim Peters's avatar
Tim Peters committed
672 673 674 675 676 677 678
                    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
679
            err = self.set_break(filename, line, temporary, cond, funcname)
680
            if err:
681
                self.error(err)
Tim Peters's avatar
Tim Peters committed
682 683
            else:
                bp = self.get_breaks(filename, line)[-1]
684 685
                self.message("Breakpoint %d at %s:%d" %
                             (bp.number, bp.file, bp.line))
Tim Peters's avatar
Tim Peters committed
686 687 688 689 690

    # To be overridden in derived debuggers
    def defaultFile(self):
        """Produce a reasonable default."""
        filename = self.curframe.f_code.co_filename
691 692
        if filename == '<string>' and self.mainpyfile:
            filename = self.mainpyfile
Tim Peters's avatar
Tim Peters committed
693 694 695 696
        return filename

    do_b = do_break

697 698 699
    complete_break = _complete_location
    complete_b = _complete_location

Tim Peters's avatar
Tim Peters committed
700
    def do_tbreak(self, arg):
701 702 703 704
        """tbreak [ ([filename:]lineno | function) [, condition] ]
        Same arguments as break, but sets a temporary breakpoint: it
        is automatically deleted when first hit.
        """
Tim Peters's avatar
Tim Peters committed
705 706
        self.do_break(arg, 1)

707 708
    complete_tbreak = _complete_location

Tim Peters's avatar
Tim Peters committed
709 710 711
    def lineinfo(self, identifier):
        failed = (None, None, None)
        # Input is identifier, may be in single quotes
Eric S. Raymond's avatar
Eric S. Raymond committed
712
        idstring = identifier.split("'")
Tim Peters's avatar
Tim Peters committed
713 714
        if len(idstring) == 1:
            # not in single quotes
Eric S. Raymond's avatar
Eric S. Raymond committed
715
            id = idstring[0].strip()
Tim Peters's avatar
Tim Peters committed
716 717
        elif len(idstring) == 3:
            # quoted
Eric S. Raymond's avatar
Eric S. Raymond committed
718
            id = idstring[1].strip()
Tim Peters's avatar
Tim Peters committed
719 720 721
        else:
            return failed
        if id == '': return failed
Eric S. Raymond's avatar
Eric S. Raymond committed
722
        parts = id.split('.')
Tim Peters's avatar
Tim Peters committed
723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
        # 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):
743
        """Check whether specified line seems to be executable.
Tim Peters's avatar
Tim Peters committed
744

745 746 747
        Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
        line or EOF). Warning: testing is not comprehensive.
        """
748 749 750 751
        # this method should be callable before starting debugging, so default
        # to "no globals" if there is no current frame
        globs = self.curframe.f_globals if hasattr(self, 'curframe') else None
        line = linecache.getline(filename, lineno, globs)
Tim Peters's avatar
Tim Peters committed
752
        if not line:
753
            self.message('End of file')
Tim Peters's avatar
Tim Peters committed
754
            return 0
Eric S. Raymond's avatar
Eric S. Raymond committed
755
        line = line.strip()
Tim Peters's avatar
Tim Peters committed
756
        # Don't allow setting breakpoint at a blank line
757 758
        if (not line or (line[0] == '#') or
             (line[:3] == '"""') or line[:3] == "'''"):
759
            self.error('Blank or comment')
Tim Peters's avatar
Tim Peters committed
760 761 762 763
            return 0
        return lineno

    def do_enable(self, arg):
764 765 766 767
        """enable bpnumber [bpnumber ...]
        Enables the breakpoints given as a space separated list of
        breakpoint numbers.
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
768
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
769
        for i in args:
770
            try:
771 772
                bp = self.get_bpbynumber(i)
            except ValueError as err:
773
                self.error(err)
774
            else:
Tim Peters's avatar
Tim Peters committed
775
                bp.enable()
776
                self.message('Enabled %s' % bp)
Tim Peters's avatar
Tim Peters committed
777

778 779
    complete_enable = _complete_bpnumber

Tim Peters's avatar
Tim Peters committed
780
    def do_disable(self, arg):
781 782 783 784 785 786 787
        """disable bpnumber [bpnumber ...]
        Disables the breakpoints given as a space separated list of
        breakpoint numbers.  Disabling a breakpoint means it cannot
        cause the program to stop execution, but unlike clearing a
        breakpoint, it remains in the list of breakpoints and can be
        (re-)enabled.
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
788
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
789
        for i in args:
790
            try:
791 792
                bp = self.get_bpbynumber(i)
            except ValueError as err:
793
                self.error(err)
794
            else:
Tim Peters's avatar
Tim Peters committed
795
                bp.disable()
796
                self.message('Disabled %s' % bp)
Tim Peters's avatar
Tim Peters committed
797

798 799
    complete_disable = _complete_bpnumber

Tim Peters's avatar
Tim Peters committed
800
    def do_condition(self, arg):
801 802 803 804 805 806
        """condition bpnumber [condition]
        Set a new condition for the breakpoint, an expression which
        must evaluate to true before the breakpoint is honored.  If
        condition is absent, any existing condition is removed; i.e.,
        the breakpoint is made unconditional.
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
807
        args = arg.split(' ', 1)
Tim Peters's avatar
Tim Peters committed
808 809
        try:
            cond = args[1]
810
        except IndexError:
Tim Peters's avatar
Tim Peters committed
811
            cond = None
812
        try:
813
            bp = self.get_bpbynumber(args[0].strip())
814 815
        except IndexError:
            self.error('Breakpoint number expected')
816
        except ValueError as err:
817
            self.error(err)
818
        else:
Tim Peters's avatar
Tim Peters committed
819 820
            bp.cond = cond
            if not cond:
821
                self.message('Breakpoint %d is now unconditional.' % bp.number)
822
            else:
823
                self.message('New condition set for breakpoint %d.' % bp.number)
Tim Peters's avatar
Tim Peters committed
824

825 826
    complete_condition = _complete_bpnumber

827
    def do_ignore(self, arg):
828 829 830 831 832 833 834 835
        """ignore bpnumber [count]
        Set the ignore count for the given breakpoint number.  If
        count is omitted, the ignore count is set to 0.  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.
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
836
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
837
        try:
Eric S. Raymond's avatar
Eric S. Raymond committed
838
            count = int(args[1].strip())
Tim Peters's avatar
Tim Peters committed
839 840
        except:
            count = 0
841
        try:
842
            bp = self.get_bpbynumber(args[0].strip())
843 844
        except IndexError:
            self.error('Breakpoint number expected')
845
        except ValueError as err:
846
            self.error(err)
847
        else:
Tim Peters's avatar
Tim Peters committed
848
            bp.ignore = count
849 850
            if count > 0:
                if count > 1:
851
                    countstr = '%d crossings' % count
Tim Peters's avatar
Tim Peters committed
852
                else:
853 854 855
                    countstr = '1 crossing'
                self.message('Will ignore next %s of breakpoint %d.' %
                             (countstr, bp.number))
Tim Peters's avatar
Tim Peters committed
856
            else:
857 858
                self.message('Will stop next time breakpoint %d is reached.'
                             % bp.number)
Tim Peters's avatar
Tim Peters committed
859

860 861
    complete_ignore = _complete_bpnumber

Tim Peters's avatar
Tim Peters committed
862
    def do_clear(self, arg):
863 864 865 866 867 868
        """cl(ear) filename:lineno\ncl(ear) [bpnumber [bpnumber...]]
        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.
        """
Tim Peters's avatar
Tim Peters committed
869 870
        if not arg:
            try:
871
                reply = input('Clear all breaks? ')
Tim Peters's avatar
Tim Peters committed
872 873
            except EOFError:
                reply = 'no'
Eric S. Raymond's avatar
Eric S. Raymond committed
874
            reply = reply.strip().lower()
Tim Peters's avatar
Tim Peters committed
875
            if reply in ('y', 'yes'):
876
                bplist = [bp for bp in bdb.Breakpoint.bpbynumber if bp]
Tim Peters's avatar
Tim Peters committed
877
                self.clear_all_breaks()
878
                for bp in bplist:
879
                    self.message('Deleted %s' % bp)
Tim Peters's avatar
Tim Peters committed
880 881 882
            return
        if ':' in arg:
            # Make sure it works for "clear C:\foo\bar.py:12"
Eric S. Raymond's avatar
Eric S. Raymond committed
883
            i = arg.rfind(':')
Tim Peters's avatar
Tim Peters committed
884 885 886 887
            filename = arg[:i]
            arg = arg[i+1:]
            try:
                lineno = int(arg)
888
            except ValueError:
Tim Peters's avatar
Tim Peters committed
889 890
                err = "Invalid line number (%s)" % arg
            else:
891
                bplist = self.get_breaks(filename, lineno)
Tim Peters's avatar
Tim Peters committed
892
                err = self.clear_break(filename, lineno)
893
            if err:
894
                self.error(err)
895 896
            else:
                for bp in bplist:
897
                    self.message('Deleted %s' % bp)
Tim Peters's avatar
Tim Peters committed
898
            return
Eric S. Raymond's avatar
Eric S. Raymond committed
899
        numberlist = arg.split()
Tim Peters's avatar
Tim Peters committed
900
        for i in numberlist:
901
            try:
902 903
                bp = self.get_bpbynumber(i)
            except ValueError as err:
904
                self.error(err)
Tim Peters's avatar
Tim Peters committed
905
            else:
906
                self.clear_bpbynumber(i)
907
                self.message('Deleted %s' % bp)
Tim Peters's avatar
Tim Peters committed
908 909
    do_cl = do_clear # 'c' is already an abbreviation for 'continue'

910 911 912
    complete_clear = _complete_location
    complete_cl = _complete_location

Tim Peters's avatar
Tim Peters committed
913
    def do_where(self, arg):
914 915 916 917 918
        """w(here)
        Print a stack trace, with the most recent frame at the bottom.
        An arrow indicates the "current frame", which determines the
        context of most commands.  'bt' is an alias for this command.
        """
Tim Peters's avatar
Tim Peters committed
919 920
        self.print_stack_trace()
    do_w = do_where
921
    do_bt = do_where
Tim Peters's avatar
Tim Peters committed
922

923 924 925 926 927 928 929 930
    def _select_frame(self, number):
        assert 0 <= number < len(self.stack)
        self.curindex = number
        self.curframe = self.stack[self.curindex][0]
        self.curframe_locals = self.curframe.f_locals
        self.print_stack_entry(self.stack[self.curindex])
        self.lineno = None

Tim Peters's avatar
Tim Peters committed
931
    def do_up(self, arg):
932 933 934 935
        """u(p) [count]
        Move the current frame count (default one) levels up in the
        stack trace (to an older frame).
        """
Tim Peters's avatar
Tim Peters committed
936
        if self.curindex == 0:
937
            self.error('Oldest frame')
938 939 940 941
            return
        try:
            count = int(arg or 1)
        except ValueError:
942
            self.error('Invalid frame count (%s)' % arg)
943 944 945
            return
        if count < 0:
            newframe = 0
Tim Peters's avatar
Tim Peters committed
946
        else:
947 948
            newframe = max(0, self.curindex - count)
        self._select_frame(newframe)
Tim Peters's avatar
Tim Peters committed
949 950 951
    do_u = do_up

    def do_down(self, arg):
952 953 954 955
        """d(own) [count]
        Move the current frame count (default one) levels down in the
        stack trace (to a newer frame).
        """
Tim Peters's avatar
Tim Peters committed
956
        if self.curindex + 1 == len(self.stack):
957
            self.error('Newest frame')
958 959 960 961
            return
        try:
            count = int(arg or 1)
        except ValueError:
962
            self.error('Invalid frame count (%s)' % arg)
963 964 965
            return
        if count < 0:
            newframe = len(self.stack) - 1
Tim Peters's avatar
Tim Peters committed
966
        else:
967 968
            newframe = min(len(self.stack) - 1, self.curindex + count)
        self._select_frame(newframe)
Tim Peters's avatar
Tim Peters committed
969 970
    do_d = do_down

Alexandre Vassalotti's avatar
Alexandre Vassalotti committed
971
    def do_until(self, arg):
972 973 974 975 976 977 978
        """unt(il) [lineno]
        Without argument, continue execution until the line with a
        number greater than the current one is reached.  With a line
        number, continue execution until a line with a number greater
        or equal to that is reached.  In both cases, also stop when
        the current frame returns.
        """
979 980 981 982
        if arg:
            try:
                lineno = int(arg)
            except ValueError:
983
                self.error('Error in argument: %r' % arg)
984 985
                return
            if lineno <= self.curframe.f_lineno:
986 987
                self.error('"until" line number is smaller than current '
                           'line number')
988 989 990 991
                return
        else:
            lineno = None
        self.set_until(self.curframe, lineno)
Alexandre Vassalotti's avatar
Alexandre Vassalotti committed
992 993 994
        return 1
    do_unt = do_until

Tim Peters's avatar
Tim Peters committed
995
    def do_step(self, arg):
996 997 998 999 1000
        """s(tep)
        Execute the current line, stop at the first possible occasion
        (either in a function that is called or in the current
        function).
        """
Tim Peters's avatar
Tim Peters committed
1001 1002 1003 1004 1005
        self.set_step()
        return 1
    do_s = do_step

    def do_next(self, arg):
1006 1007 1008 1009
        """n(ext)
        Continue execution until the next line in the current function
        is reached or it returns.
        """
Tim Peters's avatar
Tim Peters committed
1010 1011 1012 1013
        self.set_next(self.curframe)
        return 1
    do_n = do_next

1014
    def do_run(self, arg):
1015 1016
        """run [args...]
        Restart the debugged python program. If a string is supplied
1017
        it is split with "shlex", and the result is used as the new
1018 1019 1020
        sys.argv.  History, breakpoints, actions and debugger options
        are preserved.  "restart" is an alias for "run".
        """
1021 1022 1023 1024 1025
        if arg:
            import shlex
            argv0 = sys.argv[0:1]
            sys.argv = shlex.split(arg)
            sys.argv[:0] = argv0
1026
        # this is caught in the main debugger loop
1027 1028 1029 1030
        raise Restart

    do_restart = do_run

Tim Peters's avatar
Tim Peters committed
1031
    def do_return(self, arg):
1032 1033 1034
        """r(eturn)
        Continue execution until the current function returns.
        """
Tim Peters's avatar
Tim Peters committed
1035 1036 1037 1038 1039
        self.set_return(self.curframe)
        return 1
    do_r = do_return

    def do_continue(self, arg):
1040 1041 1042
        """c(ont(inue))
        Continue execution, only stop when a breakpoint is encountered.
        """
1043
        if not self.nosigint:
1044
            try:
1045
                Pdb._previous_sigint_handler = \
1046 1047 1048 1049 1050 1051 1052
                    signal.signal(signal.SIGINT, self.sigint_handler)
            except ValueError:
                # ValueError happens when do_continue() is invoked from
                # a non-main thread in which case we just continue without
                # SIGINT set. Would printing a message here (once) make
                # sense?
                pass
Tim Peters's avatar
Tim Peters committed
1053 1054 1055 1056
        self.set_continue()
        return 1
    do_c = do_cont = do_continue

1057
    def do_jump(self, arg):
1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
        """j(ump) lineno
        Set the next line that will be executed.  Only available in
        the bottom-most frame.  This lets you jump back and execute
        code again, or jump forward to skip code that you don't want
        to run.

        It should be noted that not all jumps are allowed -- for
        instance it is not possible to jump into the middle of a
        for loop or out of a finally clause.
        """
1068
        if self.curindex + 1 != len(self.stack):
1069
            self.error('You can only jump within the bottom frame')
1070 1071 1072 1073
            return
        try:
            arg = int(arg)
        except ValueError:
1074
            self.error("The 'jump' command requires a line number")
1075 1076 1077 1078 1079 1080 1081
        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])
1082
            except ValueError as e:
1083
                self.error('Jump failed: %s' % e)
1084 1085
    do_j = do_jump

1086
    def do_debug(self, arg):
1087 1088 1089 1090 1091
        """debug code
        Enter a recursive debugger that steps through the code
        argument (which is an arbitrary expression or statement to be
        executed in the current environment).
        """
1092 1093
        sys.settrace(None)
        globals = self.curframe.f_globals
Benjamin Peterson's avatar
Benjamin Peterson committed
1094
        locals = self.curframe_locals
1095
        p = Pdb(self.completekey, self.stdin, self.stdout)
Guido van Rossum's avatar
Guido van Rossum committed
1096
        p.prompt = "(%s) " % self.prompt.strip()
1097
        self.message("ENTERING RECURSIVE DEBUGGER")
1098 1099 1100 1101 1102
        try:
            sys.call_tracing(p.run, (arg, globals, locals))
        except Exception:
            exc_info = sys.exc_info()[:2]
            self.error(traceback.format_exception_only(*exc_info)[-1].strip())
1103
        self.message("LEAVING RECURSIVE DEBUGGER")
1104 1105 1106
        sys.settrace(self.trace_dispatch)
        self.lastcmd = p.lastcmd

1107 1108
    complete_debug = _complete_expression

Tim Peters's avatar
Tim Peters committed
1109
    def do_quit(self, arg):
1110 1111 1112
        """q(uit)\nexit
        Quit from the debugger. The program being executed is aborted.
        """
1113
        self._user_requested_quit = True
Tim Peters's avatar
Tim Peters committed
1114 1115
        self.set_quit()
        return 1
1116

Tim Peters's avatar
Tim Peters committed
1117
    do_q = do_quit
1118
    do_exit = do_quit
Tim Peters's avatar
Tim Peters committed
1119

1120
    def do_EOF(self, arg):
1121 1122 1123 1124
        """EOF
        Handles the receipt of EOF as a command.
        """
        self.message('')
1125
        self._user_requested_quit = True
1126 1127 1128
        self.set_quit()
        return 1

Tim Peters's avatar
Tim Peters committed
1129
    def do_args(self, arg):
1130 1131 1132
        """a(rgs)
        Print the argument list of the current function.
        """
Benjamin Peterson's avatar
Benjamin Peterson committed
1133 1134
        co = self.curframe.f_code
        dict = self.curframe_locals
Tim Peters's avatar
Tim Peters committed
1135 1136 1137 1138 1139
        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]
1140 1141 1142 1143
            if name in dict:
                self.message('%s = %r' % (name, dict[name]))
            else:
                self.message('%s = *** undefined ***' % (name,))
Tim Peters's avatar
Tim Peters committed
1144 1145 1146
    do_a = do_args

    def do_retval(self, arg):
1147 1148 1149
        """retval
        Print the return value for the last return of a function.
        """
Benjamin Peterson's avatar
Benjamin Peterson committed
1150
        if '__return__' in self.curframe_locals:
1151
            self.message(repr(self.curframe_locals['__return__']))
Tim Peters's avatar
Tim Peters committed
1152
        else:
1153
            self.error('Not yet returned!')
Tim Peters's avatar
Tim Peters committed
1154 1155
    do_rv = do_retval

1156
    def _getval(self, arg):
Tim Peters's avatar
Tim Peters committed
1157
        try:
Benjamin Peterson's avatar
Benjamin Peterson committed
1158
            return eval(arg, self.curframe.f_globals, self.curframe_locals)
Tim Peters's avatar
Tim Peters committed
1159
        except:
1160 1161
            exc_info = sys.exc_info()[:2]
            self.error(traceback.format_exception_only(*exc_info)[-1].strip())
1162 1163
            raise

1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174
    def _getval_except(self, arg, frame=None):
        try:
            if frame is None:
                return eval(arg, self.curframe.f_globals, self.curframe_locals)
            else:
                return eval(arg, frame.f_globals, frame.f_locals)
        except:
            exc_info = sys.exc_info()[:2]
            err = traceback.format_exception_only(*exc_info)[-1].strip()
            return _rstr('** raised %s **' % err)

1175
    def do_p(self, arg):
1176
        """p expression
1177 1178
        Print the value of the expression.
        """
1179
        try:
1180
            self.message(repr(self._getval(arg)))
1181 1182
        except:
            pass
Tim Peters's avatar
Tim Peters committed
1183

1184
    def do_pp(self, arg):
1185 1186 1187
        """pp expression
        Pretty-print the value of the expression.
        """
1188
        try:
1189
            self.message(pprint.pformat(self._getval(arg)))
1190 1191
        except:
            pass
Tim Peters's avatar
Tim Peters committed
1192

1193 1194 1195 1196
    complete_print = _complete_expression
    complete_p = _complete_expression
    complete_pp = _complete_expression

Tim Peters's avatar
Tim Peters committed
1197
    def do_list(self, arg):
1198
        """l(ist) [first [,last] | .]
1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210

        List source code for the current file.  Without arguments,
        list 11 lines around the current line or continue the previous
        listing.  With . as argument, list 11 lines around the current
        line.  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.

        The current line in the current frame is indicated by "->".
        If an exception is being debugged, the line where the
        exception was originally raised or propagated is indicated by
        ">>", if it differs from the current line.
1211
        """
Tim Peters's avatar
Tim Peters committed
1212 1213
        self.lastcmd = 'list'
        last = None
1214
        if arg and arg != '.':
Tim Peters's avatar
Tim Peters committed
1215
            try:
1216 1217 1218 1219
                if ',' in arg:
                    first, last = arg.split(',')
                    first = int(first.strip())
                    last = int(last.strip())
Tim Peters's avatar
Tim Peters committed
1220
                    if last < first:
1221
                        # assume it's a count
Tim Peters's avatar
Tim Peters committed
1222 1223
                        last = first + last
                else:
1224 1225 1226 1227
                    first = int(arg.strip())
                    first = max(1, first - 5)
            except ValueError:
                self.error('Error in argument: %r' % arg)
Tim Peters's avatar
Tim Peters committed
1228
                return
1229
        elif self.lineno is None or arg == '.':
Tim Peters's avatar
Tim Peters committed
1230 1231 1232 1233 1234 1235 1236 1237
            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:
1238 1239
            lines = linecache.getlines(filename, self.curframe.f_globals)
            self._print_lines(lines[first-1:last], first, breaklist,
1240
                              self.curframe)
1241 1242 1243
            self.lineno = min(last, len(lines))
            if len(lines) < last:
                self.message('[EOF]')
Tim Peters's avatar
Tim Peters committed
1244 1245 1246 1247
        except KeyboardInterrupt:
            pass
    do_l = do_list

1248 1249 1250 1251 1252 1253 1254
    def do_longlist(self, arg):
        """longlist | ll
        List the whole source code for the current function or frame.
        """
        filename = self.curframe.f_code.co_filename
        breaklist = self.get_file_breaks(filename)
        try:
1255
            lines, lineno = getsourcelines(self.curframe)
1256
        except OSError as err:
1257 1258
            self.error(err)
            return
1259
        self._print_lines(lines, lineno, breaklist, self.curframe)
1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
    do_ll = do_longlist

    def do_source(self, arg):
        """source expression
        Try to get source code for the given object and display it.
        """
        try:
            obj = self._getval(arg)
        except:
            return
        try:
1271
            lines, lineno = getsourcelines(obj)
1272
        except (OSError, TypeError) as err:
1273 1274
            self.error(err)
            return
1275
        self._print_lines(lines, lineno)
1276

1277 1278
    complete_source = _complete_expression

1279
    def _print_lines(self, lines, start, breaks=(), frame=None):
1280
        """Print a range of lines."""
1281 1282 1283 1284 1285
        if frame:
            current_lineno = frame.f_lineno
            exc_lineno = self.tb_lineno.get(frame, -1)
        else:
            current_lineno = exc_lineno = -1
1286 1287 1288 1289 1290 1291 1292 1293
        for lineno, line in enumerate(lines, start):
            s = str(lineno).rjust(3)
            if len(s) < 4:
                s += ' '
            if lineno in breaks:
                s += 'B'
            else:
                s += ' '
1294
            if lineno == current_lineno:
1295
                s += '->'
1296
            elif lineno == exc_lineno:
1297 1298 1299
                s += '>>'
            self.message(s + '\t' + line.rstrip())

Tim Peters's avatar
Tim Peters committed
1300
    def do_whatis(self, arg):
1301 1302 1303
        """whatis arg
        Print the type of the argument.
        """
Tim Peters's avatar
Tim Peters committed
1304
        try:
1305
            value = self._getval(arg)
Tim Peters's avatar
Tim Peters committed
1306
        except:
1307
            # _getval() already printed the error
Tim Peters's avatar
Tim Peters committed
1308 1309 1310
            return
        code = None
        # Is it a function?
1311 1312 1313 1314
        try:
            code = value.__code__
        except Exception:
            pass
Tim Peters's avatar
Tim Peters committed
1315
        if code:
1316
            self.message('Function %s' % code.co_name)
Tim Peters's avatar
Tim Peters committed
1317 1318
            return
        # Is it an instance method?
1319 1320 1321 1322
        try:
            code = value.__func__.__code__
        except Exception:
            pass
Tim Peters's avatar
Tim Peters committed
1323
        if code:
1324 1325 1326 1327
            self.message('Method %s' % code.co_name)
            return
        # Is it a class?
        if value.__class__ is type:
1328
            self.message('Class %s.%s' % (value.__module__, value.__qualname__))
Tim Peters's avatar
Tim Peters committed
1329 1330
            return
        # None of the above...
1331
        self.message(type(value))
Tim Peters's avatar
Tim Peters committed
1332

1333 1334
    complete_whatis = _complete_expression

1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351
    def do_display(self, arg):
        """display [expression]

        Display the value of the expression if it changed, each time execution
        stops in the current frame.

        Without expression, list all display expressions for the current frame.
        """
        if not arg:
            self.message('Currently displaying:')
            for item in self.displaying.get(self.curframe, {}).items():
                self.message('%s: %r' % item)
        else:
            val = self._getval_except(arg)
            self.displaying.setdefault(self.curframe, {})[arg] = val
            self.message('display %s: %r' % (arg, val))

1352 1353
    complete_display = _complete_expression

1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
    def do_undisplay(self, arg):
        """undisplay [expression]

        Do not display the expression any more in the current frame.

        Without expression, clear all display expressions for the current frame.
        """
        if arg:
            try:
                del self.displaying.get(self.curframe, {})[arg]
            except KeyError:
                self.error('not displaying %s' % arg)
        else:
            self.displaying.pop(self.curframe, None)

1369 1370 1371 1372
    def complete_undisplay(self, text, line, begidx, endidx):
        return [e for e in self.displaying.get(self.curframe, {})
                if e.startswith(text)]

1373 1374 1375
    def do_interact(self, arg):
        """interact

1376
        Start an interactive interpreter whose global namespace
1377 1378
        contains all the (global and local) names found in the current scope.
        """
1379
        ns = {**self.curframe.f_globals, **self.curframe_locals}
1380 1381
        code.interact("*interactive*", local=ns)

Tim Peters's avatar
Tim Peters committed
1382
    def do_alias(self, arg):
1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401
        """alias [name [command [parameter parameter ...] ]]
        Create an alias called 'name' that executes 'command'.  The
        command must *not* be enclosed in quotes.  Replaceable
        parameters can be 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.

        As an example, here are two useful aliases (especially when
        placed in the .pdbrc file):

        # Print instance variables (usage "pi classInst")
1402
        alias pi for k in %1.__dict__.keys(): print("%1.",k,"=",%1.__dict__[k])
1403 1404 1405
        # Print instance variables in self
        alias ps pi self
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
1406
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
1407
        if len(args) == 0:
1408
            keys = sorted(self.aliases.keys())
Tim Peters's avatar
Tim Peters committed
1409
            for alias in keys:
1410
                self.message("%s = %s" % (alias, self.aliases[alias]))
Tim Peters's avatar
Tim Peters committed
1411
            return
1412
        if args[0] in self.aliases and len(args) == 1:
1413
            self.message("%s = %s" % (args[0], self.aliases[args[0]]))
Tim Peters's avatar
Tim Peters committed
1414
        else:
Eric S. Raymond's avatar
Eric S. Raymond committed
1415
            self.aliases[args[0]] = ' '.join(args[1:])
Tim Peters's avatar
Tim Peters committed
1416 1417

    def do_unalias(self, arg):
1418 1419 1420
        """unalias name
        Delete the specified alias.
        """
Eric S. Raymond's avatar
Eric S. Raymond committed
1421
        args = arg.split()
Tim Peters's avatar
Tim Peters committed
1422
        if len(args) == 0: return
1423
        if args[0] in self.aliases:
Tim Peters's avatar
Tim Peters committed
1424 1425
            del self.aliases[args[0]]

1426 1427 1428
    def complete_unalias(self, text, line, begidx, endidx):
        return [a for a in self.aliases if a.startswith(text)]

1429
    # List of all the commands making the program resume execution.
1430 1431
    commands_resuming = ['do_continue', 'do_step', 'do_next', 'do_return',
                         'do_quit', 'do_jump']
1432

Tim Peters's avatar
Tim Peters committed
1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
    # 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:
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475
            prefix = '> '
        else:
            prefix = '  '
        self.message(prefix +
                     self.format_stack_entry(frame_lineno, prompt_prefix))

    # Provide help

    def do_help(self, arg):
        """h(elp)
        Without argument, print the list of available commands.
        With a command name as argument, print help about that command.
        "help pdb" shows the full pdb documentation.
        "help exec" gives help on the ! command.
        """
        if not arg:
            return cmd.Cmd.do_help(self, arg)
        try:
            try:
                topic = getattr(self, 'help_' + arg)
                return topic()
            except AttributeError:
                command = getattr(self, 'do_' + arg)
        except AttributeError:
            self.error('No help for %r' % arg)
Tim Peters's avatar
Tim Peters committed
1476
        else:
1477 1478 1479 1480
            if sys.flags.optimize >= 2:
                self.error('No help for %r; please do not run Python with -OO '
                           'if you need command help' % arg)
                return
1481 1482 1483
            self.message(command.__doc__.rstrip())

    do_h = do_help
1484

Tim Peters's avatar
Tim Peters committed
1485
    def help_exec(self):
1486 1487 1488 1489 1490 1491 1492 1493 1494
        """(!) statement
        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)
        """
1495
        self.message((self.help_exec.__doc__ or '').strip())
1496

Tim Peters's avatar
Tim Peters committed
1497 1498 1499
    def help_pdb(self):
        help()

1500 1501
    # other helper functions

Tim Peters's avatar
Tim Peters committed
1502
    def lookupmodule(self, filename):
1503 1504 1505 1506 1507 1508
        """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
1509
            return filename
1510 1511 1512
        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
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
        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
1525

1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536
    def _runmodule(self, module_name):
        self._wait_for_mainpyfile = True
        self._user_requested_quit = False
        import runpy
        mod_name, mod_spec, code = runpy._get_module_details(module_name)
        self.mainpyfile = self.canonic(code.co_filename)
        import __main__
        __main__.__dict__.clear()
        __main__.__dict__.update({
            "__name__": "__main__",
            "__file__": self.mainpyfile,
1537
            "__package__": mod_spec.parent,
1538 1539 1540 1541 1542 1543
            "__loader__": mod_spec.loader,
            "__spec__": mod_spec,
            "__builtins__": __builtins__,
        })
        self.run(code)

1544
    def _runscript(self, filename):
1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555
        # The script has to run in __main__ namespace (or imports from
        # __main__ will break).
        #
        # 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__,
                                 })
1556 1557 1558 1559 1560 1561

        # 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).
1562
        self._wait_for_mainpyfile = True
1563
        self.mainpyfile = self.canonic(filename)
1564
        self._user_requested_quit = False
1565 1566 1567
        with open(filename, "rb") as fp:
            statement = "exec(compile(%r, %r, 'exec'))" % \
                        (fp.read(), self.mainpyfile)
1568
        self.run(statement)
1569

1570 1571 1572 1573 1574 1575 1576 1577
# Collect all command help into docstring, if not run with -OO

if __doc__ is not None:
    # unfortunately we can't guess this order from the class definition
    _help_order = [
        'help', 'where', 'down', 'up', 'break', 'tbreak', 'clear', 'disable',
        'enable', 'ignore', 'condition', 'commands', 'step', 'next', 'until',
        'jump', 'return', 'retval', 'run', 'continue', 'list', 'longlist',
1578
        'args', 'p', 'pp', 'whatis', 'source', 'display', 'undisplay',
1579
        'interact', 'alias', 'unalias', 'debug', 'quit',
1580
    ]
1581

1582 1583 1584
    for _command in _help_order:
        __doc__ += getattr(Pdb, 'do_' + _command).__doc__.strip() + '\n\n'
    __doc__ += Pdb.help_exec.__doc__
1585

1586
    del _help_order, _command
1587 1588


1589 1590
# Simplified interface

1591
def run(statement, globals=None, locals=None):
Tim Peters's avatar
Tim Peters committed
1592
    Pdb().run(statement, globals, locals)
1593 1594

def runeval(expression, globals=None, locals=None):
Tim Peters's avatar
Tim Peters committed
1595
    return Pdb().runeval(expression, globals, locals)
1596 1597

def runctx(statement, globals, locals):
Tim Peters's avatar
Tim Peters committed
1598 1599
    # B/W compatibility
    run(statement, globals, locals)
1600

1601 1602
def runcall(*args, **kwds):
    return Pdb().runcall(*args, **kwds)
1603

1604 1605 1606 1607 1608
def set_trace(*, header=None):
    pdb = Pdb()
    if header is not None:
        pdb.message(header)
    pdb.set_trace(sys._getframe().f_back)
1609 1610 1611

# Post-Mortem interface

Christian Heimes's avatar
Christian Heimes committed
1612 1613 1614 1615 1616 1617
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]
1618 1619 1620
    if t is None:
        raise ValueError("A valid traceback must be passed if no "
                         "exception is being handled")
Christian Heimes's avatar
Christian Heimes committed
1621

Tim Peters's avatar
Tim Peters committed
1622 1623
    p = Pdb()
    p.reset()
Benjamin Peterson's avatar
Benjamin Peterson committed
1624
    p.interaction(None, t)
1625 1626

def pm():
Tim Peters's avatar
Tim Peters committed
1627
    post_mortem(sys.last_traceback)
1628 1629 1630 1631


# Main program for testing

1632
TESTCMD = 'import x; x.main()'
1633

Guido van Rossum's avatar
Guido van Rossum committed
1634
def test():
Tim Peters's avatar
Tim Peters committed
1635
    run(TESTCMD)
1636 1637 1638

# print help
def help():
1639 1640
    import pydoc
    pydoc.pager(__doc__)
1641

1642
_usage = """\
1643
usage: pdb.py [-c command] ... [-m module | pyfile] [arg] ...
1644

1645 1646 1647
Debug the Python program given by pyfile. Alternatively,
an executable module or package to debug can be specified using
the -m switch.
1648 1649 1650 1651 1652 1653

Initial commands are read from .pdbrc files in your home directory
and in the current directory, if they exist.  Commands supplied with
-c are executed after commands from .pdbrc files.

To let the script run until an exception occurs, use "-c continue".
1654 1655
To let the script run up to a given line X in the debugged file, use
"-c 'until X'"."""
1656

1657
def main():
1658 1659
    import getopt

1660
    opts, args = getopt.getopt(sys.argv[1:], 'mhc:', ['--help', '--command='])
1661 1662 1663

    if not args:
        print(_usage)
Tim Peters's avatar
Tim Peters committed
1664
        sys.exit(2)
1665

1666
    commands = []
1667
    run_as_module = False
1668 1669 1670 1671 1672 1673
    for opt, optarg in opts:
        if opt in ['-h', '--help']:
            print(_usage)
            sys.exit()
        elif opt in ['-c', '--command']:
            commands.append(optarg)
1674 1675
        elif opt in ['-m']:
            run_as_module = True
1676 1677

    mainpyfile = args[0]     # Get script filename
1678
    if not run_as_module and not os.path.exists(mainpyfile):
1679
        print('Error:', mainpyfile, 'does not exist')
Tim Peters's avatar
Tim Peters committed
1680
        sys.exit(1)
1681

1682
    sys.argv[:] = args      # Hide "pdb.py" and pdb options from argument list
1683

1684
    # Replace pdb's dir with script's dir in front of module search path.
1685 1686
    if not run_as_module:
        sys.path[0] = os.path.dirname(mainpyfile)
1687

1688 1689
    # 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
1690 1691
    # changed by the user from the command line. There is a "restart" command
    # which allows explicit specification of command line arguments.
1692
    pdb = Pdb()
1693
    pdb.rcLines.extend(commands)
1694
    while True:
1695
        try:
1696 1697 1698 1699
            if run_as_module:
                pdb._runmodule(mainpyfile)
            else:
                pdb._runscript(mainpyfile)
1700 1701
            if pdb._user_requested_quit:
                break
1702
            print("The program finished and will be restarted")
1703 1704
        except Restart:
            print("Restarting", mainpyfile, "with arguments:")
1705
            print("\t" + " ".join(args))
1706 1707
        except SystemExit:
            # In most cases SystemExit does not warrant a post-mortem session.
1708
            print("The program exited via sys.exit(). Exit status:", end=' ')
1709
            print(sys.exc_info()[1])
1710 1711 1712
        except SyntaxError:
            traceback.print_exc()
            sys.exit(1)
1713 1714
        except:
            traceback.print_exc()
1715 1716
            print("Uncaught exception. Entering post mortem debugging")
            print("Running 'cont' or 'step' will restart the program")
1717
            t = sys.exc_info()[2]
Benjamin Peterson's avatar
Benjamin Peterson committed
1718
            pdb.interaction(None, t)
1719 1720
            print("Post mortem debugger finished. The " + mainpyfile +
                  " will be restarted")
1721 1722 1723


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