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