Повышение ASIO Access Violation при уничтожении io_service - PullRequest
0 голосов
/ 29 марта 2019

В настоящее время я работаю над проектом, в котором я создаю boost::asio::ip::udp::socket и настраиваю его для асинхронного прослушивания данных от клиентов.Я использую CMake для создания файлов моего проекта для среды развертывания Linux и Windows 10.

У меня нет проблем с кодом, работающим в Linux с GCC и Clang, однако, когда я работаю в режиме Release с MSVC и Visual Studio, я получаю нарушение прав доступа при выходе из программы.

Вот ошибка, которую я получаю:

Exception thrown at 0x00007FFB51954989 (ntdll.dll) in Weave_Server.exe: 0xC0000005: Access violation writing location 0x0000000000000024.

enter image description here

Стек показывает, что это исключение происходит при уничтожениимоего NetworkManager класса:

enter image description here

РЕДАКТИРОВАТЬ: Здесь является destrcutor для объекта, который имеет мой udp::socket и io_service объект.Вызывается полный деструктор, и ошибка приходит откуда-то из уничтожаемого io_service или очищаемого udp::socket.udp::socket является std::shared_ptr и будет уничтожено, когда эта функция выйдет из области видимости: enter image description here

В результате некоторых исследований я узнал, что ntdll.dll предназначен для отладки символовПроекты Visual Studio C ++, в которых есть смысл сбой в режиме Release (потому что символы отладки не должны загружаться).

Зачем проекту пытаться получить доступ к любым символам отладки из проекта режима релиза?Это настройка, которую мне нужно установить в файле CMake?

Вот где я получаю повышение в CMakeLists.txt для проекта:


if ( MSVC )
    set( Boost_USE_STATIC_LIBS          ON  ) 
else()
    set( Boost_USE_STATIC_LIBS          OFF  )
endif()
set( Boost_DETAILED_FAILURE_MSG     ON  )    # Useful error messages from boost
set( Boost_USE_STATIC_RUNTIME       OFF )    
set( Boost_DEBUG                    OFF )    # Print debug info from find boost

FIND_PACKAGE( Boost COMPONENTS system regex REQUIRED )

if( Boost_FOUND )
    message( STATUS      "Success, Boost found!" )
else()
    message( ERROR      "Cannot find boost! Exiting..." )
    return()
endif()

Еще одна вещь, о которой я могу подумать, это изменение, если Boost статически или динамически связан, но я изменилсяBOOST_USE_STATIC_LIBS и та же ошибка возникает в обеих настройках.

У кого-нибудь есть идеи относительно того, почему выбрасывается это исключение, или какие-то настройки для проверки на наличие Отладки и Выпуска, которые мне не хватает?Спасибо

1 Ответ

0 голосов
/ 02 апреля 2019

Эта проблема возникала из-за того, что объект io_service разрушался, когда мой деструктор NetworkManager выходил из области видимости.Это было проблематично, потому что я использовал udp::socket::async_recvFrom, который все еще пытался получить доступ к объекту io_service.

Проблема может быть решена путем передачи ссылки на объект io_service и созданияsocket через конструктор по умолчанию, или вы можете использовать общий указатель на io_service и передать эту ссылку, если не хотите сразу создавать сокеты.

...