You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 11:20:25