classification
Title: Recursive traceback crashes Python Interpreter
Type: crash Stage: resolved
Components: Interpreter Core Versions: Python 3.10, Python 3.9, Python 3.8, Python 3.7, Python 3.6
process
Status: closed Resolution: fixed
Dependencies: Superseder: crash with unbounded recursion in except statement
View: 42500
Assigned To: Nosy List: ronaldoussoren, stestagg, xxm
Priority: normal Keywords:

Created on 2020-12-16 08:02 by xxm, last changed 2020-12-22 08:32 by ronaldoussoren. This issue is now closed.

Messages (6)
msg383118 - (view) Author: Xinmeng Xia (xxm) Date: 2020-12-16 08:02
=================
import traceback

def foo():
  traceback.print_exc()
  foo() 
    
foo()
================


Try running the above program, the interpreter is crashed with the error message like the following:

Fatal Python error: Cannot recover from stack overflow.
NoneType: None
NoneType: None
NoneType: None
NoneType: None

...
NoneType: None

NoneType: None
NoneType: <unprintable NoneType object>
NoneType: None
NoneType: None
...
NoneType: None
NoneType: None
NoneType: None
Fatal Python error: _Py_CheckRecursiveCall: Cannot recover from stack overflow.
Python runtime state: initialized

Current thread 0x00007fab0bdda700 (most recent call first):
  File "/usr/local/python310/lib/python3.10/traceback.py", line 155 in _some_str
  File "/usr/local/python310/lib/python3.10/traceback.py", line 515 in __init__
  File "/usr/local/python310/lib/python3.10/traceback.py", line 103 in print_exception
  File "/usr/local/python310/lib/python3.10/traceback.py", line 163 in print_exc
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 4 in foo
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
...
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
  File "/home/xxm/Desktop/nameChanging/myerror/test1.py", line 5 in foo
  ...
Aborted (core dumped)
msg383249 - (view) Author: Ronald Oussoren (ronaldoussoren) * (Python committer) Date: 2020-12-17 15:31
This might be related to #42500
msg383253 - (view) Author: Xinmeng Xia (xxm) Date: 2020-12-17 16:40
In issue#36272, they discuss a bug in logging module. They show an example which is similar as this one. So I think I think there might be a similar bug in traceback module.
msg383267 - (view) Author: Steve Stagg (stestagg) Date: 2020-12-17 21:45
Confirmed that bpo-42500 fixes this traceback, in commit 4e7a69bdb6 

Parent commit:

user@obsidian ~/t/f/cpython (master)> git checkout  93a0ef7
Note: switching to '93a0ef7'.
HEAD is now at 93a0ef7647 Correct return type in Modules/_ssl.c::sslmodule_legacy (GH-23609)

user@obsidian ~/t/f/cpython ((93a0ef76…))> ../test.sh
+ make distclean
+ CFLAGS=-O0
+ ./configure --prefix=/home/user/prefix --exec-prefix=/home/user/prefix --cache-file=../config.cache --with-pydebug --without-ensurepip
+ CFLAGS=-O0
+ make -j8 install
/home/user/cpython/Lib/runpy.py:111: PendingDeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  __import__(pkg_name)
/home/user/cpython/Lib/runpy.py:111: PendingDeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  __import__(pkg_name)
++ realpath /home/user/prefix/include/python3.10d/
+ INCLUDE_DIR=/home/user/prefix/include/python3.10d
+ set +e
+ PYTHONHOME=/home/user/prefix
+ /home/user/prefix/bin/python3 ../test.py
NoneType: None
...
NoneType: None
Fatal Python error: _Py_CheckRecursiveCall: Cannot recover from stack overflow.
Python runtime state: initialized

Current thread 0x00007f483d4bd740 (most recent call first):
  File "/home/user/prefix/lib/python3.10/traceback.py", line 165 in _some_str
  File "/home/user/prefix/lib/python3.10/traceback.py", line 524 in __init__
  File "/home/user/prefix/lib/python3.10/traceback.py", line 113 in print_exception
  File "/home/user/prefix/lib/python3.10/traceback.py", line 173 in print_exc
  File "/home/user/cpython/../test.py", line 4 in foo
  ...
