7

我需要一些帮助来解决这个异常,我正在实现一个 NPAPI 插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用 Firebreath 框架。

对于套接字和连接,我使用带有异步调用和 5 个工作线程的线程池的 Boost asio。我也有每个线程的最后期限来实现传输超时。

我的插件扩展工作流程如下:

  1. 打开套接字 1(这将启动 async_receive 和截止日期 async_wait)
  2. 写入套接字 1
  3. 得到回应 1

  4. 打开另一个套接字 2

  5. 写入套接字 2

  6. 写入套接字 1

  7. 关闭套接字 1(socket.cancel()、deadline.cancel()、socket.shutdown()、套接字释放)。

  8. 得到回应 2

  9. 写入套接字 2
  10. 关闭套接字 2

由于一切都是跨语言的,异步确实很难调试,但所有打开、写入或关闭都是从 javascript 调用的,而从套接字 1 读取的调用按顺序调用 open 2、write 2、write 1 和 close 1。

也许我所说的一切都是无关的,因为抛出异常时的调用堆栈不会显示我的任何函数,而只会显示它在malloc调用的内部_heap_alloc_dbg_impl

因为它通常在第 2 或第 3 个完整周期中失败,并且似乎发生在第 5 步和第 7 步之间。

但是,我认为它必须与 asio 相关,因为使用单个工作线程执行所有操作只会在第一个周期出现异常而崩溃。

如果您需要,我愿意发布更多信息代码。

更新1:

VS 断裂时

更新 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 进程关闭一切当它崩溃时。

4

1 回答 1

12

我通过继续检查其他线程发现了错误。我发现 Firebreath 调用的我的主要课程正在被销毁。再检查一下,我发现这完全是我的错我有一个类来存储需要在主体类中使用函数的套接字信息(我不喜欢它,但这是我发现使用它的唯一方法)所以我shared_ptr在校长班上加了一个。因此,如果它在销毁这些SocketInfo对象之后,因为没有其他对象,ptr ref 计数达到 0,并且主体类被销毁。

有趣的是,套接字通常在使用后正常关闭,所以我看不出为什么在没有打开套接字时没有触发它,并且只有在连续打开和关闭 2 个套接字时才会发生这种情况。

无论如何,我shared_from_this在截止日期处理程序上也有一个错误,但这似乎无关紧要。

现在它似乎可以在任意数量的线程中正常工作。

于 2013-03-21T18:55:43.057 回答