我正在尝试使用Boost.Python在C ++中编写的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来追踪这样的泄漏?
这是否可能,或者我基本上只是卡住了?