Skip to content

Use the API C of 'Py-NewInterpreterFromConfig' to exit unexpectedly in multiple threads. #111751

Description

@williamhu020

Bug report

Bug description:

Use the API C of 'Py-NewInterpreterFromConfig' to exit unexpectedly in multiple threads.

PyInterpreterConfig config = {
			    .use_main_obmalloc = 0,
			    .allow_fork = 0,
			    .allow_exec = 0,
			    .allow_threads = 1,
			    .allow_daemon_threads = 0,
			    .check_multi_interp_extensions = 1,
			    .gil = PyInterpreterConfig_OWN_GIL,
			};
			
PyStatus pstatus = Py_NewInterpreterFromConfig(&Sub_GIL_ThreadState, &config);
if (PyStatus_Exception(pstatus)) {
			return FALSE;
}

CPython versions tested on:

3.13, CPython main branch

Operating systems tested on:

Linux

Activity

  1. williamhu020 commented on Nov 5, 2023

    @williamhu020
    Author

    GDB Debug logs

    Case1
    Ensure on sub interpreter: 0x7fff60000cf0
    *[13:54:37:138]PyThreadState:0x7fff60066760
    Ensure on sub interpreter: 0x7fff9424a060
    *[13:54:37:138]PyThreadState:0x7fff942afad0
    ======= Backtrace: =========
    /lib64/libc.so.6(+0x81329)[0x7ffff1946329]
    /lib/libpython3.13.so.1.0(+0x16e471)[0x7ffff250f471]
    /lib/libpython3.13.so.1.0(PyMem_RawFree+0x46)[0x7ffff2510557]
    /lib/libpython3.13.so.1.0(+0x170b93)[0x7ffff2511b93]
    /lib/libpython3.13.so.1.0(PyObject_Free+0x46)[0x7ffff25109ed]
    /lib/libpython3.13.so.1.0(+0x18bd7f)[0x7ffff252cd7f]
    /lib/libpython3.13.so.1.0(_Py_Dealloc+0x29)[0x7ffff250f265]
    /lib/libpython3.13.so.1.0(+0x10d08f)[0x7ffff24ae08f]
    /lib/libpython3.13.so.1.0(+0x1116af)[0x7ffff24b26af]
    /lib/libpython3.13.so.1.0(+0x25402d)[0x7ffff25f502d]
    /lib/libpython3.13.so.1.0(+0x254082)[0x7ffff25f5082]
    /lib/libpython3.13.so.1.0(_PyEval_EvalFrameDefault+0x4d71)[0x7ffff25e101f]
    /lib/libpython3.13.so.1.0(+0x23a080)[0x7ffff25db080]
    /lib/libpython3.13.so.1.0(+0x254794)[0x7ffff25f5794]
    /lib/libpython3.13.so.1.0(+0x109899)[0x7ffff24aa899]
    /lib/libpython3.13.so.1.0(+0x109484)[0x7ffff24aa484]
    /lib/libpython3.13.so.1.0(+0x1096cb)[0x7ffff24aa6cb]
    /lib/libpython3.13.so.1.0(PyObject_CallObject+0xa2)[0x7ffff24aaa67]
    
    (gdb) bt
    #0  0x00007ffff18fb387 in raise () from /lib64/libc.so.6
    #1  0x00007ffff18fca78 in abort () from /lib64/libc.so.6
    #2  0x00007ffff193df67 in __libc_message () from /lib64/libc.so.6
    #3  0x00007ffff1946329 in _int_free () from /lib64/libc.so.6
    #4  0x00007ffff250f471 in _PyMem_RawFree (_unused_ctx=0x0, ptr=0x7fff57bcf3c0) at Objects/obmalloc.c:79
    #5  0x00007ffff2510557 in PyMem_RawFree (ptr=0x7fff57bcf3c0) at Objects/obmalloc.c:818
    #6  0x00007ffff2511b93 in _PyObject_Free (ctx=0x0, p=0x7fff57bcf3c0) at Objects/obmalloc.c:2023
    #7  0x00007ffff25109ed in PyObject_Free (ptr=0x7fff57bcf3c0) at Objects/obmalloc.c:963
    #8  0x00007ffff252cd7f in object_dealloc (self=0x7fff57bcf3c0) at Objects/typeobject.c:5552
    #9  0x00007ffff250f265 in _Py_Dealloc (op=0x7fff57bcf3c0) at Objects/object.c:2858
    #10 0x00007ffff24ae08f in Py_DECREF (op=<optimized out>) at ./Include/object.h:870
    #11 Py_XDECREF (op=0x7fff57bcf3c0) at ./Include/object.h:963
    #12 0x00007ffff24b26af in code_dealloc (co=0x7fff57d12d30) at Objects/codeobject.c:1726
    #13 0x00007ffff25f502d in clear_thread_frame (tstate=0x7fff60066760, frame=0x7ffff7e1d3a8) at Python/ceval.c:1504
    #14 0x00007ffff25f5082 in _PyEval_FrameClearAndPop (tstate=0x7fff60066760, frame=0x7ffff7e1d3a8) at Python/ceval.c:1530
    #15 0x00007ffff25e101f in _PyEval_EvalFrameDefault (tstate=0x7fff60066760, frame=0x7ffff7e1d3a8, throwflag=0)
        at Python/generated_cases.c.h:1148
    #16 0x00007ffff25db080 in _PyEval_EvalFrame (tstate=0x7fff60066760, frame=0x7ffff7e1d020, throwflag=0)
        at ./Include/internal/pycore_ceval.h:113
    #17 0x00007ffff25f5794 in _PyEval_Vector (tstate=0x7fff60066760, func=0x7fff57be1440, locals=0x0, args=0x7fff4ffcd618, argcount=1, 
        kwnames=0x0) at Python/ceval.c:1639
    #18 0x00007ffff24aa899 in _PyFunction_Vectorcall (func=0x7fff57be1440, stack=0x7fff4ffcd618, nargsf=1, kwnames=0x0)
        at Objects/call.c:413
    #19 0x00007ffff24aa484 in _PyVectorcall_Call (tstate=0x7fff60066760, func=0x7ffff24aa822 <_PyFunction_Vectorcall>, 
        callable=0x7fff57be1440, tuple=0x7fff4ffcd600, kwargs=0x0) at Objects/call.c:273
    #20 0x00007ffff24aa6cb in _PyObject_Call (tstate=0x7fff60066760, callable=0x7fff57be1440, args=0x7fff4ffcd600, kwargs=0x0)
        at Objects/call.c:348
    #21 0x00007ffff24aaa67 in PyObject_CallObject (callable=0x7fff57be1440, args=0x7fff4ffcd600) at Objects/call.c:472
    Case2
    *Ensure on sub interpreter: 0x7fff80000cf0
    *[14:01:22:740]PyThreadState:0x7fff80066760
    *Ensure on sub interpreter: 0x7fff78000cf0
    *[14:01:22:741]PyThreadState:0x7fff78066760
    
    (gdb) bt
    #0  0x00007ffff24b77a1 in _PyGCHead_SET_NEXT (gc=<optimized out>, next=<optimized out>) at ./Include/internal/pycore_gc.h:74
    #1  _PyObject_GC_UNTRACK (op=<optimized out>) at ./Include/internal/pycore_object.h:358
    #2  descr_dealloc (descr=0x7fffa4e2c3b0) at Objects/descrobject.c:24
    #3  0x00007ffff25f04e9 in _PyEval_EvalFrameDefault (tstate=0x7fff78066760, frame=0x7ffff7e291f0, throwflag=0)
        at Python/generated_cases.c.h:5022
    #4  0x00007ffff25db080 in _PyEval_EvalFrame (tstate=0x7fff78066760, frame=0x7ffff7e29020, throwflag=0)
        at ./Include/internal/pycore_ceval.h:113
    #5  0x00007ffff25f5794 in _PyEval_Vector (tstate=0x7fff78066760, func=0x7fffa4c1d440, locals=0x0, args=0x7fffa4e89618, argcount=1, 
        kwnames=0x0) at Python/ceval.c:1639
    #6  0x00007ffff24aa899 in _PyFunction_Vectorcall (func=0x7fffa4c1d440, stack=0x7fffa4e89618, nargsf=1, kwnames=0x0)
        at Objects/call.c:413
    #7  0x00007ffff24aa484 in _PyVectorcall_Call (tstate=0x7fff78066760, func=0x7ffff24aa822 <_PyFunction_Vectorcall>, 
        callable=0x7fffa4c1d440, tuple=0x7fffa4e89600, kwargs=0x0) at Objects/call.c:273
    #8  0x00007ffff24aa6cb in _PyObject_Call (tstate=0x7fff78066760, callable=0x7fffa4c1d440, args=0x7fffa4e89600, kwargs=0x0)
        at Objects/call.c:348
    #9  0x00007ffff24aaa67 in PyObject_CallObject (callable=0x7fffa4c1d440, args=0x7fffa4e89600) at Objects/call.c:472
    
    
    *Ensure on sub interpreter: 0x7fffa0000cf0
    *[ 14:03:44:915]PyThreadState:0x7fffa0066760
    *Ensure on sub interpreter: 0x7fff6c000cf0
    *[ 14:03:44:915]PyThreadState:0x7fff6c066760
    (gdb) bt
    #0  0x0000000000000064 in ?? ()
    #1  0x00007ffff250ca97 in PyObject_GetAttr (v=0x7fffa4d43920, name=0x7ffff2b3fb10 <_PyRuntime+43920>) at Objects/object.c:1150
    #2  0x00007ffff250d387 in _PyObject_GetMethod (obj=0x7fffa4d43920, name=0x7ffff2b3fb10 <_PyRuntime+43920>, method=0x7fffef6c87a0)
        at Objects/object.c:1438
    #3  0x00007ffff25e70f3 in _PyEval_EvalFrameDefault (tstate=0x7fffa0066760, frame=0x7ffff7fe53a8, throwflag=0)
        at Python/generated_cases.c.h:2655
    #4  0x00007ffff25db080 in _PyEval_EvalFrame (tstate=0x7fffa0066760, frame=0x7ffff7fe5020, throwflag=0)
        at ./Include/internal/pycore_ceval.h:113
    #5  0x00007ffff25f5794 in _PyEval_Vector (tstate=0x7fffa0066760, func=0x7fffa4c1d440, locals=0x0, args=0x7fffb2b8d618, argcount=1, 
        kwnames=0x0) at Python/ceval.c:1639
    #6  0x00007ffff24aa899 in _PyFunction_Vectorcall (func=0x7fffa4c1d440, stack=0x7fffb2b8d618, nargsf=1, kwnames=0x0)
        at Objects/call.c:413
    #7  0x00007ffff24aa484 in _PyVectorcall_Call (tstate=0x7fffa0066760, func=0x7ffff24aa822 <_PyFunction_Vectorcall>, 
        callable=0x7fffa4c1d440, tuple=0x7fffb2b8d600, kwargs=0x0) at Objects/call.c:273
    #8  0x00007ffff24aa6cb in _PyObject_Call (tstate=0x7fffa0066760, callable=0x7fffa4c1d440, args=0x7fffb2b8d600, kwargs=0x0)
        at Objects/call.c:348
    #9  0x00007ffff24aaa67 in PyObject_CallObject (callable=0x7fffa4c1d440, args=0x7fffb2b8d600) at Objects/call.c:472
    Case3
    *Ensure on sub interpreter: 0x7fff68000cf0
    *[ 14:09:29:850]PyThreadState:0x7fff68066760
    *Ensure on sub interpreter: 0x7fff50000cf0
    *[ 14:09:29:851]PyThreadState:0x7fff50066760
    
    
    _PyObject_VectorcallTstate (tstate=0x7fff68066760, callable=0x7fffcb36c3b0, args=0x7ffff7e1d398, nargsf=9223372036854775810, 
        kwnames=0x0) at ./Include/internal/pycore_call.h:138
    138     PyTypeObject *tp = Py_TYPE(callable);
    (gdb) bt
    #0  _PyObject_VectorcallTstate (tstate=0x7fff68066760, callable=0x7fffcb36c3b0, args=0x7ffff7e1d398, nargsf=9223372036854775810, 
        kwnames=0x0) at ./Include/internal/pycore_call.h:138
    #1  0x00007ffff24aa67b in PyObject_Vectorcall (callable=0x7fffcb36c3b0, args=0x7ffff7e1d398, nargsf=9223372036854775810, kwnames=0x0)
        at Objects/call.c:327
    #2  0x00007ffff25ed14c in _PyEval_EvalFrameDefault (tstate=0x7fff68066760, frame=0x7ffff7e1d1f0, throwflag=0)
        at Python/generated_cases.c.h:4265
    #3  0x00007ffff25db080 in _PyEval_EvalFrame (tstate=0x7fff68066760, frame=0x7ffff7e1d020, throwflag=0)
        at ./Include/internal/pycore_ceval.h:113
    #4  0x00007ffff25f5794 in _PyEval_Vector (tstate=0x7fff68066760, func=0x7fffcb155440, locals=0x0, args=0x7fff4ffcd618, argcount=1, 
        kwnames=0x0) at Python/ceval.c:1639
    #5  0x00007ffff24aa899 in _PyFunction_Vectorcall (func=0x7fffcb155440, stack=0x7fff4ffcd618, nargsf=1, kwnames=0x0)
        at Objects/call.c:413
    #6  0x00007ffff24aa484 in _PyVectorcall_Call (tstate=0x7fff68066760, func=0x7ffff24aa822 <_PyFunction_Vectorcall>, 
        callable=0x7fffcb155440, tuple=0x7fff4ffcd600, kwargs=0x0) at Objects/call.c:273
    #7  0x00007ffff24aa6cb in _PyObject_Call (tstate=0x7fff68066760, callable=0x7fffcb155440, args=0x7fff4ffcd600, kwargs=0x0)
        at Objects/call.c:348
    #8  0x00007ffff24aaa67 in PyObject_CallObject (callable=0x7fffcb155440, args=0x7fff4ffcd600) at Objects/call.c:472
    Case4
    *Ensure on sub interpreter: 0x7fff94000cf0
    *[14:13:13:655]PyThreadState:0x7fff94066760
    *Ensure on sub interpreter: 0x7fff90000cf0
    *[14:13:13:655]PyThreadState:0x7fff90066760
    
    ======= Backtrace: =========
    /lib64/libc.so.6(+0x81329)[0x7ffff1946329]
    /lib/libpython3.13.so.1.0(+0x16e471)[0x7ffff250f471]
    /lib/libpython3.13.so.1.0(PyMem_RawFree+0x46)[0x7ffff2510557]
    /lib/libpython3.13.so.1.0(+0x170b93)[0x7ffff2511b93]
    /lib/libpython3.13.so.1.0(PyObject_Free+0x46)[0x7ffff25109ed]
    /lib/libpython3.13.so.1.0(+0x1b5009)[0x7ffff2556009]
    /lib/libpython3.13.so.1.0(_Py_Dealloc+0x29)[0x7ffff250f265]
    /lib/libpython3.13.so.1.0(+0x17e4b8)[0x7ffff251f4b8]
    /lib/libpython3.13.so.1.0(+0x17ee43)[0x7ffff251fe43]
    /lib/libpython3.13.so.1.0(_Py_Dealloc+0x29)[0x7ffff250f265]
    /lib/libpython3.13.so.1.0(+0x10d08f)[0x7ffff24ae08f]
    /lib/libpython3.13.so.1.0(+0x11167f)[0x7ffff24b267f]
    /lib/libpython3.13.so.1.0(_Py_Dealloc+0x29)[0x7ffff250f265]
    /lib/libpython3.13.so.1.0(+0x136208)[0x7ffff24d7208]
    /lib/libpython3.13.so.1.0(_Py_Dealloc+0x29)[0x7ffff250f265]
    /lib/libpython3.13.so.1.0(+0x29864d)[0x7ffff263964d]
    /lib/libpython3.13.so.1.0(+0x297f8a)[0x7ffff2638f8a]
    /lib/libpython3.13.so.1.0(+0x298514)[0x7ffff2639514]
    /lib/libpython3.13.so.1.0(+0x253fe8)[0x7ffff25f4fe8]
    /lib/libpython3.13.so.1.0(+0x254082)[0x7ffff25f5082]
    /lib/libpython3.13.so.1.0(_PyEval_EvalFrameDefault+0x4d71)[0x7ffff25e101f]
    /lib/libpython3.13.so.1.0(+0x23a080)[0x7ffff25db080]
    /lib/libpython3.13.so.1.0(+0x254794)[0x7ffff25f5794]
    /lib/libpython3.13.so.1.0(+0x109899)[0x7ffff24aa899]
    /lib/libpython3.13.so.1.0(+0x109484)[0x7ffff24aa484]
    /lib/libpython3.13.so.1.0(+0x1096cb)[0x7ffff24aa6cb]
    /lib/libpython3.13.so.1.0(PyObject_CallObject+0xa2)[0x7ffff24aaa67]
    
    (gdb) bt
    #0  0x00007ffff18fb387 in raise () from /lib64/libc.so.6
    #1  0x00007ffff18fca78 in abort () from /lib64/libc.so.6
    #2  0x00007ffff193df67 in __libc_message () from /lib64/libc.so.6
    #3  0x00007ffff1946329 in _int_free () from /lib64/libc.so.6
    #4  0x00007ffff250f471 in _PyMem_RawFree (_unused_ctx=0x0, ptr=0x7fffb1200870) at Objects/obmalloc.c:79
    #5  0x00007ffff2510557 in PyMem_RawFree (ptr=0x7fffb1200870) at Objects/obmalloc.c:818
    #6  0x00007ffff2511b93 in _PyObject_Free (ctx=0x0, p=0x7fffb1200870) at Objects/obmalloc.c:2023
    #7  0x00007ffff25109ed in PyObject_Free (ptr=0x7fffb1200870) at Objects/obmalloc.c:963
    #8  0x00007ffff2556009 in unicode_dealloc (unicode=0x7fffb1200870) at Objects/unicodeobject.c:1599
    #9  0x00007ffff250f265 in _Py_Dealloc (op=0x7fffb1200870) at Objects/object.c:2858
    #10 0x00007ffff251f4b8 in Py_DECREF (op=<optimized out>) at ./Include/object.h:870
    #11 Py_XDECREF (op=0x7fffb1200870) at ./Include/object.h:963
    #12 0x00007ffff251fe43 in tupledealloc (op=0x7fffb139f6a0) at Objects/tupleobject.c:208
    #13 0x00007ffff250f265 in _Py_Dealloc (op=0x7fffb139f6a0) at Objects/object.c:2858
    #14 0x00007ffff24ae08f in Py_DECREF (op=<optimized out>) at ./Include/object.h:870
    #15 Py_XDECREF (op=0x7fffb139f6a0) at ./Include/object.h:963
    #16 0x00007ffff24b267f in code_dealloc (co=0x7fffb1459fb0) at Objects/codeobject.c:1723
    #17 0x00007ffff250f265 in _Py_Dealloc (op=0x7fffb1459fb0) at Objects/object.c:2858
    #18 0x00007ffff24d7208 in Py_DECREF (op=<optimized out>) at ./Include/object.h:870
    #19 func_dealloc (op=0x7fffb04b9120) at Objects/funcobject.c:929
    #20 0x00007ffff250f265 in _Py_Dealloc (op=0x7fffb04b9120) at Objects/object.c:2858
    #21 0x00007ffff263964d in Py_DECREF (op=<optimized out>) at ./Include/object.h:870
    #22 Py_XDECREF.part.6 (op=0x7fffb04b9120) at ./Include/object.h:963
    #23 0x00007ffff2638f8a in Py_XDECREF (op=0x7fffb04b9120) at ./Include/object.h:962
    #24 0x00007ffff2639514 in _PyFrame_ClearExceptCode (frame=0x7ffff7e2d378) at Python/frame.c:140
    #25 0x00007ffff25f4fe8 in clear_thread_frame (tstate=0x7fff90066760, frame=0x7ffff7e2d378) at Python/ceval.c:1503
    #26 0x00007ffff25f5082 in _PyEval_FrameClearAndPop (tstate=0x7fff90066760, frame=0x7ffff7e2d378) at Python/ceval.c:1530
    #27 0x00007ffff25e101f in _PyEval_EvalFrameDefault (tstate=0x7fff90066760, frame=0x7ffff7e2d378, throwflag=0)
        at Python/generated_cases.c.h:1148
    #28 0x00007ffff25db080 in _PyEval_EvalFrame (tstate=0x7fff90066760, frame=0x7ffff7e2d020, throwflag=0)
        at ./Include/internal/pycore_ceval.h:113
    #29 0x00007ffff25f5794 in _PyEval_Vector (tstate=0x7fff90066760, func=0x7fffb1229440, locals=0x0, args=0x7fffb0491618, argcount=1, 
        kwnames=0x0) at Python/ceval.c:1639
    #30 0x00007ffff24aa899 in _PyFunction_Vectorcall (func=0x7fffb1229440, stack=0x7fffb0491618, nargsf=1, kwnames=0x0)
        at Objects/call.c:413
    #31 0x00007ffff24aa484 in _PyVectorcall_Call (tstate=0x7fff90066760, func=0x7ffff24aa822 <_PyFunction_Vectorcall>, 
        callable=0x7fffb1229440, tuple=0x7fffb0491600, kwargs=0x0) at Objects/call.c:273
    #32 0x00007ffff24aa6cb in _PyObject_Call (tstate=0x7fff90066760, callable=0x7fffb1229440, args=0x7fffb0491600, kwargs=0x0)
        at Objects/call.c:348
    #33 0x00007ffff24aaa67 in PyObject_CallObject (callable=0x7fffb1229440, args=0x7fffb0491600) at Objects/call.c:472
  2. williamhu020 commented on Nov 7, 2023

    @williamhu020
    Author

    Compile with

    --disable-gil

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions