Я написал расширение Python для моего C-проекта : некоторые данные берутся (в C), передаются в функцию Python, которая модифицирует их, затем сохраняются в структурах C и используются для более сложных операций. Когда я запускаю:
$ valgrind ./my_c_project
, я получаю хорошо известный каскад ложных срабатываний из-за использования Python C API. Я искал в Интернете, но ответы, кажется, либо устарели, либо ссылаются на другие пути: c модулей, расширяющих python .
Я могу думать, что независимо от того, используете ли вы pythonдля расширения C, или C для расширения python, решение должно быть таким же, так как основная «проблема» основана на некотором «неправильном понимании» malloc-PyMem. Сказал, что самый последний и многообещающий ресурс, который я нашел, находится здесь cpython / README.valgrind , в котором, в частности, утверждается:
ОБНОВЛЕНИЕ: Python 3.6 теперь поддерживает переменную среды PYTHONMALLOC = mallocкоторый может быть использован для принудительного использования malloc () распределителя библиотеки C.
Означает ли это, что вместо перестройки Python (, как предлагалось старымресурсы ), могу ли я просто правильно установить указанную выше переменную?
Другой решенный вопрос на этом сайте , кажется, дает утвердительный ответ (см. вклад dequis), но показан примерво время выполнения сценария Python (я цитирую):
PYTHONMALLOC = malloc python3 foobar.py
, что не в моем случае, так как у меня есть скомпилированный C-код. Я наивно пытался с:
$ PYTHONMALLOC=malloc valgrind ./my_c_project
, который не работал (как ожидалось ...). Я не перестраивал python, так как делюсь своей рабочей станцией с коллегами;Я думаю, что я мог бы попробовать локально, но у меня плохое предчувствие, так как я использую много внешних модулей, и я могу оказаться в хаосе (я сделаю последний шанс, это все опыт).
Ps: Я также пытался просто комментировать ответ dequis, требуя дополнительных объяснений, но моей репутации недостаточно (здесь абсолютно никаких претензий, только неявные извинения за мой длинный, но, надеюсь, подробный пост).