C++ boost::property_tree::read_xml segfaults在使用boost::asio::spawn生成的asio处理程序中
以下代码在boost::property_tree::read_xml调用中因seg错误而崩溃。 只有在使用boost::asio::spawn生成的io_服务处理程序内部调用它时,才会发生这种情况。如果处理程序刚刚发布,那么它工作正常。 是否有修复或解决方法? 增加1.61C++ boost::property_tree::read_xml segfaults在使用boost::asio::spawn生成的asio处理程序中,c++,boost,boost-asio,boost-propertytree,C++,Boost,Boost Asio,Boost Propertytree,以下代码在boost::property_tree::read_xml调用中因seg错误而崩溃。 只有在使用boost::asio::spawn生成的io_服务处理程序内部调用它时,才会发生这种情况。如果处理程序刚刚发布,那么它工作正常。 是否有修复或解决方法? 增加1.61 #include <boost/asio/spawn.hpp> #include <boost/property_tree/ptree.hpp> #include <boost/propert
#include <boost/asio/spawn.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>
#include <sstream>
#include <thread>
void process()
{
std::cerr << "start"<< std::endl;
std::istringstream is("<t>1</t>");
boost::property_tree::ptree pt;
boost::property_tree::read_xml(is, pt); // <<< seg fault here
std::cerr << std::endl << "end" << std::endl;
}
int main()
{
boost::asio::io_service io_service;
boost::asio::spawn(io_service, [] (boost::asio::yield_context y){
process();
});
io_service.run();
return 0;
}
经过一番挖掘,我们发现seg故障是由coroutine的堆栈溢出引起的,因为boost::property_tree::read_xml中使用的rapidxml解析器默认为每个xml文档中的静态内存池在堆栈上分配64KB 解决方案是按如下方式减小池的大小:
#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512
#include <boost/property_tree/xml_parser.hpp>
另一个解决方案是增加协程的堆栈大小