2016-12-08 11 views
2

다음 코드는 boost :: property_tree :: read_xml() 호출에서 seg 오류로 인해 충돌합니다. boost :: asio :: spawn()을 사용하여 생성 된 io_service 핸들러 내부에서 호출 된 경우에만 발생합니다. 처리기가 방금 게시되면 괜찮습니다. 해결 방법이 있습니까? 우리가 rapidxml 파서는 기본적으로 부스트 :: property_tree :: read_xml()에서 사용하기 때문에 독방 감금 오류가 코 루틴의 스택 오버 플로우로 인해 발생 것을 발견 뒷조사 후boost :: asi :: spawn을 사용하여 생성 된 asio 핸들러의 boost :: property_tree :: read_xml segfaults

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

답변

2

을 (1.61을 강화하는 것은) 정적에 대한 스택에 64킬로바이트 할당 각 xml 문서 내의 메모리 풀.

#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512 
#include <boost/property_tree/xml_parser.hpp> 

또 다른 해결책은 코 루틴의 스택 크기를 증가하는 것입니다 :

이 솔루션은 다음과 같이 풀의 크기를 줄이는 것입니다.