我需要一些帮助来解决这个异常,我正在实现一个 NPAPI 插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用 Firebreath 框架。
对于套接字和连接,我使用带有异步调用和 5 个工作线程的线程池的 Boost asio。我也有每个线程的最后期限来实现传输超时。
我的插件扩展工作流程如下:
- 打开套接字 1(这将启动 async_receive 和截止日期 async_wait)
- 写入套接字 1
得到回应 1
打开另一个套接字 2
写入套接字 2
写入套接字 1
关闭套接字 1(socket.cancel()、deadline.cancel()、socket.shutdown()、套接字释放)。
得到回应 2
- 写入套接字 2
- 关闭套接字 2
由于一切都是跨语言的,异步确实很难调试,但所有打开、写入或关闭都是从 javascript 调用的,而从套接字 1 读取的调用按顺序调用 open 2、write 2、write 1 和 close 1。
也许我所说的一切都是无关的,因为抛出异常时的调用堆栈不会显示我的任何函数,而只会显示它在malloc
调用的内部_heap_alloc_dbg_impl
因为它通常在第 2 或第 3 个完整周期中失败,并且似乎发生在第 5 步和第 7 步之间。
但是,我认为它必须与 asio 相关,因为使用单个工作线程执行所有操作只会在第一个周期出现异常而崩溃。
如果您需要,我愿意发布更多信息代码。
更新1:
更新 2:
启动了 10 个线程:
workPtr.reset( new boost::asio::io_service::work(io_service));
for ( int i = 0; i < 10; ++i) {
m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &io_service) );
}
第11个_threadstartex 不知道是谁发起的
在另一个线程上(不是 VS 声称导致崩溃的线程)有一个join_all()
进程,因为我的类正在被破坏,但我认为它不应该,所以这个崩溃可能是由于另一个异常和 Firebreath 进程关闭一切当它崩溃时。