2015-04-05 3 views
0

Я пытался запустить несколько примеров boost :: asio. Они компилируются и связываются без проблем, но когда они пытаются зарегистрировать async_accept в io_service, они бросают ошибку сегментации. Я приложил код ниже. Это немодифицировано из ускоренного документа.boost :: ошибка сегментации кода сегмента asio в Visual Studio 2013

// 
// server.cpp 
// ~~~~~~~~~~ 
// 
// Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com) 
// 
// Distributed under the Boost Software License, Version 1.0. (See accompanying 
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 
// 

#include <ctime> 
#include <iostream> 
#include <string> 
#include <memory> 
#include <boost/bind.hpp> 
#include <boost/asio.hpp> 

using boost::asio::ip::tcp; 
class session { 
public: 
    session(boost::asio::io_service& io_service) 
    : socket_(io_service) {} 

    tcp::socket& socket() { 
    return socket_; 
    } 

    void start() { 
    socket_.async_read_some(boost::asio::buffer(data_, max_length), 
          boost::bind(&session::handle_read, this, 
          boost::asio::placeholders::error, 
          boost::asio::placeholders::bytes_transferred)); 
    } 

    void handle_read(const boost::system::error_code& error, 
        size_t bytes_transferred) { 
    if (!error) { 
     boost::asio::async_write(socket_, 
           boost::asio::buffer(data_, bytes_transferred), 
           boost::bind(&session::handle_write, this, 
           boost::asio::placeholders::error)); 
    } 
    else { 
     delete this; 
    } 
    } 

    void handle_write(const boost::system::error_code& error) { 
    if (!error) { 
     socket_.async_read_some(boost::asio::buffer(data_, max_length), 
           boost::bind(&session::handle_read, this, 
           boost::asio::placeholders::error, 
           boost::asio::placeholders::bytes_transferred)); 
    } 
    else { 
     delete this; 
    } 
    } 

private: 
    tcp::socket socket_; 
    enum { max_length = 1024 }; 
    char data_[max_length]; 
}; 

class server { 
public: 
    server(boost::asio::io_service& io_service, short port) 
    : io_service_(io_service), 
    acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) { 
    session* new_session = new session(io_service_); 
    acceptor_.async_accept(new_session->socket(), 
          boost::bind(&server::handle_accept, this, new_session, 
          boost::asio::placeholders::error)); 
    } 

    void handle_accept(session* new_session, 
        const boost::system::error_code& error) { 
    if (!error) { 
     new_session->start(); 
     new_session = new session(io_service_); 
     acceptor_.async_accept(new_session->socket(), 
          boost::bind(&server::handle_accept, this, new_session, 
          boost::asio::placeholders::error)); 
    } 
    else { 
     delete new_session; 
    } 
    } 

private: 
    boost::asio::io_service& io_service_; 
    tcp::acceptor acceptor_; 
}; 

Цепочка вызовов:

> gryphon.exe!boost::asio::detail::win_iocp_io_service::work_started() Line 96 C++  gryphon.exe!boost::asio::detail::win_iocp_socket_service_base::start_accept_op(boost::asio::detail::win_iocp_socket_service_base::base_implementation_type & impl, bool peer_is_open, boost::asio::detail::socket_holder & new_socket, int family, int type, int protocol, void * output_buffer, unsigned long address_length, boost::asio::detail::win_iocp_operation * op) Line 480 C++ 
    gryphon.exe!boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::async_accept<boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> >,boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > >(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & peer, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp> * peer_endpoint, boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > & handler) Line 487 C++ 
    gryphon.exe!boost::asio::socket_acceptor_service<boost::asio::ip::tcp>::async_accept<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > >(boost::asio::detail::win_iocp_socket_service<boost::asio::ip::tcp>::implementation_type & impl, boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & peer, boost::asio::ip::basic_endpoint<boost::asio::ip::tcp> * peer_endpoint, boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > && handler, void * __formal) Line 285 C++ 
    gryphon.exe!boost::asio::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::async_accept<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp>,boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > >(boost::asio::basic_socket<boost::asio::ip::tcp,boost::asio::stream_socket_service<boost::asio::ip::tcp> > & peer, boost::_bi::bind_t<void,boost::_mfi::mf2<void,server,session *,boost::system::error_code const &>,boost::_bi::list3<boost::_bi::value<server *>,boost::_bi::value<session *>,boost::arg<1> > > && handler, void * __formal) Line 1020 C++ 
    gryphon.exe!server::server(boost::asio::io_service & io_service, short port) Line 75 C++ 
    gryphon.exe!main() Line 32 C++ 
    [External Code] 

