You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
pdb.set_trace() clobbering traceback on error #60686
The top level frame line number is not updated because it has a local
trace function while the global trace function is None. This is
related to bpo-7238.
The following patch fixes the issue. The patch removes the local trace
at the top level frame and makes sure it is not reinstalled when
returning from the current trace function.
diff --git a/Lib/bdb.py b/Lib/bdb.py--- a/Lib/bdb.py+++ b/Lib/bdb.py@@ -64,6 +64,10 @@
if self.stop_here(frame) or self.break_here(frame):
self.user_line(frame)
if self.quitting: raise BdbQuit
+ # Do not re-install the local trace when we are finished debugging,+ # see issues 16482 and 7238.+ if not sys.gettrace():+ return None
return self.trace_dispatch
def dispatch_call(self, frame, arg):
@@ -231,8 +235,10 @@
# no breakpoints; run without debugger overhead
sys.settrace(None)
frame = sys._getframe().f_back
- while frame and frame is not self.botframe:+ while frame:
del frame.f_trace
+ if frame is self.botframe:+ break
frame = frame.f_back
def set_quit(self):
The following code is a minimum implementation of pdb with the patch
applied and the associated code to test it.
classBdb:
deftrace_dispatch(self, frame, event, arg):
self.set_continue()
ifsys.gettrace():
returnself.trace_dispatchdefset_trace(self, frame):
self.botframe=frameframe.f_trace=self.trace_dispatchsys.settrace(self.trace_dispatch)
defset_continue(self):
sys.settrace(None)
delself.botframe.f_traceframe=sys._getframe()
d=Bdb()
d.set_trace(frame)
y="line of code not triggering an error"x=1assertx!=1
See also bpo-17697. Xavier, would you be willing to submit a patch with a test?
xdegaye commented on Apr 12, 2013
xdegayemannequin
Mannequin
More actions
The last patch proposed at bpo-17277 and named traced_frame.patch
fixes also bpo-17697, and issues 7238, 16482. IMHO one should remove
the assumption in PyFrame_GetLineNumber() that f_lineno is correct
when f_trace is not NULL, as there does not seem to be a way to remove
the local trace function of a generator frame. The traced_frame patch
does that.
xdegaye commented on Apr 12, 2013
xdegayemannequin
Mannequin
More actions
Forgot to say that traced_frame.patch includes a test.
inglesp commented on Jan 29, 2015
inglespmannequin
Mannequin
More actions
I've just hit this. Is there anything I can do to help get this fixed?`
I too just hit this issue with pdb and checked out the PR locally. It works fine though it has merge conflicts with latest master. I am adding 3.8, 3.7 and 3.6 removing the older versions that don't support bug fixes. Since the PR has unknown repository I suppose @xdegaye has deleted their fork and I don't know if the PR can be revived without opening a new one.
I have merged the latest master in my own fork resolving conflicts in case a new PR has to be generated : master...tirkarthi:[pr-6233](https://github.com/python/cpython/pull/6233)-latest. Adding Serhiy to the issue. The PR also solves many linked issues in the PR and I thought to add the update here since it seemed appropriate.
You can download the branch for a pull request even if the repo is deleted using this https://stackoverflow.com/a/28622034/161801. That will let you keep the original commits intact.
importpdbx=0whileTrue:
pdb.set_trace()
y="line of code not triggering an error"x+=1assertx!=3iritkatriel@Irits-MBPcpython%catpdb_traceback.pyimportpdbx=0whileTrue:
pdb.set_trace()
y="line of code not triggering an error"x+=1assertx!=3iritkatriel@Irits-MBPcpython% ./python.exepdb_traceback.py>/Users/iritkatriel/src/cpython/pdb_traceback.py(8)<module>()
->y="line of code not triggering an error"
(Pdb) c>/Users/iritkatriel/src/cpython/pdb_traceback.py(8)<module>()
->y="line of code not triggering an error"
(Pdb) c>/Users/iritkatriel/src/cpython/pdb_traceback.py(8)<module>()
->y="line of code not triggering an error"
(Pdb) cTraceback (mostrecentcalllast):
File"/Users/iritkatriel/src/cpython/pdb_traceback.py", line10, in<module>assertx!=3^^^^^^^^^^^^^AssertionError
Activity
akaptur commentedon Nov 15, 2012
pdb.set_trace() is overwriting the actual traceback when exiting with an error. See minimal recreation here: https://gist.github.com/4079971
xdegaye commentedon Nov 19, 2012
The top level frame line number is not updated because it has a local
trace function while the global trace function is None. This is
related to bpo-7238.
The following patch fixes the issue. The patch removes the local trace
at the top level frame and makes sure it is not reinstalled when
returning from the current trace function.
The following code is a minimum implementation of pdb with the patch
applied and the associated code to test it.
xdegaye commentedon Nov 24, 2012
See also how it is fixed at
http://code.google.com/p/pdb-clone/source/detail?r=123d1b6db6649f4b54712db321865fda55395488&name=default
ned-deily commentedon Apr 11, 2013
See also bpo-17697. Xavier, would you be willing to submit a patch with a test?
xdegaye commentedon Apr 12, 2013
The last patch proposed at bpo-17277 and named traced_frame.patch
fixes also bpo-17697, and issues 7238, 16482. IMHO one should remove
the assumption in PyFrame_GetLineNumber() that f_lineno is correct
when f_trace is not NULL, as there does not seem to be a way to remove
the local trace function of a generator frame. The traced_frame patch
does that.
xdegaye commentedon Apr 12, 2013
Forgot to say that traced_frame.patch includes a test.
inglesp commentedon Jan 29, 2015
I've just hit this. Is there anything I can do to help get this fixed?`
blueyed commentedon Mar 27, 2018
Just for reference: #6233 is about fixing this.
tirkarthi commentedon Dec 4, 2018
I too just hit this issue with pdb and checked out the PR locally. It works fine though it has merge conflicts with latest master. I am adding 3.8, 3.7 and 3.6 removing the older versions that don't support bug fixes. Since the PR has unknown repository I suppose @xdegaye has deleted their fork and I don't know if the PR can be revived without opening a new one.
I have merged the latest master in my own fork resolving conflicts in case a new PR has to be generated : master...tirkarthi:[pr-6233](https://github.com/python/cpython/pull/6233)-latest. Adding Serhiy to the issue. The PR also solves many linked issues in the PR and I thought to add the update here since it seemed appropriate.
Thanks much @xdegaye for the PR
asmeurer commentedon Dec 4, 2018
You can download the branch for a pull request even if the repo is deleted using this https://stackoverflow.com/a/28622034/161801. That will let you keep the original commits intact.
iritkatriel commentedon Jan 10, 2022
iritkatriel@Irits-MBP cpython % cat pdb_traceback.py