Boost Socket Acceptor触发Segmentation Fault问题排查求助
我正尝试基于Boost相关指南编写TCP服务器,调用acceptor.open()时触发Segmentation Fault,IDE指向代码行object_pool_access::prev(live_list_) = o;。尝试用线程运行io_context无效,修复过程中还出现如下错误:
tpp.c:82: __pthread_tpp_change_priority: Assertion `new_prio == -1 || (new_prio >= fifo_min_prio && new_prio <= fifo_max_prio)' failed. Aborted (core dumped)
代码分为两部分:包含io_context的Application类(计划在程序其他模块复用该io_context),以及出现错误的网络代码。
Application类代码
#include <boost/asio.hpp> #include <boost/bind.hpp> #include <memory> using namespace boost::asio; class api_application { public: virtual ~api_application() {} virtual void start() = 0; virtual boost::asio::io_context& get_context() = 0; }; class application : public api_application { public: application(); ~application() override {} public: virtual void start() override; virtual boost::asio::io_context& get_context() override; void stop(); private: boost::asio::io_context _context; std::shared_ptr<tcp_server> _server; }; application::application() : _context(), _server(std::make_shared<tcp_server>(*this)) {} void application::start() { _server->start(); _context.run(); } void application::stop() { _context.stop(); } boost::asio::io_context& application::get_context() { return _context; }
网络模块代码(错误触发位置已标注)
class connection : public std::enable_shared_from_this<connection> { public: typedef std::shared_ptr<connection> con_ptr; static con_ptr create(boost::asio::io_context& io_service) { return con_ptr(new connection(io_service)); } ip::tcp::socket& socket(); void send(std::string message); private: connection(boost::asio::io_context& io_service); void handle_write(const boost::system::error_code& err, size_t s); private: ip::tcp::socket _socket; }; class tcp_server { public: tcp_server(api_application& app); void start(); private: void start_accept(); void handle_accept(connection::con_ptr new_connection, const boost::system::error_code& error); api_application& _app; ip::tcp::endpoint _endpoint; ip::tcp::acceptor _acceptor; }; tcp_server::tcp_server(api_application& app) : _app(app), _endpoint(boost::asio::ip::address_v4::any(), 80), _acceptor(app.get_context()) {} void tcp_server::start() { if(_acceptor.is_open()) return; _acceptor.open(_endpoint.protocol()); // 此处触发Segmentation Fault _acceptor.set_option(ip::tcp::socket::reuse_address(true)); _acceptor.bind(_endpoint); _acceptor.listen(); start_accept(); } void tcp_server::start_accept() { connection::con_ptr new_connection = connection::create((boost::asio::io_context&)_acceptor.get_executor().context()); _acceptor.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); } void tcp_server::handle_accept(connection::con_ptr new_connection, const boost::system::error_code& error) { if (!error) { new_connection->send("Success connection"); } start_accept(); } void connection::send(std::string message) { boost::asio::async_write(_socket, boost::asio::buffer(message), boost::bind(&connection::handle_write, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } connection::connection(boost::asio::io_context& io_service) : _socket(io_service) {} int main(int argc, const char** argv) { application app(); app.start(); return 0; }
请问我哪里出错了?
1. 致命错误:application app();是函数声明而非对象实例化
C++中,application app();会被编译器解析为一个名为app、返回application类型的无参函数声明,而非创建application类的对象。后续调用app.start()属于非法操作,直接触发未定义行为,这是段错误的核心根源。
修复:
int main(int argc, const char** argv) { application app; // 改为直接声明对象 app.start(); return 0; }
2. tcp_server中acceptor初始化逻辑不规范
当前_acceptor(app.get_context())仅完成默认构造,未指定协议。虽然后续调用open()逻辑上可行,但更安全的方式是在初始化列表中直接绑定协议,避免状态异常:
修改tcp_server构造函数:
tcp_server::tcp_server(api_application& app) : _app(app), _endpoint(boost::asio::ip::address_v4::any(), 80), _acceptor(app.get_context(), _endpoint.protocol()) // 直接用协议初始化acceptor {}
3. connection类的socket()方法未实现
代码中仅声明了ip::tcp::socket& socket();但未提供实现,调用时会触发链接错误,必须补充:
ip::tcp::socket& connection::socket() { return _socket; }
4. io_context.run()可能提前退出
如果io_context中没有待处理任务,run()会直接返回。添加work_guard可保持io_context持续运行,直到主动调用stop():
在application类私有成员中添加:
boost::asio::executor_work_guard<boost::asio::io_context::executor_type> _work_guard;
并在构造函数初始化:
application::application() : _context(), _work_guard(boost::asio::make_work_guard(_context)), _server(std::make_shared<tcp_server>(*this)) {}
线程优先级错误说明
该错误通常源于线程调度策略异常,修复上述核心问题后大概率会自动消失。若仍出现,需检查是否手动修改过线程属性,或确认当前平台支持所用调度策略。
内容的提问来源于stack exchange,提问作者lbsmart

