2013-11-21 3 views
33

Я пытаюсь memcheck расширение Python C, которое я пишу, но у меня возникли проблемы с настройкой valgrind для работы с python. Я бы очень признателен за некоторые советы. Для контекста это Ubuntu 13.10, python 2.7.5+ и valgrind 3.8.1.Как использовать valgrind с python?

Согласно рекомендации от Readme.valgrind Я сделал следующее.

1) Скачано источник питона с

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

2) Прикладной код исправления, то есть "Раскоментируйте Py_USING_MEMORY_DEBUGGER в объектах/obmalloc.c".

3) Прикладной на подавление патч, т.е. "раскомментировать строки в Misc/VALGRIND-python.supp, подавляющие предупреждения для PyObject_Free и PyObject_Realloc"

4) Составитель питона с

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

Примечание что я сделал и 2 и 3, а README.valgrind говорит, чтобы сделать 2 или 3 ... больше не может повредить.

Теперь, давайте проверим это на какой-то образец кода Python в перспективе Valgrind test.py

print "Test" 

Давайте на питоне с этим скриптом

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

Неожиданно оказалось, есть еще нагрузки докладов Valgrind, с первый (и многие другие последующие)

==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) 

A Я делаю что-то не так? Есть ли способ угадать сценарий python, который не течет и получить чистый результат valgrind?

+0

Вы видели http://stackoverflow.com/questions/1519276/is-it-normal-that-running-python-under-valgrind-shows-many-errors- с-память? rq = 1 – VooDooNOFX

+0

@VooDooNOFX Я искал stackoverflow и дальше, и все ответы в основном говорят, что я должен делать то, что я описал, я сделал - скомпилировал python или использовал supress. Это избавляет от проблемных отчетов с настраиваемым распределением, таких как PyObject_Free (это тот, о котором вы связали), но отчеты, которые я получаю, не такие. –

+0

Чтобы проверить расширение c, я скомпилировал debug python с инструкциями, приведенными в ответе. И я перестраиваю расширение с помощью отладочной версии python, и он получил результат сбоя. Я использовал расширение setuptools для расширения, и он хорошо работает в системной среде. Флаги сборки очень разные. – Hua

ответ

34

Я нашел ответ here.

Python также должен быть собран в режиме отладки, т.е.

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

Кроме того, NumPy имеет suppresion file, что позволяет избавиться от дополнительных предупреждений VALGRIND.

+1

Спасибо, что сделали исследование для всех! Вы знаете, нужно ли перекомпилировать python после выполнения valgrind? И что еще более важно - как это сделать? –

+0

Что для меня работает, это компиляция/установка версии python, совместимой с valgrind, а затем с помощью virtualenv. Это дает удобный сценарий активации. Еще лучше с 'virtualenvwrapper' –

+0

делает ли это выполнение каждого вызова команды python с valgrind? Я замечаю значительное замедление установки пакетов с помощью pip –

6

С python 3.6 существует переменная окружения PYTHONMALLOC, которая доступна в сборках релизов, без необходимости перекомпиляции.

PYTHONMALLOC=malloc python3 foobar.py 

Это отключит pymalloc и просто использовать LibC таНос непосредственно, что делает его VALGRIND удобно. Это эквивалентно --without-pymalloc (и так же медленно)

Если valgrind работает слишком медленно, другие значения могут быть полезны. PYTHONMALLOC=debug и PYTHONMALLOC=malloc_debug добавить отладочные крючки поверх стандартных и libc-распределителей соответственно.Их последствия, из документации:

  • Вновь выделенная память заполнена байтом 0xCB
  • Освободившись память заполнена байтом 0xdb
  • Обнаружение нарушений Python распределителем памяти API. Например, PyObject_Free() вызывает блок памяти, выделенный PyMem_Malloc().
  • Detect пишет до начала буфера (буфер обнуляется)
  • Detect пишет после окончания буфера (переполнение буфера)
  • Проверить, что GIL проводятся при распределителях функция PYMEM_DOMAIN_OBJ (например: PyObject_Malloc()) и PYMEM_DOMAIN_MEM (например: PyMem_Malloc()).

Это наловить неинициализированный читает, некоторые использует после свободных, некоторых буферов при переполнении/и т.д., но не будет сообщать о течи и не будет касаться памятей, не выделенные через питон (при использовании glibc, то MALLOC_PERTURB_ и MALLOC_CHECK_ переменные окружения могут помочь там)

Смотрите также:

+0

Это отлично подойдет для меня. – Trev

Смежные вопросы