Python: Ejecutando Valgrind en una extensión en C

Si estás desarrollando una extensión en C para Python y quieres detectar fugas de memoria u otros errores, puedes usar Valgrind. Sin embargo, Python por defecto hace muchas asignaciones y liberaciones de memoria que generan falsos positivos en Valgrind.

Problema típico

Ejecutar:

valgrind python mi_script.py
produce muchos mensajes de “memoria perdida” que no son realmente errores en tu extensión, sino en el intérprete de Python.

Solución: usar --trace-children=yes y PYTHONMALLOC

  1. Exporta la variable de entorno para que Python use malloc estándar:

 
export PYTHONMALLOC=malloc
  1. Ejecuta Valgrind con las opciones:

 
valgrind –tool=memcheck –leak-check=full \
–show-reachable=yes –track-origins=yes \
python mi_script.py
  • --leak-check=full → informa todas las fugas de memoria

  • --show-reachable=yes → muestra memoria que sigue siendo accesible al terminar

  • --track-origins=yes → ayuda a encontrar dónde se asignó la memoria

Sugerencias adicionales

  • Si tu extensión C se llama mi_modulo.so, asegúrate de importarla primero en el script Python para que Valgrind la analice correctamente.

  • Los mensajes de Valgrind relacionados con internals de Python pueden ignorarse; concéntrate en las llamadas hechas por tu código C.

  • Puedes combinarlo con gdb si quieres depurar fallos de segmentación.