В том числе Boost ASIO конфликтует с Amazon Gamelift SDK

Если я включаю boost ASIO в заголовочный файл без какого-либо фактического использования boost :: asio, в любой момент я вызываю Aws::GameLift::Server::InitSDK()приложение вылетит из другого потока. Как это возможно?

Exception thrown at 0x00007FFC4ADEA6AB (ntdll.dll) in MyApp.exe: 0xC0000005: Access violation writing location 0x0000000100000023.

ntdll.dll!RtlpWaitOnCriticalSection()   Unknown
ntdll.dll!RtlpEnterCriticalSectionContended()   Unknown
ntdll.dll!RtlEnterCriticalSection() Unknown
MyApp.exe!boost::asio::detail::win_iocp_io_service::do_add_timer_queue(class boost::asio::detail::timer_queue_base &)   C++
MyApp.exe!boost::asio::waitable_timer_service<struct std::chrono::steady_clock,struct boost::asio::wait_traits<struct std::chrono::steady_clock> >::waitable_timer_service<struct std::chrono::steady_clock,struct boost::asio::wait_traits<struct std::chrono::steady_clock> >(class boost::asio::io_service &)    C++
MyApp.exe!boost::asio::detail::service_registry::create<class boost::asio::waitable_timer_service<struct std::chrono::steady_clock,struct boost::asio::wait_traits<struct std::chrono::steady_clock> > >(class boost::asio::io_service &)   C++
MyApp.exe!boost::asio::detail::service_registry::do_use_service(const boost::asio::io_service::service::key & key, boost::asio::io_service::service *(*)(boost::asio::io_service &) factory) Line 124   C++
MyApp.exe!boost::asio::detail::win_iocp_io_service::do_one(bool block, boost::system::error_code & ec) Line 397 C++
MyApp.exe!boost::asio::detail::win_iocp_io_service::run(boost::system::error_code & ec) Line 159    C++

Вот мое включение — просто наличие этого в верхней части любого заголовочного файла вызовет исключение после вызова InitSDK.

#define BOOST_ASIO_HAS_MOVE
#define CreateEvent CreateEventA
#include <boost/asio.hpp>
#undef CreateEvent

Я использую:

  • Visual Studio 2015 Toolset v140

  • Boost 1.52.0

  • Windows 8.1 SDK (под управлением Windows 10)

Я взглянул на этот вопрос: boost :: asio :: io_service аварийно завершает работу в блокировке win_mutex

Когда я добавлю #define BOOST_ASIO_DISABLE_IOCP, исключение изменяется, и стек вызовов находится в главном потоке. Это наводит меня на мысль, что это связано с различными реализациями службы сокетов, в зависимости от того, какие определения используются.

MyApp.exe!boost::asio::detail::win_iocp_socket_service_base::construct(struct boost::asio::detail::win_iocp_socket_service_base::base_implementation_type &)    C++
MyApp.exe!boost::asio::basic_io_object<class boost::asio::socket_acceptor_service<class boost::asio::ip::tcp>,1>::basic_io_object<class boost::asio::socket_acceptor_service<class boost::asio::ip::tcp>,1>(class boost::asio::io_service &)    C++
MyApp.exe!std::make_shared<class boost::asio::basic_socket_acceptor<class boost::asio::ip::tcp,class boost::asio::socket_acceptor_service<class boost::asio::ip::tcp> >,class boost::reference_wrapper<class boost::asio::io_service> const >(class boost::reference_wrapper<class boost::asio::io_service> const &&)   C++
MyApp.exe!websocketpp::transport::asio::endpoint<struct websocketpp::config::asio_client::transport_config>::init_asio(class boost::asio::io_service *,class std::error_code &) C++
MyApp.exe!websocketpp::transport::asio::endpoint<struct websocketpp::config::asio_client::transport_config>::init_asio(class boost::asio::io_service *) C++
MyApp.exe!sio::client_impl::client_impl(void)   C++
MyApp.exe!sio::client::client(void) C++
MyApp.exe!Aws::GameLift::Internal::GameLiftServerState::InitializeNetworking(void)  Unknown
MyApp.exe!Aws::GameLift::Server::InitSDK(void)  Unknown

2

Решение

Похоже, что версия Gamelift SDK, которую я имею, использует Boost 1.61, и это конфликтует с Boost 1.52, который я использую в своем основном проекте.

Я обновил использование Boost до 1.61, чтобы соответствовать их использованию, и внезапно — больше никаких исключений из Gamelift. Сюрприз.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]