Jak używać valgrind z Pythonem?

Próbuję sprawdzić rozszerzenie Pythona C, które piszę, ale mam problem z ustawieniem valgrind do pracy z Pythonem. Byłbym wdzięczny za radę. Dla kontekstu jest to Ubuntu 13.10, python 2.7.5+ i valgrind 3.8.1.

Zgodnie z zaleceniem od Readme.valgrind zrobiłem następujące rzeczy.

1) Pobrano źródło Pythona z

sudo apt-get build-dep python2.7
apt-get source python2.7

2) zastosowano łatkę kodu, czyli " Uncomment Py_USING_MEMORY_DEBUGGER in Objects / obmalloc.c".

3) Zastosowałem łatkę suppression, czyli " Uncomment the lines in Misc / valgrind-python.supp, które tłumią ostrzeżenia dla PyObject_Free i PyObject_Realloc "

4) skompilowany python z

./configure --prefix=/home/dejan/workspace/python --without-pymalloc
make -j4 install

Zauważ, że zrobiłem 2 i 3, podczas gdy README.valgrind kazał zrobić 2 lub 3... więcej nie zaszkodzi.

Przetestujmy to na przykładowym kodzie Pythona w test.py
print "Test"

Uruchomimy valgrind na Pythonie za pomocą tego skryptu

valgrind --tool=memcheck --leak-check=full --suppressions=python2.7-2.7.5/Misc/valgrind-python.supp bin/python test.py

Niespodziewanie, wciąż jest mnóstwo raportów z valgrind, przy czym pierwszy z nich jest (i wiele kolejnych)

==27944== HEAP SUMMARY:
==27944==     in use at exit: 857,932 bytes in 5,144 blocks  
==27944==   total heap usage: 22,766 allocs, 17,622 frees, 4,276,934 bytes allocated
==27944== 
==27944== 38 bytes in 1 blocks are possibly lost in loss record 24 of 1,343
==27944==    at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27944==    by 0x46B8DD: PyString_FromString (stringobject.c:143)
==27944==    by 0x439631: PyFile_FromFile (fileobject.c:157)
==27944==    by 0x4E9B4A: _PySys_Init (sysmodule.c:1383)
==27944==    by 0x4E29E9: Py_InitializeEx (pythonrun.c:222)
==27944==    by 0x4154B4: Py_Main (main.c:546)
==27944==    by 0x577DDE4: (below main) (libc-start.c:260)
Czy robię coś nie tak? Czy istnieje sposób, aby valgrind skrypt Pythona, który nie przecieka i uzyskać czyste wyjście valgrind?
Author: Dejan Jovanović, 2013-11-21

2 answers

Znalazłem odpowiedź Tutaj .

Python musi być również skompilowany w trybie debugowania, tj.

./configure --prefix=/home/dejan/workspace/python --without-pymalloc --with-pydebug --with-valgrind

Dodatkowo numpy posiada plik supresion , który usuwa dodatkowe Ostrzeżenia valgrind.

 38
Author: Dejan Jovanović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-20 01:35:06

Od wersji Pythona 3.6 istnieje zmienna środowiskowa PYTHONMALLOC, która jest dostępna w release buildach, bez konieczności rekompilacji.

PYTHONMALLOC=malloc python3 foobar.py

To wyłączy pymalloc i po prostu użyje libc malloc bezpośrednio, czyniąc go przyjaznym dla valgrind. Jest to odpowiednik --without-pymalloc (i jest tak samo wolny)

Jeśli valgrind jest zbyt wolny, inne wartości mogą być pomocne. PYTHONMALLOC=debug i PYTHONMALLOC=malloc_debug dodają Hooki debugowania odpowiednio do alokatorów domyślnych i libc. Ich efekty, z docs:

  • nowo przydzielona pamięć jest wypełniona bajtem 0xCB
  • zwolniona pamięć jest wypełniona bajtem 0xDB
  • wykrywa naruszenia API alokatora pamięci Pythona. Na przykład, PyObject_Free () wywołało blok pamięci przydzielony przez PyMem_Malloc ().
  • wykrywanie zapisów przed rozpoczęciem bufora (niedopełnienia bufora)
  • wykrywanie zapisów po końcu bufora (przepełnienia bufora)
  • sprawdź, czy GIL jest utrzymywany, gdy funkcje alokatora Wywołane są domeny PYMEM_DOMAIN_OBJ (ex: PyObject_Malloc ()) i PYMEM_DOMAIN_MEM (ex: PyMem_Malloc ()).

To wychwyci niektóre niezaliczone odczyty, niektóre użycie po free, niektóre bufory pod / przepełnienia itp., ale nie zgłosi wycieków i nie dotknie pamięci, która nie jest przydzielona przez Pythona (podczas korzystania z glibc, zmienne środowiskowe MALLOC_PERTURB_ i MALLOC_CHECK_ mogą tam pomóc)

Zobacz też:

 12
Author: dequis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-21 23:17:01