与 boost::property_tree XML 解析器一起使用时 boost::coroutine 库崩溃
Crash in boost::coroutine library when used alongside boost::property_tree XML parser
我正在使用 Simple-Web-Server 库创建简单的 Web 服务,用于将 XML 翻译成 JSON 反之亦然。反过来,它使用了几个 boost 库以及其中的 boost::coroutine。对于 XML<->JSON 转换,我正在使用 boost::property_tree 库进行中间转换表示。这是代码:
#include <iostream>
#include <sstream>
#include <server_http.hpp>
#define BOOST_SPIRIT_THREADSAFE
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
using namespace boost::property_tree;
using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
int main()
{
HttpServer server(8080, 1);
server.resource["^/json_to_xml$"]["POST"] = [](auto& response, auto request) {
try
{
ptree pt;
read_json(request->content, pt);
ostringstream json, xml;
write_json(json, pt);
clog << "JSON request content:" << endl << json.str() << endl;
write_xml(xml, pt, xml_writer_make_settings<ptree::key_type>(' ', 1u));
clog << "XML response content:" << endl << xml.str() << endl;
response << "HTTP/1.1 200 OK\r\nContent-Length: " << xml.str().length() << "\r\n\r\n" << xml.str();
}
catch(const exception& e)
{
cerr << "Error:" << endl << e.what() << endl;
response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << strlen(e.what()) << "\r\n\r\n" << e.what();
}
};
server.resource["^/xml_to_json$"]["POST"] = [](auto& response, auto request) {
try
{
ptree pt;
read_xml(request->content, pt, xml_parser::trim_whitespace | xml_parser::no_comments);
ostringstream xml, json;
write_xml(xml, pt, xml_writer_make_settings<ptree::key_type>(' ', 1u));
clog << "XML request content:" << endl << xml.str() << endl;
write_json(json, pt);
clog << "JSON response content: " << endl << json.str() << endl;
response << "HTTP/1.1 200 OK\r\nContent-Length: " << json.str().length() << "\r\n\r\n" << json.str();
}
catch(const exception& e)
{
cerr << "Error:" << endl << e.what() << endl;
response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << strlen(e.what()) << "\r\n\r\n" << e.what();
}
};
server.start();
return 0;
}
JSON 到 XML 的转换工作正常,但相反会导致程序崩溃。当我不在服务器的回调中使用 boost::property_tree 的 XML 解析器时,程序工作正常. Here is the result of execution. Here is GDB backtrace. And finally here 是 Valgrind 输出。
使用的 boost 库版本是 1.58.0 但最新版本 的结果相同1.61.0。使用 Simple-Web-Server 版本 1.4.2。
read_xml() 可能会溢出协程的堆栈;请参阅 关于追溯到 rapidxml 解析器内的 64K 堆栈变量的类似崩溃。
编辑。总结一下 link... 问题的要点是,埋在 read_xml 中的 rapidxml 解析器在堆栈上分配了 64K,溢出了 Linux 上的 8K 默认协程堆栈。您可以尝试两件事...要么强制该堆栈变量变小,例如,
#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512
#include <boost/property_tree/xml_parser.hpp>
或者在生成协程时分配更大的堆栈(如果可以通过 Simple-Web-Server 访问它)
我正在使用 Simple-Web-Server 库创建简单的 Web 服务,用于将 XML 翻译成 JSON 反之亦然。反过来,它使用了几个 boost 库以及其中的 boost::coroutine。对于 XML<->JSON 转换,我正在使用 boost::property_tree 库进行中间转换表示。这是代码:
#include <iostream>
#include <sstream>
#include <server_http.hpp>
#define BOOST_SPIRIT_THREADSAFE
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/xml_parser.hpp>
using namespace std;
using namespace boost::property_tree;
using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
int main()
{
HttpServer server(8080, 1);
server.resource["^/json_to_xml$"]["POST"] = [](auto& response, auto request) {
try
{
ptree pt;
read_json(request->content, pt);
ostringstream json, xml;
write_json(json, pt);
clog << "JSON request content:" << endl << json.str() << endl;
write_xml(xml, pt, xml_writer_make_settings<ptree::key_type>(' ', 1u));
clog << "XML response content:" << endl << xml.str() << endl;
response << "HTTP/1.1 200 OK\r\nContent-Length: " << xml.str().length() << "\r\n\r\n" << xml.str();
}
catch(const exception& e)
{
cerr << "Error:" << endl << e.what() << endl;
response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << strlen(e.what()) << "\r\n\r\n" << e.what();
}
};
server.resource["^/xml_to_json$"]["POST"] = [](auto& response, auto request) {
try
{
ptree pt;
read_xml(request->content, pt, xml_parser::trim_whitespace | xml_parser::no_comments);
ostringstream xml, json;
write_xml(xml, pt, xml_writer_make_settings<ptree::key_type>(' ', 1u));
clog << "XML request content:" << endl << xml.str() << endl;
write_json(json, pt);
clog << "JSON response content: " << endl << json.str() << endl;
response << "HTTP/1.1 200 OK\r\nContent-Length: " << json.str().length() << "\r\n\r\n" << json.str();
}
catch(const exception& e)
{
cerr << "Error:" << endl << e.what() << endl;
response << "HTTP/1.1 400 Bad Request\r\nContent-Length: " << strlen(e.what()) << "\r\n\r\n" << e.what();
}
};
server.start();
return 0;
}
JSON 到 XML 的转换工作正常,但相反会导致程序崩溃。当我不在服务器的回调中使用 boost::property_tree 的 XML 解析器时,程序工作正常. Here is the result of execution. Here is GDB backtrace. And finally here 是 Valgrind 输出。
使用的 boost 库版本是 1.58.0 但最新版本 的结果相同1.61.0。使用 Simple-Web-Server 版本 1.4.2。
read_xml() 可能会溢出协程的堆栈;请参阅
编辑。总结一下 link... 问题的要点是,埋在 read_xml 中的 rapidxml 解析器在堆栈上分配了 64K,溢出了 Linux 上的 8K 默认协程堆栈。您可以尝试两件事...要么强制该堆栈变量变小,例如,
#define BOOST_PROPERTY_TREE_RAPIDXML_STATIC_POOL_SIZE 512
#include <boost/property_tree/xml_parser.hpp>
或者在生成协程时分配更大的堆栈(如果可以通过 Simple-Web-Server 访问它)