This is a Python 2.1 and 2.2 bugfix candidate:
(or how do I "mark" something to be a candidate?) fixed an old buglet that caused bdb to be unable to continue in the botframe, after a breakpoint was set. the key idea is not to set botframe to the bottom level frame, but its f_back, which actually might be None. Additional changes: migrated old exception trick to use sys._getframe(), which exists both in 2.1 and 2.2 . Note: I believe Mark Hammond needs to look over his code now. F5 correctly starts up in the debugger, but later on doesn't stop at a given breakpoint any longer. kind regards - chris
This commit is contained in:
parent
72de9c7a9c
commit
313a7513b0
16
Lib/bdb.py
16
Lib/bdb.py
|
@ -65,7 +65,7 @@ class Bdb:
|
||||||
# XXX 'arg' is no longer used
|
# XXX 'arg' is no longer used
|
||||||
if self.botframe is None:
|
if self.botframe is None:
|
||||||
# First call of dispatch since reset()
|
# First call of dispatch since reset()
|
||||||
self.botframe = frame
|
self.botframe = frame.f_back # (CT) Note that this may also be None!
|
||||||
return self.trace_dispatch
|
return self.trace_dispatch
|
||||||
if not (self.stop_here(frame) or self.break_anywhere(frame)):
|
if not (self.stop_here(frame) or self.break_anywhere(frame)):
|
||||||
# No need to trace this function
|
# No need to trace this function
|
||||||
|
@ -91,8 +91,8 @@ class Bdb:
|
||||||
# definition of stopping and breakpoints.
|
# definition of stopping and breakpoints.
|
||||||
|
|
||||||
def stop_here(self, frame):
|
def stop_here(self, frame):
|
||||||
if self.stopframe is None:
|
# (CT) stopframe may now also be None, see dispatch_call.
|
||||||
return True
|
# (CT) the former test for None is therefore removed from here.
|
||||||
if frame is self.stopframe:
|
if frame is self.stopframe:
|
||||||
return True
|
return True
|
||||||
while frame is not None and frame is not self.stopframe:
|
while frame is not None and frame is not self.stopframe:
|
||||||
|
@ -169,10 +169,7 @@ class Bdb:
|
||||||
|
|
||||||
def set_trace(self):
|
def set_trace(self):
|
||||||
"""Start debugging from here."""
|
"""Start debugging from here."""
|
||||||
try:
|
frame = sys._getframe().f_back
|
||||||
raise Exception
|
|
||||||
except:
|
|
||||||
frame = sys.exc_info()[2].tb_frame.f_back
|
|
||||||
self.reset()
|
self.reset()
|
||||||
while frame:
|
while frame:
|
||||||
frame.f_trace = self.trace_dispatch
|
frame.f_trace = self.trace_dispatch
|
||||||
|
@ -189,10 +186,7 @@ class Bdb:
|
||||||
if not self.breaks:
|
if not self.breaks:
|
||||||
# no breakpoints; run without debugger overhead
|
# no breakpoints; run without debugger overhead
|
||||||
sys.settrace(None)
|
sys.settrace(None)
|
||||||
try:
|
frame = sys._getframe().f_back
|
||||||
raise Exception
|
|
||||||
except:
|
|
||||||
frame = sys.exc_info()[2].tb_frame.f_back
|
|
||||||
while frame and frame is not self.botframe:
|
while frame and frame is not self.botframe:
|
||||||
del frame.f_trace
|
del frame.f_trace
|
||||||
frame = frame.f_back
|
frame = frame.f_back
|
||||||
|
|
Loading…
Reference in New Issue