2016-12-08 12 views
2

次のコードは、boost :: property_tree :: read_xml()呼び出しでsegフォールトでクラッシュします。 これは、boost :: asio :: spawn()を使用して生成されたio_serviceハンドラの内部で呼び出された場合にのみ発生します。ハンドラがちょうど投稿されている場合、それはokで動作します。 これには修正または回避策がありますか? 我々はrapidxmlパーサは、デフォルトでは、ブースト:: property_tree :: read_xml()で使用されるので、ワンセグ障害がコルーチンのスタックオーバーフローによって引き起こされることがわかったいくつかの掘削後boost :: property_tree :: read_xml boost :: asio :: spawnを使用して生成されたasioハンドラの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> 

別の解決策は、コルーチンのスタックサイズを増加させるであろう。

関連する問題