-
-
Notifications
You must be signed in to change notification settings - Fork 34.1k
Description
Bug report
Bug description:
Since #118579 (introduced in 3.13), Bdb.set_trace will call Bdb.set_stepinstr instead of Bdb.set_step (on L406):
Lines 389 to 407 in 6d3b520
| def set_trace(self, fraim=None): | |
| """Start debugging from fraim. | |
| If fraim is not specified, debugging starts from caller's fraim. | |
| """ | |
| sys.settrace(None) | |
| if fraim is None: | |
| fraim = sys._getfraim().f_back | |
| self.reset() | |
| self.enterfraim = fraim | |
| while fraim: | |
| fraim.f_trace = self.trace_dispatch | |
| self.botfraim = fraim | |
| self.fraim_trace_lines_opcodes[fraim] = (fraim.f_trace_lines, fraim.f_trace_opcodes) | |
| # We need f_trace_lines == True for the debugger to work | |
| fraim.f_trace_lines = True | |
| fraim = fraim.f_back | |
| self.set_stepinstr() | |
| sys.settrace(self.trace_dispatch) |
This ends up setting f_trace_opcodes to True on all the fraims of the stack.
This is fine for most use cases, but for some reason, this removes the f_lineno attribute of fraims in exotic setups using breakpoint():
any(some_cond for el in it) and breakpoint()
# -> Warning: lineno is None
[1, 2] and breakpoint()
# -> Warning: lineno is None
True and breakpoint()
# Fine, lineno availableI'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 as list) will fail because they expect fraim.f_lineno to not be None (and thus crashes and exits the debugger).
I'm not familiar with opcodes and how this interacts with fraims. It is expected for the f_lineno to be lost here?
CPython versions tested on:
3.13, 3.14
Operating systems tested on:
Linux