【发布时间】:2013-03-11 08:21:18
【问题描述】:
我需要一些关于这个异常的帮助,我正在实现一个 NPAPI 插件,以便能够使用来自浏览器扩展的本地套接字,为此我正在使用 Firebreath 框架。
对于套接字和连接,我使用带有异步调用和 5 个工作线程的线程池的 Boost asio。 我也有每个线程的最后期限来实现传输超时。
我的插件扩展工作流程是这样的:
- 打开套接字 1(这将启动 async_receive 和截止日期 async_wait)
- 在套接字 1 中写入
获取响应 1
打开另一个套接字 2
写入socket 2
写入套接字 1
关闭套接字 1 (socket.cancel()、deadline.cancel()、socket.shutdown()、socket 发布)。
获取响应 2
- 写socket 2
- 关闭插座 2
由于一切都是跨语言的,异步确实很难调试,但所有打开、写入或关闭都是从 javascript 调用的,而从套接字 1 读取的调用按顺序调用 open 2、write 2、write 1 和 close 1。
也许我所说的一切都是不相关的,因为抛出异常时的调用堆栈不会显示我的任何函数,而只会显示它位于调用 _heap_alloc_dbg_impl 的 malloc 内
因为它通常在第 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