【问题标题】:boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> >boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> >
【发布时间】:2013-03-11 08:21:18
【问题描述】:

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

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

我的插件扩展工作流程是这样的:

  1. 打开套接字 1(这将启动 async_receive 和截止日期 async_wait)
  2. 在套接字 1 中写入
  3. 获取响应 1

  4. 打开另一个套接字 2

  5. 写入socket 2

  6. 写入套接字 1

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

  8. 获取响应 2

  9. 写socket 2
  10. 关闭插座 2

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

也许我所说的一切都是不相关的,因为抛出异常时的调用堆栈不会显示我的任何函数,而只会显示它位于调用 _heap_alloc_dbg_implmalloc

因为它通常在第 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 进程在崩溃时关闭所有内容。

【问题讨论】:

  • 哪里抛出了异常?贴一些代码。
  • 有多少个工作线程?您开始的线程似乎永远不会完成。
  • 添加了带有代码、调用堆栈和线程的图像。我看不到异常,我只是收到有关异常的消息,其中包含中断或继续选项,当我中断这是状态时,请注意调用堆栈中没有我的代码框架(我的类是 SocketInfo , SocketsApi, Base64),在另一个线程上很明显 npapi 对象它已被破坏并且它正在执行 {m_threadGroup.join_all();} 但它不应该在那时被破坏,所以也许 VS 一个接一个地被破坏异常导致插件开始销毁,我不知道FB是如何工作的

标签: c++ visual-c++ boost-asio boost-thread firebreath


【解决方案1】:

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

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

无论如何,我在截止日期处理程序中也遇到了shared_from_this 错误,但这似乎无关紧要。

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

【讨论】:

  • 我编辑了这个以消除道歉的语气,所以鼓励回答你自己的问题。所以 +1 的答案有望帮助其他人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2011-12-17
  • 2021-11-07
  • 2011-07-11
相关资源
最近更新 更多