annotate Lib/bdb.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 309aab4c0b98
children 2656d1eea792
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # A generic Python debugger base class.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # This class takes care of details of the trace facility;
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # a derived class should implement user interaction.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # There are two debuggers based upon this:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # 'pdb', a text-oriented debugger not unlike dbx or gdb;
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # and 'wdb', a window-oriented debugger.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # And of course... you can roll your own!
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 import sys
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
10 import types
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 BdbQuit = 'bdb.BdbQuit' # Exception to give up completely
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 class Bdb: # Basic Debugger
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
1317
ec312b647fcb pdb.py, bdb.py, cmd.py: use __init__() instead of init()
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
17 def __init__(self):
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 self.breaks = {}
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
19 self.cbreaks = {}
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 def reset(self):
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
22 import linecache
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
23 linecache.checkcache()
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 self.botframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 self.stopframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 self.returnframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 self.quitting = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 def trace_dispatch(self, frame, event, arg):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 if self.quitting:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 return # None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 if event == 'line':
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 return self.dispatch_line(frame)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 if event == 'call':
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 return self.dispatch_call(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 if event == 'return':
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 return self.dispatch_return(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if event == 'exception':
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 return self.dispatch_exception(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 print 'bdb.Bdb.dispatch: unknown debugging event:', `event`
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 return self.trace_dispatch
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 def dispatch_line(self, frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 if self.stop_here(frame) or self.break_here(frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 self.user_line(frame)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if self.quitting: raise BdbQuit
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 return self.trace_dispatch
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 def dispatch_call(self, frame, arg):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 frame.f_locals['__args__'] = arg
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 if self.botframe is None:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 # First call of dispatch since reset()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 self.botframe = frame
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 return self.trace_dispatch
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 if not (self.stop_here(frame) or self.break_anywhere(frame)):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 # No need to trace this function
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 return # None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 self.user_call(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 if self.quitting: raise BdbQuit
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 return self.trace_dispatch
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 def dispatch_return(self, frame, arg):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 if self.stop_here(frame) or frame == self.returnframe:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 self.user_return(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if self.quitting: raise BdbQuit
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 def dispatch_exception(self, frame, arg):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 if self.stop_here(frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 self.user_exception(frame, arg)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 if self.quitting: raise BdbQuit
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 return self.trace_dispatch
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 # Normally derived classes don't override the following
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
74 # methods, but they may if they want to redefine the
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 # definition of stopping and breakpoints.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 def stop_here(self, frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 if self.stopframe is None:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 return 1
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 if frame is self.stopframe:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 return 1
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 while frame is not None and frame is not self.stopframe:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 if frame is self.botframe:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 return 1
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 frame = frame.f_back
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 return 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 def break_here(self, frame):
5766
309aab4c0b98 Normalize whitespace.
Guido van Rossum <guido@python.org>
parents: 5765
diff changeset
89 filename=frame.f_code.co_filename
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
90 if not self.breaks.has_key(filename):
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 return 0
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
92 lineno=frame.f_lineno
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
93 if not lineno in self.breaks[filename]:
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return 0
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
95 if self.cbreaks.has_key((filename, lineno)):
5766
309aab4c0b98 Normalize whitespace.
Guido van Rossum <guido@python.org>
parents: 5765
diff changeset
96 cond=self.cbreaks[filename, lineno]
309aab4c0b98 Normalize whitespace.
Guido van Rossum <guido@python.org>
parents: 5765
diff changeset
97 return eval(cond, frame.f_globals,
309aab4c0b98 Normalize whitespace.
Guido van Rossum <guido@python.org>
parents: 5765
diff changeset
98 frame.f_locals)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 return 1
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 def break_anywhere(self, frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 return self.breaks.has_key(frame.f_code.co_filename)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
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
104 # Derived classes should override the user_* methods
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 # to gain control.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 def user_call(self, frame, argument_list):
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
108 # This method is called when there is the remote possibility
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 # that we ever need to stop in this function
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 pass
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 def user_line(self, frame):
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
113 # This method is called when we stop or break at this line
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 pass
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 def user_return(self, frame, return_value):
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
117 # This method is called when a return trap is set here
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 pass
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 def user_exception(self, frame, (exc_type, exc_value, exc_traceback)):
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
121 # This method is called if an exception occurs,
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 # but only if we are to stop at or just below this level
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 pass
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
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
125 # Derived classes and clients can call the following methods
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 # to affect the stepping state.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 def set_step(self):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 # Stop after one line of code
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 self.stopframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 self.returnframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 self.quitting = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 def set_next(self, frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 # Stop on the next line in or below the given frame
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 self.stopframe = frame
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 self.returnframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 self.quitting = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 def set_return(self, frame):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 # Stop when returning from the given frame
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 self.stopframe = frame.f_back
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 self.returnframe = frame
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 self.quitting = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
146 def set_trace(self):
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
147 # Start debugging from here
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
148 try:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
149 1 + ''
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
150 except:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
151 frame = sys.exc_traceback.tb_frame.f_back
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
152 self.reset()
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
153 while frame:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
154 frame.f_trace = self.trace_dispatch
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
155 self.botframe = frame
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
156 frame = frame.f_back
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
157 self.set_step()
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
158 sys.settrace(self.trace_dispatch)
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
159
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 def set_continue(self):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 # Don't stop except at breakpoints or when finished
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 self.stopframe = self.botframe
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 self.returnframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 self.quitting = 0
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
165 if not self.breaks:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
166 # no breakpoints; run without debugger overhead
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
167 sys.settrace(None)
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
168 try:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
169 1 + '' # raise an exception
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
170 except:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
171 frame = sys.exc_traceback.tb_frame.f_back
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
172 while frame and frame is not self.botframe:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
173 del frame.f_trace
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
174 frame = frame.f_back
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 def set_quit(self):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 self.stopframe = self.botframe
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 self.returnframe = None
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 self.quitting = 1
720
f7278a067fb4 use settrace() intreface
Guido van Rossum <guido@python.org>
parents: 651
diff changeset
180 sys.settrace(None)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181
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
182 # Derived classes and clients can call the following methods
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
183 # to manipulate breakpoints. These methods return an
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 # error message is something went wrong, None if all is well.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 # Call self.get_*break*() to see the breakpoints.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
187 def set_break(self, filename, lineno, cond=None):
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 import linecache # Import as late as possible
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 line = linecache.getline(filename, lineno)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 if not line:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 return 'That line does not exist!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 if not self.breaks.has_key(filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 self.breaks[filename] = []
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 list = self.breaks[filename]
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 if lineno in list:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 return 'There is already a breakpoint there!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 list.append(lineno)
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
198 if cond is not None: self.cbreaks[filename, lineno]=cond
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 def clear_break(self, filename, lineno):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 if not self.breaks.has_key(filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 return 'There are no breakpoints in that file!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 if lineno not in self.breaks[filename]:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 return 'There is no breakpoint there!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 self.breaks[filename].remove(lineno)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 if not self.breaks[filename]:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 del self.breaks[filename]
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
208 try: del self.cbreaks[filename, lineno]
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
209 except: pass
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 def clear_all_file_breaks(self, filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 if not self.breaks.has_key(filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 return 'There are no breakpoints in that file!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 del self.breaks[filename]
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
215 for f,l in self.cbreaks.keys():
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
216 if f==filename: del self.cbreaks[f,l]
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
218 def clear_all_breaks(self):
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 if not self.breaks:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 return 'There are no breakpoints!'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 self.breaks = {}
5765
d6421b3ed1da Support for conditional breakpoints (Jim Fulton).
Guido van Rossum <guido@python.org>
parents: 4411
diff changeset
222 self.cbreaks = {}
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 def get_break(self, filename, lineno):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 return self.breaks.has_key(filename) and \
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 lineno in self.breaks[filename]
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 def get_file_breaks(self, filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 if self.breaks.has_key(filename):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 return self.breaks[filename]
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 else:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 return []
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 def get_all_breaks(self):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 return self.breaks
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
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
237 # Derived classes and clients can call the following method
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 # to get a data structure representing a stack trace.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 def get_stack(self, f, t):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 stack = []
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 if t and t.tb_frame is f:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 t = t.tb_next
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 while f is not None:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 stack.append((f, f.f_lineno))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 if f is self.botframe:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 break
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 f = f.f_back
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 stack.reverse()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 i = max(0, len(stack) - 1)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 while t is not None:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 stack.append((t.tb_frame, t.tb_lineno))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 t = t.tb_next
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 return stack, i
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255
651
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
256 #
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
257
1999
c5a514f8f3e3 improved prompt format
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
258 def format_stack_entry(self, frame_lineno, lprefix=': '):
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
259 import linecache, repr, string
1110
1d06b1499eb9 * Got entirely rid of path.py.
Guido van Rossum <guido@python.org>
parents: 1006
diff changeset
260 frame, lineno = frame_lineno
651
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
261 filename = frame.f_code.co_filename
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
262 s = filename + '(' + `lineno` + ')'
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
263 if frame.f_code.co_name:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
264 s = s + frame.f_code.co_name
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
265 else:
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
266 s = s + "<lambda>"
651
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
267 if frame.f_locals.has_key('__args__'):
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
268 args = frame.f_locals['__args__']
2280
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
269 else:
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
270 args = None
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
271 if args:
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
272 s = s + repr.repr(args)
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
273 else:
650cb67d7659 fix formatting of stack entries
Guido van Rossum <guido@python.org>
parents: 1999
diff changeset
274 s = s + '()'
651
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
275 if frame.f_locals.has_key('__return__'):
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
276 rv = frame.f_locals['__return__']
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
277 s = s + '->'
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
278 s = s + repr.repr(rv)
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
279 line = linecache.getline(filename, lineno)
1999
c5a514f8f3e3 improved prompt format
Guido van Rossum <guido@python.org>
parents: 1746
diff changeset
280 if line: s = s + lprefix + string.strip(line)
651
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
281 return s
73fe7a1a5dd4 Added a method "format_stack_entry" to be used by derived classes.
Guido van Rossum <guido@python.org>
parents: 623
diff changeset
282
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
283 # The following two methods can be called by clients to use
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 # a debugger to debug a statement, given as a string.
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
286 def run(self, cmd, globals=None, locals=None):
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
287 if globals is None:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
288 import __main__
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
289 globals = __main__.__dict__
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
290 if locals is None:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
291 locals = globals
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 self.reset()
720
f7278a067fb4 use settrace() intreface
Guido van Rossum <guido@python.org>
parents: 651
diff changeset
293 sys.settrace(self.trace_dispatch)
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
294 if type(cmd) <> types.CodeType:
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
295 cmd = cmd+'\n'
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 try:
786
63d34e877a69 Different syntax: cannot mix except and finally any more
Guido van Rossum <guido@python.org>
parents: 720
diff changeset
297 try:
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
298 exec cmd in globals, locals
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
299 except BdbQuit:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
300 pass
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
301 finally:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
302 self.quitting = 1
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
303 sys.settrace(None)
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
304
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
305 def runeval(self, expr, globals=None, locals=None):
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
306 if globals is None:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
307 import __main__
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
308 globals = __main__.__dict__
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
309 if locals is None:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
310 locals = globals
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
311 self.reset()
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
312 sys.settrace(self.trace_dispatch)
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
313 if type(expr) <> types.CodeType:
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
314 expr = expr+'\n'
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
315 try:
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
316 try:
4411
d738490c8da1 Allow code objects to be passed to run() and eval().
Guido van Rossum <guido@python.org>
parents: 2437
diff changeset
317 return eval(expr, globals, locals)
786
63d34e877a69 Different syntax: cannot mix except and finally any more
Guido van Rossum <guido@python.org>
parents: 720
diff changeset
318 except BdbQuit:
63d34e877a69 Different syntax: cannot mix except and finally any more
Guido van Rossum <guido@python.org>
parents: 720
diff changeset
319 pass
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 finally:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 self.quitting = 1
720
f7278a067fb4 use settrace() intreface
Guido van Rossum <guido@python.org>
parents: 651
diff changeset
322 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
323
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
324 def runctx(self, cmd, globals, locals):
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
325 # B/W compatibility
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
326 self.run(cmd, globals, locals)
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
327
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
328 # This method is more useful to debug a single function call.
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
329
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
330 def runcall(self, func, *args):
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
331 self.reset()
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
332 sys.settrace(self.trace_dispatch)
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
333 res = 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
334 try:
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
335 try:
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
336 res = apply(func, args)
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
337 except BdbQuit:
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
338 pass
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
339 finally:
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
340 self.quitting = 1
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
341 sys.settrace(None)
2437
62ebbcfea827 handle class exceptions; added runeval; made runctx obsolete
Guido van Rossum <guido@python.org>
parents: 2280
diff changeset
342 return res
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
345 def set_trace():
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
346 Bdb().set_trace()
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
347
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 # -------------------- testing --------------------
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 class Tdb(Bdb):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 def user_call(self, frame, args):
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
352 name = frame.f_code.co_name
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 if not name: name = '???'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 print '+++ call', name, args
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 def user_line(self, frame):
1746
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
356 import linecache, string
1940892d2fe3 Merge alpha100 branch back to main trunk
Guido van Rossum <guido@python.org>
parents: 1435
diff changeset
357 name = frame.f_code.co_name
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 if not name: name = '???'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 fn = frame.f_code.co_filename
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 line = linecache.getline(fn, frame.f_lineno)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 print '+++', fn, frame.f_lineno, name, ':', string.strip(line)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 def user_return(self, frame, retval):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 print '+++ return', retval
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 def user_exception(self, frame, exc_stuff):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 print '+++ exception', exc_stuff
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 self.set_continue()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 def foo(n):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 print 'foo(', n, ')'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 x = bar(n*10)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 print 'bar returned', x
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 def bar(a):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 print 'bar(', a, ')'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 return a/2
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 def test():
1317
ec312b647fcb pdb.py, bdb.py, cmd.py: use __init__() instead of init()
Guido van Rossum <guido@python.org>
parents: 1110
diff changeset
378 t = Tdb()
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 t.run('import bdb; bdb.foo(10)')