Отладка утечек PyObject при использовании python-c-api - PullRequest
0 голосов
/ 23 сентября 2018

Я только начинаю использовать python-c-api и уверен, что в какой-то момент я собираюсь испортить счетчик ссылок PyObject.Поэтому я пытаюсь выяснить, что является хорошим рабочим процессом для выявления утечек памяти и их отслеживания.

Обыскивая файлы заголовков, я видел ссылки на Py_DEBUG, Py_REF_DEBUG и даже Py_TRACE_REFS.Но я не уверен, как их использовать, и пока не нашел хорошего руководства по их использованию.

Как люди отлаживают утечки pyobject при использовании python-c-api?
Например, естьесть что-то, что я могу настроить с помощью этих отладочных определений, так что если я попытаюсь освободить все перед вызовом Py_Finalize (), я смогу увидеть, какие объекты python все еще существуют, что они есть, и, возможно, даже где они были размещены?

1 Ответ

0 голосов
/ 17 октября 2018

У меня недостаточно репутации, чтобы комментировать, поэтому добавляю в качестве ответа.

Как люди отлаживают утечки pyobject при использовании python-c-api?

Это то, что трудно сделать с обычными инструментами, такими как Valgrind, когда на экране появляется Python.

Также не рекомендуется вызывать Py_Finalize (), поскольку известно, что он имеет утечки памяти.Просто проще вызывать Py_Initialize () в начале вашего процесса и вызывать Py_Finalize () только тогда, когда вам абсолютно необходимо, т.е. когда ваш объект уничтожен в деструкторе или когда ваш процесс завершается.

см .: https://bugs.python.org/issue1445210

Что касается утечек памяти, вы должны понимать о новых, украденных и заимствованных ссылках и внимательно читать документацию по каждой вызываемой функции, чтобы знать, какой тип ссылки возвращается.

Если вы используете C ++, а не C, вам будет лучше использовать PyCXX или boost :: python или какую-либо другую оболочку C ++, которая использует RAII, чтобы позаботиться о пересчете для вас.

Надеюсь, это поможет.

...