It's possible to make the interpreter abort by running the code below:
import _thread for x in range(10): _thread.stack_size(59877) _thread.start_joinable_thread(str)
Backtrace:
python: Python/ceval.c:530: void tstate_set_stack(PyThreadState *, uintptr_t, uintptr_t): Assertion `(top - base) >= _PyOS_MIN_STACK_SIZE' failed. Thread 2 "python" received signal SIGABRT, Aborted. #0 __pthread_kill_implementation (threadid=<optimized out>, signo=6, no_tid=0) at ./nptl/pthread_kill.c:44 #1 __pthread_kill_internal (threadid=<optimized out>, signo=6) at ./nptl/pthread_kill.c:89 #2 __GI___pthread_kill (threadid=<optimized out>, signo=signo@entry=6) at ./nptl/pthread_kill.c:100 #3 0x00007ffff7c45e2e in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #4 0x00007ffff7c28888 in __GI_abort () at ./stdlib/abort.c:77 #5 0x00007ffff7c287f0 in __assert_fail_base (fmt=<optimized out>, assertion=<optimized out>, file=<optimized out>, line=<optimized out>, function=<optimized out>) at ./assert/assert.c:118 #6 0x00007ffff7c3c19f in __assert_fail (assertion=<optimized out>, file=<optimized out>, line=<optimized out>, function=<optimized out>) at ./assert/assert.c:127 #7 0x000055555585e771 in tstate_set_stack (tstate=tstate@entry=0x555555dea4d0, base=base@entry=140737352556544, top=top@entry=140737352612288) at Python/ceval.c:530 #8 0x000055555585e665 in _Py_InitializeRecursionLimits (tstate=tstate@entry=0x555555dea4d0) at Python/ceval.c:574 #9 0x000055555595ff7b in _PyThreadState_Attach (tstate=0x555555dea4d0) at Python/pystate.c:2159 #10 0x0000555555a45088 in thread_run (boot_raw=boot_raw@entry=0x555555dcde50) at ./Modules/_threadmodule.c:384 #11 0x000055555598475f in pythread_wrapper (arg=0x555555dca850) at Python/thread_pthread.h:234 #12 0x00007ffff7ca3d64 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:448
Sometimes a different abort will happen, but I was never able to record it under GDB.
Message for abort 2:
python: Python/pystate.c:239: void bind_gilstate_tstate(PyThreadState *): Assertion `tstate_is_alive(tstate)' failed. Aborted (core dumped)
Found using fusil by @vstinner.
CPython main branch
Linux
Python 3.15.0a3+ free-threading build (heads/main:cf6758ff9eb, Dec 26 2025, 14:20:15) [Clang 21.1.2 (2ubuntu6)]
Not free threading specific -- crash happens in the default build too
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size()
gh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (#143601)
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (py…
Fixed in 3.14 and main branches. Thanks for your bug report.
[3.14] gh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (G…
pythongh-141044: Tighten ASan stack_size tests and NEWS section
pythongh-141044: Fix ASan leak with small threading.stack_size()
Activity
colesbury commented on Dec 28, 2025
Not free threading specific -- crash happens in the default build too
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size()
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size()
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size()
gh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (#143601)
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (py…
vstinner commented on Jan 9, 2026
Fixed in 3.14 and main branches. Thanks for your bug report.
[3.14] gh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (G…
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (py…
pythongh-143191: Use _PyOS_MIN_STACK_SIZE in _thread.stack_size() (py…
pythongh-141044: Tighten ASan stack_size tests and NEWS section
pythongh-141044: Fix ASan leak with small threading.stack_size()