Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
Description
Bug report
Bug description:
Since#118579 (introduced in 3.13),Bdb.set_trace will callBdb.set_stepinstr instead ofBdb.set_step (on L406):
Lines 389 to 407 in6d3b520
| defset_trace(self,frame=None): | |
| """Start debugging from frame. | |
| If frame is not specified, debugging starts from caller's frame. | |
| """ | |
| sys.settrace(None) | |
| ifframeisNone: | |
| frame=sys._getframe().f_back | |
| self.reset() | |
| self.enterframe=frame | |
| whileframe: | |
| frame.f_trace=self.trace_dispatch | |
| self.botframe=frame | |
| self.frame_trace_lines_opcodes[frame]= (frame.f_trace_lines,frame.f_trace_opcodes) | |
| # We need f_trace_lines == True for the debugger to work | |
| frame.f_trace_lines=True | |
| frame=frame.f_back | |
| self.set_stepinstr() | |
| sys.settrace(self.trace_dispatch) |
This ends up settingf_trace_opcodes to True on all the frames of the stack.
This is fine for most use cases, but for some reason, this removes thef_lineno attribute of frames in exotic setups usingbreakpoint():
any(some_condforelinit)andbreakpoint()# -> Warning: lineno is None[1,2]andbreakpoint()# -> Warning: lineno is NoneTrueandbreakpoint()# Fine, lineno available
I'm using these inline conditions a lot to conditionally add a breakpoint, and not having access to the line number is annoying as many commands (such aslist) will fail because they expectframe.f_lineno tonot beNone (and thus crashes and exits the debugger).
I'm not familiar with opcodes and how this interacts with frames. It is expected for thef_lineno to be lost here?
CPython versions tested on:
3.13, 3.14
Operating systems tested on:
Linux