使用boost :: asio :: spawn生成的asio处理程序中的boost :: property_tree :: read_xml段错误

时间:2016-12-08 01:26:24

标签: c++ boost boost-asio boost-propertytree

以下代码在boost :: property_tree :: read_xml()调用时遇到seg错误。 只有在使用boost :: asio :: spawn()生成的io_service处理程序内部调用它时才会发生这种情况。如果处理程序刚刚发布,它可以正常工作。 有没有修复或解决方法? (提升1.61)

#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;
}

1 个答案:

答案 0 :(得分:3)

经过一些挖掘后,我们发现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>

另一个解决方案是增加协同程序的堆栈大小。