`Syscall param epoll_ctl(event) 指向 arm64 上简单 boost 服务器中的未初始化`

Ste*_*nko 5 boost arm c++11

我在 jetson nano ARM 平台上运行这个简单的 c++ 服务器:

    boost::asio::io_service svc;
    tcp::acceptor a(svc);
    a.open(tcp::v4());
    a.set_option(tcp::acceptor::reuse_address(true));
    a.bind({{}, 6767}); // bind to port 6767 on localhost
    a.listen(5);
    using session = std::shared_ptr<tcp::socket>;
    std::function<void()>        do_accept;
    std::function<void(session)> do_session;
    do_session = [&](session s) {
        // do a read
        auto buf = std::make_shared<std::vector<char>>(1024);
        s->async_read_some(boost::asio::buffer(*buf), [&,s,buf](error_code ec, size_t bytes) {
            if (ec)
                std::cerr << "read failed: " << ec.message() << "\n";
            else {
                std::cout << "Echo to " << s->remote_endpoint(ec) << ": " << std::string(buf->data(), bytes);
                if (ec)
                    std::cerr << "endpoint failed: " << ec.message() << "\n";
                else
                    async_write(*s, boost::asio::buffer(*buf), [&,s,buf](error_code ec, size_t) {
                        if (ec) std::cerr << "write failed: " << ec.message() << "\n";
                    });
                do_session(s); // full duplex, can read while writing, using a second buffer
            }
        });
    };
    do_accept = [&] {
        auto s = std::make_shared<session::element_type>(svc);
        a.async_accept(*s, [&,s](error_code ec) {
            if (ec)
                std::cerr << "accept failed: " << ec.message() << "\n";
            else {
                do_session(s);
                do_accept(); // accept the next
            }
        });
    };
    do_accept(); // kick-off
    svc.run();   // wait for shutdown (Ctrl-C or failure)
Run Code Online (Sandbox Code Playgroud)

如果我使用 valgrind 启动它,则会收到以下消息:

stiv@nano:~/jsoft/tests$ valgrind ./build/ImageServerTest 
==1120== Memcheck, a memory error detector
==1120== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==1120== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==1120== Command: ./build/ImageServerTest
==1120== 
==1120== Syscall param epoll_ctl(event) points to uninitialised byte(s)
==1120==    at 0x4B57CD8: epoll_ctl (syscall-template.S:78)
==1120==    by 0x131AAF: boost::asio::detail::epoll_reactor::epoll_reactor(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13B7F3: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::detail::epoll_reactor>(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x130F5B: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13A937: boost::asio::detail::epoll_reactor& boost::asio::detail::service_registry::use_service<boost::asio::detail::epoll_reactor>() (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x137C1B: boost::asio::detail::epoll_reactor& boost::asio::use_service<boost::asio::detail::epoll_reactor>(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13582B: boost::asio::detail::reactive_socket_service_base::reactive_socket_service_base(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13D53F: boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::reactive_socket_service(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13CD3F: boost::asio::socket_acceptor_service<boost::asio::ip::tcp>::socket_acceptor_service(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13C77F: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x130F5B: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13C2F7: boost::asio::socket_acceptor_service<boost::asio::ip::tcp>& boost::asio::detail::service_registry::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >() (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==  Address 0x1ffefffc5c is on thread 1's stack
==1120==  in frame #1, created by boost::asio::detail::epoll_reactor::epoll_reactor(boost::asio::io_service&) (???:)
==1120== 
==1120== Syscall param epoll_ctl(event) points to uninitialised byte(s)
==1120==    at 0x4B57CD8: epoll_ctl (syscall-template.S:78)
==1120==    by 0x131B07: boost::asio::detail::epoll_reactor::epoll_reactor(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13B7F3: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::detail::epoll_reactor>(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x130F5B: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13A937: boost::asio::detail::epoll_reactor& boost::asio::detail::service_registry::use_service<boost::asio::detail::epoll_reactor>() (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x137C1B: boost::asio::detail::epoll_reactor& boost::asio::use_service<boost::asio::detail::epoll_reactor>(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13582B: boost::asio::detail::reactive_socket_service_base::reactive_socket_service_base(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13D53F: boost::asio::detail::reactive_socket_service<boost::asio::ip::tcp>::reactive_socket_service(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13CD3F: boost::asio::socket_acceptor_service<boost::asio::ip::tcp>::socket_acceptor_service(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13C77F: boost::asio::io_service::service* boost::asio::detail::service_registry::create<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x130F5B: boost::asio::detail::service_registry::do_use_service(boost::asio::io_service::service::key const&, boost::asio::io_service::service* (*)(boost::asio::io_service&)) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x13C2F7: boost::asio::socket_acceptor_service<boost::asio::ip::tcp>& boost::asio::detail::service_registry::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >() (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==  Address 0x1ffefffc5c is on thread 1's stack
==1120==  in frame #1, created by boost::asio::detail::epoll_reactor::epoll_reactor(boost::asio::io_service&) (???:)
==1120== 
^C==1120== 
==1120== Process terminating with default action of signal 2 (SIGINT)
==1120==    at 0x4B575B0: epoll_pwait (epoll_pwait.c:42)
==1120==    by 0x132803: boost::asio::detail::epoll_reactor::run(bool, boost::asio::detail::op_queue<boost::asio::detail::task_io_service_operation>&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x133D23: boost::asio::detail::task_io_service::do_run_one(boost::asio::detail::scoped_lock<boost::asio::detail::posix_mutex>&, boost::asio::detail::task_io_service_thread_info&, boost::system::error_code const&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x1337FF: boost::asio::detail::task_io_service::run(boost::system::error_code&) (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x134073: boost::asio::io_service::run() (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120==    by 0x12C1D7: main (in /home/stiv/jsoft/tests/build/ImageServerTest)
==1120== 
==1120== HEAP SUMMARY:
==1120==     in use at exit: 945 bytes in 9 blocks
==1120==   total heap usage: 10 allocs, 1 frees, 73,649 bytes allocated
==1120== 
==1120== LEAK SUMMARY:
==1120==    definitely lost: 0 bytes in 0 blocks
==1120==    indirectly lost: 0 bytes in 0 blocks
==1120==      possibly lost: 0 bytes in 0 blocks
==1120==    still reachable: 945 bytes in 9 blocks
==1120==         suppressed: 0 bytes in 0 blocks
==1120== Rerun with --leak-check=full to see details of leaked memory
==1120== 
==1120== For counts of detected and suppressed errors, rerun with: -v
==1120== Use --track-origins=yes to see where uninitialised values come from
==1120== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Run Code Online (Sandbox Code Playgroud)

这是什么意思?这是 boost asio 或 valgrind 中的错误吗?我如何解决它?

一些背景信息:我不得不深入研究这个,因为我在生产应用程序上崩溃了,很难重现。崩溃本身不会在 valgrind 下重现,但 valgrind 表示生产代码的错误完全相同。根据日志,很可能在生产中它在完全相同的行上启动 Web 服务器(当然不是 100% 确定)崩溃。所以我决定隔离这个网页,我发现 valgrind 问题仍然存在,尽管我没有看到崩溃本身。

更新:尝试从 boost 65 升级到 lastest 75,行为是一样的。