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 wtest.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? 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.
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ż:
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