Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memory leaks when embedded interpreter is reinitialized #65586

Closed
EvgeniyStepanov mannequin opened this issue Apr 29, 2014 · 7 comments
Closed

Memory leaks when embedded interpreter is reinitialized #65586

EvgeniyStepanov mannequin opened this issue Apr 29, 2014 · 7 comments
Labels
extension-modules C modules in the Modules dir interpreter-core (Objects, Python, Grammar, and Parser dirs)

Comments

@EvgeniyStepanov
Copy link
Mannequin

EvgeniyStepanov mannequin commented Apr 29, 2014

BPO 21387
Nosy @ncoghlan, @pitrou, @vstinner
Superseder
  • bpo-1635741: Py_Finalize() doesn't clear all Python objects at exit
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2019-10-23.00:16:52.538>
    created_at = <Date 2014-04-29.11:55:37.721>
    labels = ['extension-modules', 'interpreter-core']
    title = 'Memory leaks when embedded interpreter is reinitialized'
    updated_at = <Date 2019-10-23.00:16:52.537>
    user = 'https://bugs.python.org/EvgeniyStepanov'

    bugs.python.org fields:

    activity = <Date 2019-10-23.00:16:52.537>
    actor = 'vstinner'
    assignee = 'none'
    closed = True
    closed_date = <Date 2019-10-23.00:16:52.538>
    closer = 'vstinner'
    components = ['Extension Modules', 'Interpreter Core']
    creation = <Date 2014-04-29.11:55:37.721>
    creator = 'Evgeniy.Stepanov'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 21387
    keywords = []
    message_count = 7.0
    messages = ['217513', '217535', '217540', '217541', '218517', '236023', '355192']
    nosy_count = 4.0
    nosy_names = ['ncoghlan', 'pitrou', 'vstinner', 'Evgeniy.Stepanov']
    pr_nums = []
    priority = 'normal'
    resolution = 'duplicate'
    stage = 'resolved'
    status = 'closed'
    superseder = '1635741'
    type = None
    url = 'https://bugs.python.org/issue21387'
    versions = ['Python 2.7']

    @EvgeniyStepanov
    Copy link
    Mannequin Author

    EvgeniyStepanov mannequin commented Apr 29, 2014

    Following https://docs.python.org/2/c-api/init.html#Py_Finalize, I'm reinitializing embedded python interpreter multiple time in one process.

    #include <Python.h>
    
    void f() {
      Py_Initialize();
      PyRun_SimpleString("from time import time,ctime\n"
          "import datetime\n"
          "print 'Today is',ctime(time())\n");
      Py_Finalize();
    }
    
    int main(void) {
      for (int i = 0; i < 30; ++i)
        f();
      return 0;
    }

    I see 2 sources of memory leaks:

    • _once_registry is never teared down.

    ==20144==ERROR: LeakSanitizer: detected memory leaks

    Direct leak of 8120 byte(s) in 29 object(s) allocated from:
    #0 0x4a3e38 in malloc /code/llvm/build0/../projects/compiler-rt/lib/asan/asan_malloc_linux.cc:75
    #1 0x4e1524 in _PyObject_GC_Malloc build/Python-2.7.6/Modules/gcmodule.c:1499
    #2 0x4e16ff in _PyObject_GC_New build/Python-2.7.6/Modules/gcmodule.c:1521
    #3 0x57e581 in PyDict_New build/Python-2.7.6/Objects/dictobject.c:277
    #4 0x62b9a7 in _PyWarnings_Init build/Python-2.7.6/Python/_warnings.c:898
    #5 0x4c2985 in Py_InitializeEx build/Python-2.7.6/Python/pythonrun.c:254
    #6 0x4c22a4 in f() build/Python-2.7.6/1.cc:4
    #7 0x4c22a4 in main build/Python-2.7.6/1.cc:14

    • datetime module creates a bunch of objects in its initialization function and never destroys them

    Direct leak of 8120 byte(s) in 29 object(s) allocated from:
    #0 0x4a3e38 in malloc /code/llvm/build0/../projects/compiler-rt/lib/asan/asan_malloc_linux.cc:75
    #1 0x4e1524 in _PyObject_GC_Malloc build/Python-2.7.6/Modules/gcmodule.c:1499
    #2 0x4e16ff in _PyObject_GC_New build/Python-2.7.6/Modules/gcmodule.c:1521
    #3 0x57e581 in PyDict_New build/Python-2.7.6/Objects/dictobject.c:277
    #4 0x6cb976 in PyErr_NewException build/Python-2.7.6/Python/errors.c:577
    #5 0x757227 in initzipimport build/Python-2.7.6/./Modules/zipimport.c:1235
    #6 0x6e5797 in init_builtin build/Python-2.7.6/Python/import.c:1999
    #7 0x6e158d in load_module build/Python-2.7.6/Python/import.c:1928
    #8 0x6e6919 in import_submodule build/Python-2.7.6/Python/import.c:2700
    #9 0x6e5ac7 in load_next build/Python-2.7.6/Python/import.c:2515
    #10 0x6e036c in import_module_level build/Python-2.7.6/Python/import.c:2224
    #11 0x6e036c in PyImport_ImportModuleLevel build/Python-2.7.6/Python/import.c:2288
    #12 0x671e6f in builtin___import__ build/Python-2.7.6/Python/bltinmodule.c:49
    #13 0x502b40 in PyObject_Call build/Python-2.7.6/Objects/abstract.c:2529
    #14 0x502e82 in call_function_tail build/Python-2.7.6/Objects/abstract.c:2561
    #15 0x502e82 in PyObject_CallFunction build/Python-2.7.6/Objects/abstract.c:2585
    #16 0x6df7b0 in PyImport_Import build/Python-2.7.6/Python/import.c:2886
    #17 0x6db9a7 in PyImport_ImportModule build/Python-2.7.6/Python/import.c:2129
    #18 0x6db9a7 in _PyImportHooks_Init build/Python-2.7.6/Python/import.c:239
    #19 0x4c287f in Py_InitializeEx build/Python-2.7.6/Python/pythonrun.c:248
    #20 0x4c22a4 in f() build/Python-2.7.6/1.cc:4
    #21 0x4c22a4 in main build/Python-2.7.6/1.cc:14

    @EvgeniyStepanov EvgeniyStepanov mannequin added extension-modules C modules in the Modules dir interpreter-core (Objects, Python, Grammar, and Parser dirs) labels Apr 29, 2014
    @pitrou
    Copy link
    Member

    pitrou commented Apr 29, 2014

    Thanks. It would be nice if you could try the same with Python 3.4, or the development version.

    @skrah
    Copy link
    Mannequin

    skrah mannequin commented Apr 29, 2014

    Are we fixing these on a case by case basis or is it hopeless (msg146615)?

    @pitrou
    Copy link
    Member

    pitrou commented Apr 29, 2014

    I think fixing on a case by case is fine.

    @skrah
    Copy link
    Mannequin

    skrah mannequin commented May 14, 2014

    I've run Evgeniy's example under Valgrind and changed it to import
    various C extensions. Unfortunately they all leak more or less, so
    perhaps we can revisit this when (if?) the PEP-3121 and PEP-384
    changes have been implemented.

    @vstinner
    Copy link
    Member

    Duplicate of bpo-1635741.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    extension-modules C modules in the Modules dir interpreter-core (Objects, Python, Grammar, and Parser dirs)
    Projects
    None yet
    Development

    No branches or pull requests

    3 participants