Skip to content

PYTHONMALLOCSTATS=1 fails with fatal error at Python exit #111499

@vstinner

Description

@vstinner
Member

Py_FinalizeEx() calls _PyObject_DebugMallocStats() which calls indirectly _PyInterpreterState_GET(). Problem: at this point, there is no "interpreter" anymore, and so _PyInterpreterState_GET() fails with a fatal error.

It's a regression introduced by commit df3173d. Python 3.12 is also affected.

Reproducer:

$ PYTHONMALLOCSTATS=1 ./python -c pass
Small block threshold = 512, in 32 size classes.
(...)
Total                              =              262,144

Small block threshold = 512, in 32 size classes.
(...)
Total                              =              655,360

Fatal Python error: _PyInterpreterState_GET: the function must be called with the GIL held, after Python initialization and before Python finalization, but the GIL is released (the current Python thread state is NULL)
Python runtime state: finalizing (tstate=0x0000000000ae7550)

Abandon (core dumped)

cc @ericsnowcurrently

Linked PRs

Activity

added
3.12only security fixes
3.13bugs and security fixes
on Oct 30, 2023
vstinner

vstinner commented on Dec 20, 2023

@vstinner
MemberAuthor

Apparently, nobody cares nor uses this feature which has no test. I just close the issue. I don't have the bandwidth to work on a fix.

ShahriyarR

ShahriyarR commented on Dec 26, 2023

@ShahriyarR

Not sure if this is the related information or not, added here for future reference.
I got the same error with Python 3.12 while doing some tests.
Compiled Python as described here:
https://devguide.python.org/

Test:

$ gdb python

(gdb) break main
(gdb) call PyLong_FromLong(22222)
Fatal Python error: _PyInterpreterState_GET: the function must be called with the GIL held, after Python initialization and before Python finalization, but the GIL is released (the current Python thread state is NULL)
Python runtime state: unknown

Basically, the fix is calling Py_Initialize() before:

(gdb) call Py_Initialize()

The difference is, in Python 3.9 I got sissegv instead of this Fatal error.

devdanzin

devdanzin commented on Jun 4, 2024

@devdanzin
Contributor

Apparently, nobody cares nor uses this feature which has no test. I just close the issue. I don't have the bandwidth to work on a fix.

I'm trying to add a test as part of #120006, but having segfaults (Linux) or non-zero process exit codes (Windows) is kinda getting in the way. Could this issue be reopened so other devs can attempt to solve it?

It seems the error has changed between versions:

Python 3.12.3 (Linux), non-debug build:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ac632a in _PyInterpreterState_GET () at ./Include/internal/pycore_pystate.h:133
133         return tstate->interp;

Python 3.14.0a0 (heads/main:6e012ced6c) (Linux), non-debug build:

Program received signal SIGSEGV, Segmentation fault.
0x00005555556b0e3c in get_state () at Objects/obmalloc.c:1368
1368        return interp->obmalloc;

The fix might be as simple as (pardon my C):

diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 4fe195b631..04e24bd407 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -3266,6 +3266,15 @@ py_mimalloc_print_stats(FILE *out)
 static void
 pymalloc_print_stats(FILE *out)
 {
+    PyThreadState *tstate = _PyThreadState_GET();
+    if (tstate == NULL || tstate->interp == NULL) {
+        return;
+    }
+
+    PyInterpreterState *interp = _PyInterpreterState_GET();
+    if (interp == NULL || interp->obmalloc == NULL) {
+        return;
+    }
     OMState *state = get_state();

     uint i;
added 2 commits that reference this issue on Jun 4, 2024
vstinner

vstinner commented on Jun 4, 2024

@vstinner
MemberAuthor

I wrote PR gh-120021 to fix the issue.

added a commit that references this issue on Jun 4, 2024
5a1205b

9 remaining items

Loading
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

    3.12only security fixes3.13bugs and security fixestopic-subinterpreterstype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @vstinner@ericsnowcurrently@ShahriyarR@devdanzin

        Issue actions

          PYTHONMALLOCSTATS=1 fails with fatal error at Python exit · Issue #111499 · python/cpython