带有libpion的服务器在处理请求时崩溃
Server with libpion crashing at request handling
我使用以下版本的库:libpion dev 5.0.6 libboost all dev 1.58.0在互联网上找到了一个异步HTTP服务器的简单示例,但它属于处理请求的过程,其中描述了处理程序。此外,对于不存在的资源,正确地返回404响应。
服务器代码:我使用以下版本的库:libpion dev 5.0.6 libboost all dev 1.58.0在互联网上找到了一个异步HTTP服务器的简单示例,但它属于处理程序所描述的请求的过程。此外,对于不存在的资源,正确地返回404响应。
服务器代码:
#include <boost/bind/arg.hpp>
#include <boost/bind/bind.hpp>
#include <boost/bind/placeholders.hpp>
#include <boost/smart_ptr/shared_ptr.hpp>
#include <pion/http/parser.hpp>
#include <pion/http/request.hpp>
#include <pion/http/response_writer.hpp>
#include <pion/http/server.hpp>
#include <pion/tcp/connection.hpp>
#include <unistd.h>
struct fake_server {
void start() {
m_server = pion::http::server_ptr(new pion::http::server(8080));
m_server->add_resource("/test", boost::bind(&fake_server::handle_request, this, _1, _2));
m_server->start();
}
void handle_request(pion::http::request_ptr& _httpRequest, pion::tcp::connection_ptr& _tcpConn) {
pion::http::response_writer_ptr writer(
pion::http::response_writer::create(
_tcpConn,
*_httpRequest,
boost::bind(&pion::tcp::connection::finish, _tcpConn)));
pion::http::response& r = writer->get_response();
writer->write("hello world");
writer->send();
}
pion::http::server_ptr m_server;
};
int main() {
fake_server svr;
svr.start();
for(;;) sleep(86400);
}
崩溃的threas堆栈:
Thread #9 [TEST_pion] 16903 [core: 0] (Suspended : Signal : SIGSEGV:Segmentation fault)
boost::asio::detail::reactive_socket_service_base::start_op() at reactive_socket_service_base.ipp:219 0x412918
boost::asio::detail::reactive_socket_service_base::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at reactive_socket_service_base.hpp:216 0x41a79e
boost::asio::stream_socket_service<boost::asio::ip::tcp>::async_send<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at stream_socket_service.hpp:330 0x41a79e
boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >::async_write_some<boost::asio::detail::consuming_buffers<boost::asio::const_buffer, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> > >, boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> > >() at basic_stream_socket.hpp:732 0x41a79e
boost::asio::detail::write_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::asio::detail::transfer_all_t, boost::function2<void, boost::system::error_code const&, unsigned long> >::operator() at write.hpp:181 0x41a79e
boost::asio::async_write<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> >, std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long>&>() at write.hpp:621 0x41acc6
pion::tcp::connection::async_write<std::vector<boost::asio::const_buffer, std::allocator<boost::asio::const_buffer> >, boost::function2<void, boost::system::error_code const&, unsigned long> >() at connection.hpp:567 0x41ca4c
pion::http::writer::send_more_data<boost::function2<void, boost::system::error_code const&, unsigned long> >() at writer.hpp:277 0x41ca4c
pion::http::writer::send() at writer.hpp:167 0x41cf8f
fake_server::handle_request() at TEST_pion.cpp:28 0x41cf8f
boost::function2<void, boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&>::operator()(boost::shared_ptr<pion::http::request>&, boost::shared_ptr<pion::tcp::connection>&) const at 0x7ffff6e8a5c9
pion::http::server::handle_request() at 0x7ffff6e8516b
boost::function3<void, boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&>::operator()(boost::shared_ptr<pion::http::request>, boost::shared_ptr<pion::tcp::connection>, boost::system::error_code const&) const at 0x7ffff6e8a25c
pion::http::request_reader::finished_reading() at 0x7ffff6e8a3bb
pion::http::reader::consume_bytes() at 0x7ffff6e830ec
pion::http::reader::consume_bytes() at 0x7ffff6e8374d
boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::_bi::bind_t<void, boost::_mfi::mf2<void, pion::http::reader, boost::system::error_code const&, unsigned long>, boost::_bi::list3<boost::_bi::value<boost::shared_ptr<pion::http::request_reader> >, boost::arg<1> (*)(), boost::arg<2> (*)()> > >::do_complete at 0x7ffff6e8810b
boost::asio::detail::epoll_reactor::descriptor_state::do_complete() at 0x7ffff6e55a84
pion::scheduler::process_service_work() at 0x7ffff6e41de1
0x7ffff7bc3bc5
start_thread() at pthread_create.c:333 0x7ffff5d446aa
clone() at clone.S:109 0x7ffff6269e9d
在本例中,请求http://127.0.0.1:8080/none返回404而没有崩溃,并且http://127.0.0.1:8080/test制造崩溃。我不明白,是什么原因以及如何做对。图书馆并没有文件,也许有些东西并没有被考虑在内。请帮忙。
我不是pion库的专家。然而,对/none
的请求返回404而不崩溃的原因是,它由pion
库处理,而不是由handle_request
函数处理。
这里有一个使用pion库的示例。它可以帮助您发现handle_request
函数中出现的问题。
我发现这个问题是因为我也遇到了这个问题。
在我的案例中,Boost和Pion DLL之间的Boost编译时选项不同。具体而言,选项BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG在一个构建中启用,在另一个构建中将被禁用。这导致boost::posix_time::ptime在两者之间具有不同的大小,因此当我跨越DLL边界时,内存将停止映射到适当的成员。
在我的案例中,修复方法是使编译时选项保持一致。
- 当回溯以零开始时,如何调试崩溃
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 在多个核心中处理一个HTTP请求
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- GPRC服务器在处理的第二请求下崩溃
- pThread 中的 curl 请求在请求完成后崩溃
- 服务器在请求已经处理请求时收到请求时会崩溃
- boost::asio 中的未经请求的消息使应用程序崩溃,没有 SSL 它可以正常工作,为什么
- 带有libpion的服务器在处理请求时崩溃
- 当进行几个http请求调用时崩溃