annotate Lib/bdb.py @ 25838:8540887bcec6 2.2

Backport of 2.183: Fix memory leak in add_subclass() found by NealN with valgrind.
author Guido van Rossum <guido@python.org>
date Fri, 18 Oct 2002 13:42:21 +0000
parents 5d095898dae6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
1 """Debugger basics"""
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import sys
11270
2cc6a12cd411 canonic(): This used to be equivalent to str() but that caused too
Barry Warsaw <barry@python.org>
parents: 10036
diff changeset
4 import os
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
5 import types
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
16070
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15860
diff changeset
7 __all__ = ["BdbQuit","Bdb","Breakpoint"]
b5345e99596b added __all__ lists to a number of Python modules
Skip Montanaro <skip@pobox.com>
parents: 15860
diff changeset
8
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 BdbQuit = 'bdb.BdbQuit' # Exception to give up completely
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
9941
06c7fff5274a Change clear_break() to the old signature clear_break(file, line).
Guido van Rossum <guido@python.org>
parents: 9500
diff changeset
12 class Bdb:
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
13
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
14 """Generic Python debugger base class.
9941
06c7fff5274a Change clear_break() to the old signature clear_break(file, line).
Guido van Rossum <guido@python.org>
parents: 9500
diff changeset
15
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
16 This class takes care of details of the trace facility;
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
17 a derived class should implement user interaction.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
18 The standard debugger class (pdb.Pdb) is an example.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
19 """
9941
06c7fff5274a Change clear_break() to the old signature clear_break(file, line).
Guido van Rossum <guido@python.org>
parents: 9500
diff changeset
20
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
21 def __init__(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
22 self.breaks = {}
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
23 self.fncache = {}
11270
2cc6a12cd411 canonic(): This used to be equivalent to str() but that caused too
Barry Warsaw <barry@python.org>
parents: 10036
diff changeset
24
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
25 def canonic(self, filename):
21099
83fc88350f80 canonic(): don't use abspath() for filenames looking like <...>; this
Guido van Rossum <guido@python.org>
parents: 18272
diff changeset
26 if filename == "<" + filename[1:-1] + ">":
83fc88350f80 canonic(): don't use abspath() for filenames looking like <...>; this
Guido van Rossum <guido@python.org>
parents: 18272
diff changeset
27 return filename
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
28 canonic = self.fncache.get(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
29 if not canonic:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
30 canonic = os.path.abspath(filename)
22083
dfeac0334574 backport gvanrossum's checkin of
Michael W. Hudson <mwh@python.net>
parents: 21099
diff changeset
31 canonic = os.path.normcase(canonic)
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
32 self.fncache[filename] = canonic
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
33 return canonic
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
34
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
35 def reset(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
36 import linecache
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
37 linecache.checkcache()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
38 self.botframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
39 self.stopframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
40 self.returnframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
41 self.quitting = 0
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
42
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
43 def trace_dispatch(self, frame, event, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
44 if self.quitting:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
45 return # None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
46 if event == 'line':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
47 return self.dispatch_line(frame)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
48 if event == 'call':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
49 return self.dispatch_call(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
50 if event == 'return':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
51 return self.dispatch_return(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
52 if event == 'exception':
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
53 return self.dispatch_exception(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
54 print 'bdb.Bdb.dispatch: unknown debugging event:', `event`
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
55 return self.trace_dispatch
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
56
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
57 def dispatch_line(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
58 if self.stop_here(frame) or self.break_here(frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
59 self.user_line(frame)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
60 if self.quitting: raise BdbQuit
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
61 return self.trace_dispatch
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
62
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
63 def dispatch_call(self, frame, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
64 # XXX 'arg' is no longer used
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
65 if self.botframe is None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
66 # First call of dispatch since reset()
23558
5d095898dae6 Backport fix by tismer for #210682
Neal Norwitz <nnorwitz@gmail.com>
parents: 22083
diff changeset
67 self.botframe = frame.f_back # (CT) Note that this may also be None!
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
68 return self.trace_dispatch
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
69 if not (self.stop_here(frame) or self.break_anywhere(frame)):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
70 # No need to trace this function
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
71 return # None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
72 self.user_call(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
73 if self.quitting: raise BdbQuit
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
74 return self.trace_dispatch
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
75
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
76 def dispatch_return(self, frame, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
77 if self.stop_here(frame) or frame == self.returnframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
78 self.user_return(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
79 if self.quitting: raise BdbQuit
18272
44122e7b49cf Return self.trace_dispatch from dispatch_return() to enable stepping through generators. (An alternative would be to create a new "yield" debugger event, but that involves many more changes, and might break Bdb subclasses.)
Just van Rossum <just@letterror.com>
parents: 17342
diff changeset
80 return self.trace_dispatch
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
81
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
82 def dispatch_exception(self, frame, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
83 if self.stop_here(frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
84 self.user_exception(frame, arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
85 if self.quitting: raise BdbQuit
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
86 return self.trace_dispatch
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
87
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
88 # Normally derived classes don't override the following
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
89 # methods, but they may if they want to redefine the
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
90 # definition of stopping and breakpoints.
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
91
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
92 def stop_here(self, frame):
23558
5d095898dae6 Backport fix by tismer for #210682
Neal Norwitz <nnorwitz@gmail.com>
parents: 22083
diff changeset
93 # (CT) stopframe may now also be None, see dispatch_call.
5d095898dae6 Backport fix by tismer for #210682
Neal Norwitz <nnorwitz@gmail.com>
parents: 22083
diff changeset
94 # (CT) the former test for None is therefore removed from here.
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
95 if frame is self.stopframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
96 return 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
97 while frame is not None and frame is not self.stopframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
98 if frame is self.botframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
99 return 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
100 frame = frame.f_back
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
101 return 0
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
102
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
103 def break_here(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
104 filename = self.canonic(frame.f_code.co_filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
105 if not self.breaks.has_key(filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
106 return 0
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
107 lineno = frame.f_lineno
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
108 if not lineno in self.breaks[filename]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
109 return 0
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
110 # flag says ok to delete temp. bp
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
111 (bp, flag) = effective(filename, lineno, frame)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
112 if bp:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
113 self.currentbp = bp.number
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
114 if (flag and bp.temporary):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
115 self.do_clear(str(bp.number))
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
116 return 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
117 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
118 return 0
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
119
17342
9876d6baf843 Make it clear that a bdb subclass must implement do_clear().
Guido van Rossum <guido@python.org>
parents: 16479
diff changeset
120 def do_clear(self, arg):
9876d6baf843 Make it clear that a bdb subclass must implement do_clear().
Guido van Rossum <guido@python.org>
parents: 16479
diff changeset
121 raise NotImplementedError, "subclass of bdb must implement do_clear()"
9876d6baf843 Make it clear that a bdb subclass must implement do_clear().
Guido van Rossum <guido@python.org>
parents: 16479
diff changeset
122
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
123 def break_anywhere(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
124 return self.breaks.has_key(
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
125 self.canonic(frame.f_code.co_filename))
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
126
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
127 # Derived classes should override the user_* methods
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
128 # to gain control.
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
129
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
130 def user_call(self, frame, argument_list):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
131 """This method is called when there is the remote possibility
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
132 that we ever need to stop in this function."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
133 pass
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
134
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
135 def user_line(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
136 """This method is called when we stop or break at this line."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
137 pass
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
138
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
139 def user_return(self, frame, return_value):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
140 """This method is called when a return trap is set here."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
141 pass
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
142
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
143 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
144 """This method is called if an exception occurs,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
145 but only if we are to stop at or just below this level."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
146 pass
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
147
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
148 # Derived classes and clients can call the following methods
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
149 # to affect the stepping state.
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
150
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
151 def set_step(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
152 """Stop after one line of code."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
153 self.stopframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
154 self.returnframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
155 self.quitting = 0
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
156
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
157 def set_next(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
158 """Stop on the next line in or below the given frame."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
159 self.stopframe = frame
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
160 self.returnframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
161 self.quitting = 0
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
162
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
163 def set_return(self, frame):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
164 """Stop when returning from the given frame."""
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
165 self.stopframe = frame.f_back
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
166 self.returnframe = frame
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
167 self.quitting = 0
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
168
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
169 def set_trace(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
170 """Start debugging from here."""
23558
5d095898dae6 Backport fix by tismer for #210682
Neal Norwitz <nnorwitz@gmail.com>
parents: 22083
diff changeset
171 frame = sys._getframe().f_back
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
172 self.reset()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
173 while frame:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
174 frame.f_trace = self.trace_dispatch
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
175 self.botframe = frame
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
176 frame = frame.f_back
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
177 self.set_step()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
178 sys.settrace(self.trace_dispatch)
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
179
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
180 def set_continue(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
181 # Don't stop except at breakpoints or when finished
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
182 self.stopframe = self.botframe
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
183 self.returnframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
184 self.quitting = 0
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
185 if not self.breaks:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
186 # no breakpoints; run without debugger overhead
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
187 sys.settrace(None)
23558
5d095898dae6 Backport fix by tismer for #210682
Neal Norwitz <nnorwitz@gmail.com>
parents: 22083
diff changeset
188 frame = sys._getframe().f_back
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
189 while frame and frame is not self.botframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
190 del frame.f_trace
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
191 frame = frame.f_back
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
192
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
193 def set_quit(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
194 self.stopframe = self.botframe
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
195 self.returnframe = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
196 self.quitting = 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
197 sys.settrace(None)
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
198
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
199 # Derived classes and clients can call the following methods
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
200 # to manipulate breakpoints. These methods return an
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
201 # error message is something went wrong, None if all is well.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
202 # Set_break prints out the breakpoint line and file:lineno.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
203 # Call self.get_*break*() to see the breakpoints or better
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
204 # for bp in Breakpoint.bpbynumber: if bp: bp.bpprint().
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
205
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
206 def set_break(self, filename, lineno, temporary=0, cond = None):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
207 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
208 import linecache # Import as late as possible
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
209 line = linecache.getline(filename, lineno)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
210 if not line:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
211 return 'Line %s:%d does not exist' % (filename,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
212 lineno)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
213 if not self.breaks.has_key(filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
214 self.breaks[filename] = []
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
215 list = self.breaks[filename]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
216 if not lineno in list:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
217 list.append(lineno)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
218 bp = Breakpoint(filename, lineno, temporary, cond)
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
219
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
220 def clear_break(self, filename, lineno):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
221 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
222 if not self.breaks.has_key(filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
223 return 'There are no breakpoints in %s' % filename
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
224 if lineno not in self.breaks[filename]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
225 return 'There is no breakpoint at %s:%d' % (filename,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
226 lineno)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
227 # If there's only one bp in the list for that file,line
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
228 # pair, then remove the breaks entry
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
229 for bp in Breakpoint.bplist[filename, lineno][:]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
230 bp.deleteMe()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
231 if not Breakpoint.bplist.has_key((filename, lineno)):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
232 self.breaks[filename].remove(lineno)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
233 if not self.breaks[filename]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
234 del self.breaks[filename]
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
235
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
236 def clear_bpbynumber(self, arg):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
237 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
238 number = int(arg)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
239 except:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
240 return 'Non-numeric breakpoint number (%s)' % arg
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
241 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
242 bp = Breakpoint.bpbynumber[number]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
243 except IndexError:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
244 return 'Breakpoint number (%d) out of range' % number
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
245 if not bp:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
246 return 'Breakpoint (%d) already deleted' % number
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
247 self.clear_break(bp.file, bp.line)
9941
06c7fff5274a Change clear_break() to the old signature clear_break(file, line).
Guido van Rossum <guido@python.org>
parents: 9500
diff changeset
248
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
249 def clear_all_file_breaks(self, filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
250 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
251 if not self.breaks.has_key(filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
252 return 'There are no breakpoints in %s' % filename
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
253 for line in self.breaks[filename]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
254 blist = Breakpoint.bplist[filename, line]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
255 for bp in blist:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
256 bp.deleteMe()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
257 del self.breaks[filename]
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
258
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
259 def clear_all_breaks(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
260 if not self.breaks:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
261 return 'There are no breakpoints'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
262 for bp in Breakpoint.bpbynumber:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
263 if bp:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
264 bp.deleteMe()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
265 self.breaks = {}
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
266
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
267 def get_break(self, filename, lineno):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
268 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
269 return self.breaks.has_key(filename) and \
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
270 lineno in self.breaks[filename]
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
271
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
272 def get_breaks(self, filename, lineno):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
273 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
274 return self.breaks.has_key(filename) and \
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
275 lineno in self.breaks[filename] and \
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
276 Breakpoint.bplist[filename, lineno] or []
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
277
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
278 def get_file_breaks(self, filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
279 filename = self.canonic(filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
280 if self.breaks.has_key(filename):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
281 return self.breaks[filename]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
282 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
283 return []
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
284
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
285 def get_all_breaks(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
286 return self.breaks
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
287
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
288 # Derived classes and clients can call the following method
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
289 # to get a data structure representing a stack trace.
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
290
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
291 def get_stack(self, f, t):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
292 stack = []
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
293 if t and t.tb_frame is f:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
294 t = t.tb_next
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
295 while f is not None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
296 stack.append((f, f.f_lineno))
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
297 if f is self.botframe:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
298 break
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
299 f = f.f_back
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
300 stack.reverse()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
301 i = max(0, len(stack) - 1)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
302 while t is not None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
303 stack.append((t.tb_frame, t.tb_lineno))
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
304 t = t.tb_next
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
305 return stack, i
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
306
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
307 #
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
308
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
309 def format_stack_entry(self, frame_lineno, lprefix=': '):
16479
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
310 import linecache, repr
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
311 frame, lineno = frame_lineno
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
312 filename = self.canonic(frame.f_code.co_filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
313 s = filename + '(' + `lineno` + ')'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
314 if frame.f_code.co_name:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
315 s = s + frame.f_code.co_name
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
316 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
317 s = s + "<lambda>"
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
318 if frame.f_locals.has_key('__args__'):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
319 args = frame.f_locals['__args__']
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
320 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
321 args = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
322 if args:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
323 s = s + repr.repr(args)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
324 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
325 s = s + '()'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
326 if frame.f_locals.has_key('__return__'):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
327 rv = frame.f_locals['__return__']
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
328 s = s + '->'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
329 s = s + repr.repr(rv)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
330 line = linecache.getline(filename, lineno)
16479
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
331 if line: s = s + lprefix + line.strip()
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
332 return s
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
333
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
334 # The following two methods can be called by clients to use
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
335 # a debugger to debug a statement, given as a string.
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
336
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
337 def run(self, cmd, globals=None, locals=None):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
338 if globals is None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
339 import __main__
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
340 globals = __main__.__dict__
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
341 if locals is None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
342 locals = globals
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
343 self.reset()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
344 sys.settrace(self.trace_dispatch)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
345 if not isinstance(cmd, types.CodeType):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
346 cmd = cmd+'\n'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
347 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
348 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
349 exec cmd in globals, locals
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
350 except BdbQuit:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
351 pass
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
352 finally:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
353 self.quitting = 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
354 sys.settrace(None)
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
355
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
356 def runeval(self, expr, globals=None, locals=None):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
357 if globals is None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
358 import __main__
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
359 globals = __main__.__dict__
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
360 if locals is None:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
361 locals = globals
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
362 self.reset()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
363 sys.settrace(self.trace_dispatch)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
364 if not isinstance(expr, types.CodeType):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
365 expr = expr+'\n'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
366 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
367 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
368 return eval(expr, globals, locals)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
369 except BdbQuit:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
370 pass
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
371 finally:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
372 self.quitting = 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
373 sys.settrace(None)
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 786
diff changeset
374
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
375 def runctx(self, cmd, globals, locals):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
376 # B/W compatibility
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
377 self.run(cmd, globals, locals)
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
378
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
379 # This method is more useful to debug a single function call.
1006
903071377d29 Added a _v21 def to FL.py and added two new input field types
Guido van Rossum <guido@python.org>
parents: 786
diff changeset
380
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
381 def runcall(self, func, *args):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
382 self.reset()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
383 sys.settrace(self.trace_dispatch)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
384 res = None
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
385 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
386 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
387 res = apply(func, args)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
388 except BdbQuit:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
389 pass
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
390 finally:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
391 self.quitting = 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
392 sys.settrace(None)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
393 return res
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
396 def set_trace():
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
397 Bdb().set_trace()
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
398
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
399
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
400 class Breakpoint:
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
401
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
402 """Breakpoint class
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
403
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
404 Implements temporary breakpoints, ignore counts, disabling and
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
405 (re)-enabling, and conditionals.
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
406
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
407 Breakpoints are indexed by number through bpbynumber and by
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
408 the file,line tuple using bplist. The former points to a
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
409 single instance of class Breakpoint. The latter points to a
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
410 list of such instances since there may be more than one
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
411 breakpoint per line.
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
412
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
413 """
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
414
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
415 # XXX Keeping state in the class is a mistake -- this means
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
416 # you cannot have more than one active Bdb instance.
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
417
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
418 next = 1 # Next bp to be assigned
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
419 bplist = {} # indexed by (file, lineno) tuple
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
420 bpbynumber = [None] # Each entry is None or an instance of Bpt
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
421 # index 0 is unused, except for marking an
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
422 # effective break .... see effective()
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
423
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
424 def __init__(self, file, line, temporary=0, cond = None):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
425 self.file = file # This better be in canonical form!
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
426 self.line = line
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
427 self.temporary = temporary
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
428 self.cond = cond
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
429 self.enabled = 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
430 self.ignore = 0
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
431 self.hits = 0
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
432 self.number = Breakpoint.next
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
433 Breakpoint.next = Breakpoint.next + 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
434 # Build the two lists
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
435 self.bpbynumber.append(self)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
436 if self.bplist.has_key((file, line)):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
437 self.bplist[file, line].append(self)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
438 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
439 self.bplist[file, line] = [self]
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
440
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
441
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
442 def deleteMe(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
443 index = (self.file, self.line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
444 self.bpbynumber[self.number] = None # No longer in list
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
445 self.bplist[index].remove(self)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
446 if not self.bplist[index]:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
447 # No more bp for this f:l combo
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
448 del self.bplist[index]
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
449
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
450 def enable(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
451 self.enabled = 1
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
452
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
453 def disable(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
454 self.enabled = 0
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
455
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
456 def bpprint(self):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
457 if self.temporary:
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
458 disp = 'del '
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
459 else:
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
460 disp = 'keep '
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
461 if self.enabled:
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
462 disp = disp + 'yes'
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
463 else:
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
464 disp = disp + 'no '
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
465 print '%-4dbreakpoint %s at %s:%d' % (self.number, disp,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
466 self.file, self.line)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
467 if self.cond:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
468 print '\tstop only if %s' % (self.cond,)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
469 if self.ignore:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
470 print '\tignore next %d hits' % (self.ignore)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
471 if (self.hits):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
472 if (self.hits > 1): ss = 's'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
473 else: ss = ''
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
474 print ('\tbreakpoint already hit %d time%s' %
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
475 (self.hits, ss))
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
476
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
477 # -----------end of Breakpoint class----------
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
478
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
479 # Determines if there is an effective (active) breakpoint at this
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
480 # line of code. Returns breakpoint number or 0 if none
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
481 def effective(file, line, frame):
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
482 """Determine which breakpoint for this file:line is to be acted upon.
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
483
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
484 Called only if we know there is a bpt at this
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
485 location. Returns breakpoint that was triggered and a flag
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
486 that indicates if it is ok to delete a temporary bp.
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
487
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
488 """
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
489 possibles = Breakpoint.bplist[file,line]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
490 for i in range(0, len(possibles)):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
491 b = possibles[i]
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
492 if b.enabled == 0:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
493 continue
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
494 # Count every hit when bp is enabled
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
495 b.hits = b.hits + 1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
496 if not b.cond:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
497 # If unconditional, and ignoring,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
498 # go on to next, else break
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
499 if b.ignore > 0:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
500 b.ignore = b.ignore -1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
501 continue
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
502 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
503 # breakpoint and marker that's ok
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
504 # to delete if temporary
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
505 return (b,1)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
506 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
507 # Conditional bp.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
508 # Ignore count applies only to those bpt hits where the
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
509 # condition evaluates to true.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
510 try:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
511 val = eval(b.cond, frame.f_globals,
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
512 frame.f_locals)
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
513 if val:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
514 if b.ignore > 0:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
515 b.ignore = b.ignore -1
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
516 # continue
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
517 else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
518 return (b,1)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
519 # else:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
520 # continue
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
521 except:
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
522 # if eval fails, most conservative
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
523 # thing is to stop on breakpoint
15860
083a5c75ed90 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 11691
diff changeset
524 # regardless of ignore count.
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
525 # Don't delete temporary,
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
526 # as another hint to user.
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
527 return (b,0)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
528 return (None, None)
9090
26f5bfd715a4 Richard Wolff's changes:
Guido van Rossum <guido@python.org>
parents: 6347
diff changeset
529
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
530 # -------------------- testing --------------------
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
531
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
532 class Tdb(Bdb):
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
533 def user_call(self, frame, args):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
534 name = frame.f_code.co_name
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
535 if not name: name = '???'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
536 print '+++ call', name, args
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
537 def user_line(self, frame):
16479
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
538 import linecache
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
539 name = frame.f_code.co_name
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
540 if not name: name = '???'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
541 fn = self.canonic(frame.f_code.co_filename)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
542 line = linecache.getline(fn, frame.f_lineno)
16479
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
543 print '+++', fn, frame.f_lineno, name, ':', line.strip()
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
544 def user_return(self, frame, retval):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
545 print '+++ return', retval
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
546 def user_exception(self, frame, exc_stuff):
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
547 print '+++ exception', exc_stuff
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
548 self.set_continue()
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
549
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 def foo(n):
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
551 print 'foo(', n, ')'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
552 x = bar(n*10)
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
553 print 'bar returned', x
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
554
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
555 def bar(a):
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
556 print 'bar(', a, ')'
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
557 return a/2
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
558
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
559 def test():
11691
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
560 t = Tdb()
e34991022571 Mass patch by Ka-Ping Yee:
Guido van Rossum <guido@python.org>
parents: 11668
diff changeset
561 t.run('import bdb; bdb.foo(10)')
16479
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
562
d59663d3e433 String method conversion.
Eric S. Raymond <esr@thyrsus.com>
parents: 16070
diff changeset
563 # end