libtorrent 和 tcp::acceptor 在 Windows 上因访问冲突而崩溃

Posted

技术标签:

【中文标题】libtorrent 和 tcp::acceptor 在 Windows 上因访问冲突而崩溃【英文标题】:libtorrent and tcp::acceptor crashes with access violation on Windows 【发布时间】:2017-11-30 10:00:35 【问题描述】:

libtorrent 版本(或分支): master / libtorrent-1_1_5

平台/架构: Win32

编译器和编译器版本: msvc-14.0

增强版: boost-1.65.1

下面的代码总是会导致崩溃。

#include "libtorrent/session.hpp"

#include <chrono>
#include <thread>

using namespace std;
int main()

    libtorrent::session session;

    boost::asio::io_service io_service;
        boost::asio::ip::tcp::acceptor acceptor(io_service);

    std::this_thread::sleep_for(chrono::seconds(15));
    return 0;

调用栈:

>   test-crow-libtorrent.exe!boost::asio::detail::win_iocp_socket_service_base::do_open(struct boost::asio::detail::win_iocp_socket_service_base::base_implementation_type &,int,int,int,class boost::system::error_code &) C++
    test-crow-libtorrent.exe!libtorrent::aux::session_impl::setup_listener(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class boost::asio::ip::tcp const &,int,int,class boost::system::error_code &)    C++
    test-crow-libtorrent.exe!libtorrent::aux::session_impl::open_listen_port(void)  C++
    test-crow-libtorrent.exe!libtorrent::aux::session_impl::init(class boost::shared_ptr<struct libtorrent::settings_pack>) C++
    test-crow-libtorrent.exe!boost::_mfi::mf1<void,struct libtorrent::aux::session_impl,class boost::shared_ptr<struct libtorrent::settings_pack> >::operator()(struct libtorrent::aux::session_impl *,class boost::shared_ptr<struct libtorrent::settings_pack>)   C++
    test-crow-libtorrent.exe!boost::asio::asio_handler_invoke<class boost::_bi::bind_t<void,class boost::_mfi::mf1<void,struct libtorrent::aux::session_impl,class boost::shared_ptr<struct libtorrent::settings_pack> >,class boost::_bi::list2<class boost::_bi::value<struct libtorrent::aux::session_impl *>,class boost::_bi::value<class boost::shared_ptr<struct libtorrent::settings_pack> > > > >(class boost::_bi::bind_t<void,class boost::_mfi::mf1<void,struct libtorrent::aux::session_impl,class boost::shared_ptr<struct libtorrent::settings_pack> >,class boost::_bi::list2<class boost::_bi::value<struct libtorrent::aux::session_impl *>,class boost::_bi::value<class boost::shared_ptr<struct libtorrent::settings_pack> > > > &,...)    C++
    test-crow-libtorrent.exe!boost::asio::detail::completion_handler<class boost::_bi::bind_t<void,class boost::_mfi::mf1<void,struct libtorrent::aux::session_impl,class boost::shared_ptr<struct libtorrent::settings_pack> >,class boost::_bi::list2<class boost::_bi::value<struct libtorrent::aux::session_impl *>,class boost::_bi::value<class boost::shared_ptr<struct libtorrent::settings_pack> > > > >::do_complete(class boost::asio::detail::win_iocp_io_service *,class boost::asio::detail::win_iocp_operation *,class boost::system::error_code const &,unsigned int)   C++
    test-crow-libtorrent.exe!boost::asio::detail::win_iocp_io_service::do_one(bool,class boost::system::error_code &)   C++
    test-crow-libtorrent.exe!boost::asio::detail::win_iocp_io_service::run(class boost::system::error_code &)   C++
    test-crow-libtorrent.exe!boost::asio::io_service::run(void) C++
    test-crow-libtorrent.exe!thread_start<unsigned int (__stdcall*)(void *)>(void * const parameter) Line 115   C++
    kernel32.dll!@BaseThreadInitThunk@12�() Unknown
    ntdll.dll!__RtlUserThreadStart()    Unknown
    ntdll.dll!__RtlUserThreadStart@8�() Unknown

libtorrent 编译选项:

toolset=msvc-14.0 boost-link=static dht=on encryption=on mutable-torrents=on crypto=openssl openssl-version=1.1 link=static runtime-link=static variant=debug,release i2p=on

崩溃仅发生在发布版本上。

谁能帮帮我?

【问题讨论】:

【参考方案1】:

这很可能是由于使用链接不兼容选项构建 libtorrent 和您的测试应用程序造成的。如果 libtorrent 静态链接到运行时,您有责任确保任何链接到它的内容也可以。

或者,您可以使用适当的构建工具来强制链接兼容性(例如 boost-build)。

【讨论】:

【参考方案2】:

问题出在预处理器上。使用 boost-build 以外的工具构建应用程序(使用 libtorrent)时需要添加 BOOST_ASIO_ENABLE_CANCELIO

Here你可以找到关于这个问题的更多信息。

【讨论】:

以上是关于libtorrent 和 tcp::acceptor 在 Windows 上因访问冲突而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

libtorrent-rasterbar 和 QGuiApplication 导致内存损坏

libtorrent 内置跟踪器 [关闭]

从 libtorrent 中的 url 种子低速下载

使用 libtorrent (rasterbar) 获取上传活动警报

libtorrent 无法使用 VS2005 构建

pip install python-libtorrent==1.1.0 在 linux 上失败