[issue17697] Incorrect stacktrace from pdb

Xavier de Gaye report at bugs.python.org
Fri Apr 12 16:57:16 CEST 2013


Xavier de Gaye added the comment:

The call to set_trace() installs a local trace function on all the
frames of the stack, including on the oldest frame, i.e. the module
level frame. This causes the invocation of frame_settrace() in
frameobject.c and the  module frame f_lineno is evaluated by
PyCode_Addr2Line() (this happens only on the first call to set_trace()
since the module frame local trace is never removed).

Next, the 'continue' command sets the global trace function to None
and removes the local trace function of all the frames of the stack,
*except* the module frame (see set_continue() in bdb.py).

On printing the stack with the 'where' command, the bdb get_stack()
function invokes frame_getlineno() that calls PyFrame_GetLineNumber()
that assumes that the module frame f_lineno is correct since it has a
local trace function.  But as the global trace function has been set
to None by the 'continue' command, f_lineno is not updated by
the interpreter tracing code when running the module level frame.
Hence the problem.

The root cause is that PyFrame_GetLineNumber assumes incorrectly that
when a frame has a local trace function, its f_lineno is correct.

Issue 7238 and issue 17277 are also related to this issue.

----------
nosy: +xdegaye

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue17697>
_______________________________________


More information about the Python-bugs-list mailing list