Arhn - архитектура программирования

Исключение нарушения прав доступа при использовании socketio-client-c++ и boost asio io_service

Я пытаюсь использовать io_service из библиотеки boost asio (1.61) с socketio-client-c++, но мой код выдает исключение нарушения доступа, и после нескольких часов отладки я не мог понять, в чем причина. Исключение создается в следующем месте файла win_mutex.hpp:

void lock()
{
 -> ::EnterCriticalSection(&crit_section_);
}

Код очень прост:

int main(int argc, char* argv[]) {
    boost::asio::io_service io_service;
    auto io_service_work = std::make_shared<boost::asio::io_service::work>      (io_service);

    sio::client client_;
    client_.connect("http://localhost:1337");

    // io_service.run();
}

Я хочу использовать io_service из main, а socketio также использует io_service внутри, что может быть причиной проблемы.

Вы можете загрузить полный проект с исходным кодом и двоичным файлом сокетио, включенным здесь: http://stackoverflow-sehe.s3.amazonaws.com/7f1afa6a-883f-4941-8371-31ccbd8514a5/socket-io.zip ¹

Любое предложение?

¹ ссылка отредактирована; ссылок (было 88М, сейчас 443К)



Ответы:


1

Поскольку строка просто вызывает общедоступный API Win32 с адресом чего-либо, все, что может вызвать это, — это когда this указывает на что-то случайное (например, на разрушенный win_mutex, что-то еще, защищенную память или даже нольптр).

Это указывает на неопределенное поведение. У UB есть миллиард возможных источников, и вашего кода недостаточно, чтобы делать какие-либо выводы. Но в Asio в 99% случаев это вызвано тем, что объекты не хранятся достаточно долго для завершения асинхронных операций над ними.

28.09.2016
  • (до сих пор смотрю на уменьшенный почтовый индекс) 28.09.2016

  • 2

    Я преобразовал проект socketio в Dll, отключил автоматическую ссылку boost и вручную добавил libboost_system-vc140-mt-gd-1_61.lib в качестве дополнительной зависимости. Тогда код работает как задумано.

    Однако, если я верну проект socketio в статическую библиотеку, возникнет тот же симптом, что и в вопросе.

    Пожалуйста, проверьте файлы проекта на основе Dll здесь: http://ginf.hu/socketio/socketiotest.zip

    28.09.2016
  • о - интересная штука. Вот мой тест на основе Linux, кстати: -sehe.s3.amazonaws.com/ (используя Makefile; apt-get install build-essential make rapidjson-dev libboost-all-dev libwebsocketpp-dev; make && ./test) 28.09.2016
  • Я подозреваю, что это проблема только для Windows, что-то с автоматической ссылкой Boost или статической и динамической связью библиотеки. 28.09.2016
  • Без сомнений :). @Блз 28.09.2016
  • Приближаясь к источнику проблемы, кажется, что условие if оценивается по-разному в версии static-lib, чем в версии dll. Вы можете найти более подробное описание и исследование здесь: stackoverflow.com/questions/39772075/ 29.09.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..