я уже получил этот код, чтобы работать, но с тех пор перекомпилированы 64 бит подталкивание (адрес-модель-64). Я думаю, что это причина ошибки, но я не понимаю настройки сборки Visual Studio или Boost достаточно хорошо, чтобы знать.

Edit: Компилятора опция

/GS /analyze- /W3 /Zc:wchar_t /I"src" /I"include" /I"C:\boost\boost_1_55_0" /ZI /Gm /Od /Fd"Debug\vc120.pdb" /fp:precise /D "_CRT_SECURE_NO_DEPRECATE" /D "_WIN32_WINDOWS" /D "WPCAP" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\gryphon.pch" 

опция компоновщик

/OUT:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.pdb" /DYNAMICBASE "Ws2_32.lib" "Packet.lib" "wpcap.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /INCREMENTAL /PGD:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\gryphon.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"lib" /LIBPATH:"C:\boost\boost_1_55_0\stage\lib" /TLBID:1 

Буст/этап/каталог Lib содержит 32-разрядные скомпилированные библиотеки. Поймите любую информацию о различиях между 32-битными/64-битными/многопоточными/статическими библиотеками ускорения и библиотеками времени выполнения Windows.

+0

на быстрый взгляд это выглядит хорошо. попробуйте выполнить полную перестройку. Перепроверьте все варианты/компиляторы/компоновщики проектов/библиотек. – sehe

+0

Восстановление без дополнительных параметров. Если это не сработает, я запустил новый проект VS только с этим блоком кода и посмотрю, работает ли это. Спасибо – user2411693

ответ

0

Got it working. Перестроен подталкивания с параметрами по умолчанию и измененном компилятором/опции компоновщика к следующему: (Я думаю, что удаление флаг SUBSYSTEM/CONSOLE было то, что сделал разницу)

Компилятор:

/GS /analyze- /W3 /Zc:wchar_t /I"src" /I"include" /I"C:\boost\boost_1_55_0\" /ZI /Gm /Od /sdl /Fd"Debug\vc120.pdb" /fp:precise /D "_CRT_SECURE_NO_DEPRECATE" /D "WPCAP" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\gryphon.pch" 

Linker:

/OUT:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.pdb" /DYNAMICBASE "Ws2_32.lib" "Packet.lib" "wpcap.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X86 /INCREMENTAL /PGD:"C:\Users\USER\Documents\Visual Studio 2013\Projects\gryphon\Debug\gryphon.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"Debug\gryphon.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"lib" /LIBPATH:"C:\boost\boost_1_55_0\stage\lib" /TLBID:1 
+0

Подсистема _really_ не должна иметь никакого значения здесь. Это один из тех настроек, которые только означают что-то в ссылке, а _ не должны соответствовать (совместно используемым) библиотекам, хотя бы потому, что подсистема не является частью статических библиотек и не будет использоваться, кроме основного модуля (с точкой входа, то есть) – sehe

+0

Не знаю, было ли это так, или если это была одна из других изменений/форсирования. Если бы это была перестройка, я бы хотел, чтобы произошла какая-то ошибка компоновщика. Все, что я получил, это случайная ошибка seg (работает от CLI или от VS-отладчика). Просто подумал, что кто-то другой может столкнуться с проблемой, или кто-то может увидеть какую-то очевидную причину проблемы в флагах. – user2411693

+0

Несовместимость ABI приведет к [Неопределенное поведение] (http://en.wikipedia.org/wiki/Undefined_behavior). Никакой диагностики не требуется, и, действительно, редко это возможно. Я считаю, что GCC с -flto ввел некоторые предупреждения, связанные с ODR. – sehe

Смежные вопросы