Итак, я собрал несколько 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, и как он увеличивается / уменьшается по мере продвижения кода.