pybind / pybind/pybind11

[MAINT] CI / 🐍 3.9-dbg (deadsnakes) • Valgrind • x64: invalid file descriptor # in syscall close()

Open
#4,889 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C++
Stars
18k
Forks
2.3k
Avg merge
5d 17h
Merged PRs (30d)
10

Description

Edit 2026-05-02: PR #6052 removed the companion job


Help is needed to diagnose and fix leak diagnostics that suddenly appeared due to unknown changes in the environment ("bit rot").

The log files are permanently archived here: https://github.com/rwgk/issues/tree/master/pybind11/issue_4889

Idea just in case nobody gets to this for a while: Simply try again, just in case the root cause is fixed upstream.

Problem:

============================= test session starts ==============================
platform linux -- Python 3.9.18, pytest-7.2.0, pluggy-1.3.0
C++ Info: 9.4.0 C++17 __pybind11_internals_v4_gcc_libstdcpp_cxxabi1013__ PYBIND11_SIMPLE_GIL_MANAGEMENT=False
rootdir: /home/runner/work/pybind11/pybind11/tests, configfile: pytest.ini
plugins: timeout-2.2.0
timeout: 300.0s
timeout method: signal
timeout func_only: False
collected [85](https://github.com/pybind/pybind11/actions/runs/6526472350/job/17720263281#step:13:86)7 items

--[87](https://github.com/pybind/pybind11/actions/runs/6526472350/job/17720263281#step:13:88)78-- warning: evaluate_Dwarf3_Expr: unhandled DW_OP_ 0xf3
...
../../tests/test_factory_constructors.py ...............                 [ 44%]
==[92](https://github.com/pybind/pybind11/actions/runs/6526472350/job/17720263281#step:13:93)18== Warning: invalid file descriptor 65524 in syscall close()
==9218== Warning: invalid file descriptor 65525 in syscall close()
==9218== Warning: invalid file descriptor 65526 in syscall close()
==9218== Warning: invalid file descriptor 65527 in syscall close()
==9218==    Use --log-fd=<number> to select an alternative log fd.
==9218== Warning: invalid file descriptor 65528 in syscall close()
==9218== Warning: invalid file descriptor 65529 in syscall close()
==9219== Warning: invalid file descriptor 65524 in syscall close()
==9219== Warning: invalid file descriptor 65525 in syscall close()
==9219== Warning: invalid file descriptor 65526 in syscall close()
==9219== Warning: invalid file descriptor 65527 in syscall close()
==9219==    Use --log-fd=<number> to select an alternative log fd.
==9219== Warning: invalid file descriptor 65528 in syscall close()
==9219== Warning: invalid file descriptor 65529 in syscall close()
...
=========================== short test summary info ============================
SKIPPED [1] ../../tests/test_callbacks.py:213: Current PYBIND11_INTERNALS_VERSION too low
SKIPPED [1] ../../tests/test_stl.py:147: no <experimental/optional>
SKIPPED [1] ../../tests/test_stl.py:179: no <boost/optional>
================== 854 passed, 3 skipped in 470.23s (0:07:50) ==================
==8778== 
==8778== HEAP SUMMARY:
==8778==     in use at exit: 5,462,456 bytes in 33,183 blocks
==8778==   total heap usage: 3,241,517 allocs, 3,208,334 frees, 322,998,060 bytes allocated
==8778== 
==8778== 64 bytes in 1 blocks are indirectly lost in loss record 6,168 of 10,745
==8778==    at 0x483B7FB: malloc (vg_replace_malloc.c:307)
==8778==    by 0x46FC97: _PyMem_RawMalloc (obmalloc.c:99)
==8778==    by 0x471298: PyObject_Malloc (obmalloc.c:685)
==8778==    by 0x54A083: _PyObject_GC_Alloc (gcmodule.c:2267)
==8778==    by 0x54AE87: _PyObject_GC_Malloc (gcmodule.c:2294)
==8778==    by 0x54AF42: _PyObject_GC_NewVar (gcmodule.c:2323)
==8778==    by 0x47D87A: tuple_alloc (tupleobject.c:92)
==8778==    by 0x47E5D6: PyTuple_New (tupleobject.c:110)
==8778==    by 0x4E7B2F: _PyEval_EvalFrameDefault (ceval.c:2743)
==8778==    by 0x4EE1A7: _PyEval_EvalFrame (pycore_ceval.h:40)
==8778==    by 0x4EE1A7: _PyEval_EvalCode (ceval.c:4329)
==8778==    by 0x4334B0: _PyFunction_Vectorcall (call.c:396)
==8778==    by 0x4EB835: _PyObject_VectorcallTstate (abstract.h:118)
==8778==    by 0x4EB835: PyObject_Vectorcall (abstract.h:127)
==8778==    by 0x4EB835: call_function (ceval.c:5077)
==8778==    by 0x4EB835: _PyEval_EvalFrameDefault (ceval.c:3506)
==8778== 
{
   <insert_a_suppression_name_here>
   Memcheck:Leak
   match-leak-kinds: indirect
   fun:malloc
   fun:_PyMem_RawMalloc
   fun:PyObject_Malloc
   fun:_PyObject_GC_Alloc
   fun:_PyObject_GC_Malloc
   fun:_PyObject_GC_NewVar
   fun:tuple_alloc
   fun:PyTuple_New
   fun:_PyEval_EvalFrameDefault
   fun:_PyEval_EvalFrame
   fun:_PyEval_EvalCode
   fun:_PyFunction_Vectorcall
   fun:_PyObject_VectorcallTstate
   fun:PyObject_Vectorcall
   fun:call_function
   fun:_PyEval_EvalFrameDefault
}
==8778== LEAK SUMMARY:
==8778==    definitely lost: 0 bytes in 0 blocks
==8778==    indirectly lost: 64 bytes in 1 blocks
==8778==      possibly lost: 4,563,363 bytes in 27,266 blocks
==8778==    still reachable: 745,477 bytes in 3,667 blocks
==8778==         suppressed: 153,552 bytes in 2,249 blocks
==8778== Reachable blocks (those to which a pointer was found) are not shown.
==8778== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==8778== 
==8778== For lists of detected and suppressed errors, rerun with: -s
==8778== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 28 from 27)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by comparing the archived logs from the last successful run and the first failing run, then retry the affected CI job as suggested. Determine whether the invalid file-descriptor and Valgrind leak diagnostics are environmental or project failures; done means the job no longer reports an unresolved failure or its environment-specific cause is documented.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, github-actions, python
Domain
ci-cd, devops, testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.