Как отладить refcounts в C-расширении Python самым простым способом? - PullRequest
2 голосов
/ 28 декабря 2011

Итак, я собрал несколько Python C-расширений, и, хотя их соответствующие поведения проверены, я хотел бы проверить это с помощью некоторой отладки refcount.

Как я могу убедиться, что я вставил INC/ DEC правильно подсчитывает?Я хочу сделать эту проверку с точки зрения черного ящика, то есть как должен выглядеть ввод / вывод / память функции, если все повторные счета выполнены правильно?

Мой первый подход - использовать sys.getrefcount (obj) и проверьте refcounts всех объектов ввода / вывода, чтобы убедиться, что они в порядке.Во-вторых, я также мог бы, возможно, проверить используемую память, чтобы убедиться, что утечки памяти нет.

Но я никогда не делал этого раньше, так какой самый простой и правильный способ сделать это?

Пожалуйста, обратите внимание: Я не хочу использовать какие-либо библиотеки стилей Cython, я бы предпочел самому научиться изучать основы.

Решение: Так что, как и предполагалось, я построил интерпретатор Python с поддержкой отладки.Я думал, что это будет сложно, но это не так.Согласно этому рецепту я добавил эти точные строки к Objects/object.c.После этого все, что мне нужно было сделать в скачанном исходном каталоге Python, было:

./configure --with-pydebug --prefix=/usr/local/python/
make
make install

Что касается создания C-расширения для этого нового интерпретатора, все, что нужно было сделать на этом фронте, это указатьТег include_dirs в Расширении от setup.py до '/usr/local/python/include/python2.7', а затем запустите команду build and install с новым интерпретатором.Как только это будет сделано, я могу добавить просто добавление _Py_CountReferences(stderr); строк в коде c, и ссылка будет сброшена в stderr (консоль).Очень приятно видеть, что меняет refcount, и как он увеличивается / уменьшается по мере продвижения кода.

1 Ответ

1 голос
/ 28 декабря 2011

Одно предложение: скомпилировать интерпретатор Python в режиме отладки (--with-pydebug).Используйте этот интерпретатор для компиляции и тестирования вашего расширения.Интерпретатор отображает общее количество объектов, которое не должно увеличиваться при повторном запуске тестов.Обязательно протестируйте все возможные пути выхода вашего кода - я забыл DECREF-объекты при возникновении исключения.

...