我在 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,行为是一样的。
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |