Python: Ejecutando Valgrind en una extensión en C

Así es como uso Valgrind para detectar errores de memoria en pygit2.

Glibc con símbolos de depuración

El primer problema que encontré fue que Valgrind se negaba a funcionar si Glibc no estaba compilado con símbolos de depuración.

Esto es lo que hice en mi notebook con Gentoo: edité el archivo /etc/portage/make.conf para habilitar la opción splitdebug:

 
/etc/portage/make.conf
FEATURES=”${FEATURES} splitdebug compressdebug -nostrip”
 

Luego reinstalé glibc:

 
$ sudo emerge glibc
 
Después comenté la opción splitdebug para evitar que otros paquetes se instalaran con símbolos de depuración (probablemente haya una forma mejor de hacerlo).

Valgrind 3.7

El gran problema es que ejecutar Valgrind con una extensión C de Python genera muchos falsos positivos. Hay varias cosas que debes hacer para evitarlos.

La primera es usar la última versión de Valgrind 3.7, debido a un bug presente en la versión 3.6 que olvidé mencionar.

Python, compilando para un depurador de memoria

Ahora, necesitas instalar una versión de Python que se use con Valgrind:

$ ./configure –prefix=/…/Python-3.7.4-valgrind –without-pymalloc –with-pydebug –with-valgrind
$ make
$ make install

Instalar pytest y pygit2

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

$ /…/Python-3.7.4-valgrind/bin/python3 get-pip.py
$ /…/Python-3.7.4-valgrind/bin/pip install pytest
[…]
$ /…/Python-3.7.4-valgrind/bin/python3 setup.py install

El archivo de supresión

Ahora necesitas usar el archivo de supresión que encontrarás en los fuentes de Python, en Misc/valgrind-python.supp. Así es como ejecuto los tests unitarios en pygit2 para encontrar problemas:

 
$ valgrind –trace-children=yes –suppressions=valgrind-python.supp \
/…/Python-3.7.4-valgrind/bin/pytest
 

¡Eso es todo!