Я пытаюсь отследить утечку памяти в расширении Python, написанном на C ++ с использованием Boost.Python. Я пытался использовать gperftools. Тем не менее, похоже, что он не очень хорошо работает с Python.
Вот простой пример, я выставляю std::vector<int>
:
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
namespace py = boost::python;
std::vector<int> getIs(int n) {
return std::vector<int>(n, 42);
}
BOOST_PYTHON_MODULE(Foo)
{
py::class_<std::vector<int>>("IList")
.def(py::vector_indexing_suite<std::vector<int>>() )
;
py::def("getIs", getIs);
}
Если я скомпилирую этот модуль с -ltcmalloc
в соответствии с рекомендациями, происходит сбой даже простой итерации:
>>> import Foo
>>> print [i for i in Foo.getIs(1)]
Segmentation fault (core dumped)
Стек вызовов указывает здесь:
if (self.m_start == self.m_finish)
stop_iteration_error(); // <==
return *self.m_start++;
Я подозреваю, что это потому, что gperftools не обрабатывает тот факт, что в Python исключения генерируются все время, и это ожидается. У кого-нибудь есть опыт использования gperftools для отслеживания таких утечек?
Это вообще возможно, или я просто застрял?
Задача ещё не решена.