homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Incorrect stacktrace from pdb
Type: behavior Stage: needs patch
Components: Library (Lib) Versions: Python 3.2, Python 3.3, Python 3.4, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Aaron.Meurer, donaldcallen, ikelly, ned.deily, xdegaye
Priority: normal Keywords:

Created on 2013年04月11日 15:07 by donaldcallen, last changed 2022年04月11日 14:57 by admin.

Files
File name Uploaded Description Edit
python_bug.py donaldcallen, 2013年04月11日 15:07
Messages (4)
msg186561 - (view) Author: Don Allen (donaldcallen) Date: 2013年04月11日 15:07
Give the attached file execute permission and run it. At the first breakpoint, the backtrace will be correct. Continue. At the second breakpoint, a backtrace will show the foo('first call') on the stack when, in fact, the call came from foo('second call'), as verified by the printed message.
I am running this on an up-to-date 64-bit Arch Linux system. Python 3.3.1.
msg186581 - (view) Author: Ian Kelly (ikelly) Date: 2013年04月11日 19:01
The bug also occurs using 32-bit Python 3.3.1 on Windows 7.
msg186584 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2013年04月11日 19:39
On python-list, Robert Kern used "where" to demonstrate the problem: 
$ python pdbbug.py
first call
--Return--
 > /Users/rkern/scratch/pdbbug.py(4)foo()->None
-> pdb.set_trace()
(Pdb) where
 /Users/rkern/scratch/pdbbug.py(5)<module>()
-> foo('first call')
 > /Users/rkern/scratch/pdbbug.py(4)foo()->None
-> pdb.set_trace()
(Pdb) c
second call
--Return--
 > /Users/rkern/scratch/pdbbug.py(4)foo()->None
-> pdb.set_trace()
(Pdb) where
 /Users/rkern/scratch/pdbbug.py(5)<module>()
-> foo('first call')
 > /Users/rkern/scratch/pdbbug.py(4)foo()->None
-> pdb.set_trace()
(Pdb)
Searching other open pdb issues, applying the suggested fix from Issue16482 seems to correct the problem here.
msg186637 - (view) Author: Xavier de Gaye (xdegaye) * (Python triager) Date: 2013年04月12日 14:57
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.
History
Date User Action Args
2022年04月11日 14:57:44adminsetgithub: 61897
2015年05月08日 00:14:38Aaron.Meurersetnosy: + Aaron.Meurer
2013年04月12日 14:57:16xdegayesetnosy: + xdegaye
messages: + msg186637
2013年04月11日 19:40:16ned.deilysetstage: needs patch
versions: + Python 2.7, Python 3.2, Python 3.4
2013年04月11日 19:39:22ned.deilysetnosy: + ned.deily
messages: + msg186584
2013年04月11日 19:01:12ikellysetnosy: + ikelly
messages: + msg186581
2013年04月11日 15:07:39donaldcallencreate

AltStyle によって変換されたページ (->オリジナル) /