../test.sh: line 33: 50081 Aborted                 (core dumped) PYTHONHOME=$PREFIX $EPREFIX/bin/python3 ../test.py
+ [[ 134 -eq 139 ]]
+ exit 0

After fix merged:

user@obsidian ~/t/f/cpython ((93a0ef76…)) [1]> git checkout 4e7a69bdb6
Previous HEAD position was 93a0ef7647 Correct return type in Modules/_ssl.c::sslmodule_legacy (GH-23609)
HEAD is now at 4e7a69bdb6 bpo-42500: Fix recursion in or after except (GH-23568)
user@obsidian ~/t/f/cpython ((4e7a69bd…))> ../test.sh
+ make distclean
+ CFLAGS=-O0
+ ./configure --prefix=/home/user/prefix --exec-prefix=/home/user/prefix --cache-file=../config.cache --with-pydebug --without-ensurepip
+ CFLAGS=-O0
+ make -j8 install
/home/user/cpython/Lib/runpy.py:111: PendingDeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  __import__(pkg_name)
/home/user/cpython/Lib/runpy.py:111: PendingDeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
  __import__(pkg_name)
++ realpath /home/user/prefix/include/python3.10d/
+ INCLUDE_DIR=/home/user/prefix/include/python3.10d
+ set +e
+ PYTHONHOME=/home/user/prefix
+ /home/user/prefix/bin/python3 ../test.py
NoneType: None
...
NoneType: None
Traceback (most recent call last):
  File "/home/user/prefix/lib/python3.10/traceback.py", line 165, in _some_str
    return str(value)
RecursionError: maximum recursion depth exceeded while calling a Python object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user/cpython/../test.py", line 7, in <module>
    foo()
  File "/home/user/cpython/../test.py", line 5, in foo
    foo() 
  File "/home/user/cpython/../test.py", line 5, in foo
    foo() 
  File "/home/user/cpython/../test.py", line 5, in foo
    foo() 
  [Previous line repeated 989 more times]
  File "/home/user/cpython/../test.py", line 4, in foo
    traceback.print_exc()
  File "/home/user/prefix/lib/python3.10/traceback.py", line 173, in print_exc
    print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
  File "/home/user/prefix/lib/python3.10/traceback.py", line 113, in print_exception
    for line in TracebackException(
  File "/home/user/prefix/lib/python3.10/traceback.py", line 632, in format
    yield from self.format_exception_only()
  File "/home/user/prefix/lib/python3.10/traceback.py", line 580, in format_exception_only
    yield _format_final_exc_line(stype, self._str)
  File "/home/user/prefix/lib/python3.10/traceback.py", line 156, in _format_final_exc_line
    valuestr = _some_str(value)
  File "/home/user/prefix/lib/python3.10/traceback.py", line 167, in _some_str
    return '<unprintable %s object>' % type(value).__name__
RecursionError: maximum recursion depth exceeded while calling a Python object
+ [[ 1 -eq 139 ]]
+ exit 0
msg383268 - (view) Author: Steve Stagg (stestagg) Date: 2020-12-17 21:46
Sorry, previous should have read "Fixes the abort"
msg383575 - (view) Author: Xinmeng Xia (xxm) Date: 2020-12-22 08:26
Thank you very much, looking forward to the new Python version.

Could you please kindly change the resolution into fixed and close this issue?
History
Date User Action Args
2020-12-22 08:32:24ronaldoussorensetstatus: open -> closed
superseder: crash with unbounded recursion in except statement
resolution: fixed
stage: resolved
2020-12-22 08:26:36xxmsetmessages: + msg383575
2020-12-17 21:46:19stestaggsetmessages: + msg383268
2020-12-17 21:45:21stestaggsetnosy: + stestagg
messages: + msg383267
2020-12-17 16:40:45xxmsetmessages: + msg383253
2020-12-17 15:31:06ronaldoussorensetnosy: + ronaldoussoren
messages: + msg383249
2020-12-17 06:44:33xxmsettitle: Title: Recursive traceback crashes Python Interpreter -> Recursive traceback crashes Python Interpreter
2020-12-16 08:02:15xxmcreate